mirror of
https://github.com/moparisthebest/wget
synced 2024-07-03 16:38:41 -04:00
[svn] Correctly calculate bandwidth as total data read divided with download
time.
This commit is contained in:
parent
53f5f3e486
commit
a8155e7bcc
@ -1,3 +1,13 @@
|
|||||||
|
2003-12-06 Hrvoje Niksic <hniksic@xemacs.org>
|
||||||
|
|
||||||
|
* ftp.c (getftp): Ditto.
|
||||||
|
|
||||||
|
* http.c (gethttp): Correctly calculate bandwidth as total data
|
||||||
|
read divided with download time.
|
||||||
|
|
||||||
|
* retr.c (fd_read_body): Separate the return values for data
|
||||||
|
written and read.
|
||||||
|
|
||||||
2003-12-05 Hrvoje Niksic <hniksic@xemacs.org>
|
2003-12-05 Hrvoje Niksic <hniksic@xemacs.org>
|
||||||
|
|
||||||
* http.c (H_REDIRECTED): Respect the HTTP/1.1 "303 See Other"
|
* http.c (H_REDIRECTED): Respect the HTTP/1.1 "303 See Other"
|
||||||
|
@ -246,6 +246,7 @@ getftp (struct url *u, long *len, long restval, ccon *con)
|
|||||||
long expected_bytes = 0L;
|
long expected_bytes = 0L;
|
||||||
int rest_failed = 0;
|
int rest_failed = 0;
|
||||||
int flags;
|
int flags;
|
||||||
|
long rd_size;
|
||||||
|
|
||||||
assert (con != NULL);
|
assert (con != NULL);
|
||||||
assert (con->target != NULL);
|
assert (con->target != NULL);
|
||||||
@ -1000,13 +1001,14 @@ Error in server response, closing control connection.\n"));
|
|||||||
flags = 0;
|
flags = 0;
|
||||||
if (restval && rest_failed)
|
if (restval && rest_failed)
|
||||||
flags |= rb_skip_startpos;
|
flags |= rb_skip_startpos;
|
||||||
|
*len = restval;
|
||||||
|
rd_size = 0;
|
||||||
res = fd_read_body (dtsock, fp,
|
res = fd_read_body (dtsock, fp,
|
||||||
expected_bytes ? expected_bytes - restval : 0,
|
expected_bytes ? expected_bytes - restval : 0,
|
||||||
restval, len, &con->dltime, flags);
|
restval, &rd_size, len, &con->dltime, flags);
|
||||||
*len += restval;
|
|
||||||
|
|
||||||
tms = time_str (NULL);
|
tms = time_str (NULL);
|
||||||
tmrate = retr_rate (*len - restval, con->dltime, 0);
|
tmrate = retr_rate (rd_size, con->dltime, 0);
|
||||||
/* Close data connection socket. */
|
/* Close data connection socket. */
|
||||||
fd_close (dtsock);
|
fd_close (dtsock);
|
||||||
fd_close (local_sock);
|
fd_close (local_sock);
|
||||||
@ -1247,7 +1249,6 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con)
|
|||||||
/* Not as great. */
|
/* Not as great. */
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
/* Time? */
|
|
||||||
tms = time_str (NULL);
|
tms = time_str (NULL);
|
||||||
if (!opt.spider)
|
if (!opt.spider)
|
||||||
tmrate = retr_rate (len - restval, con->dltime, 0);
|
tmrate = retr_rate (len - restval, con->dltime, 0);
|
||||||
|
11
src/http.c
11
src/http.c
@ -982,7 +982,8 @@ struct http_stat
|
|||||||
char *remote_time; /* remote time-stamp string */
|
char *remote_time; /* remote time-stamp string */
|
||||||
char *error; /* textual HTTP error */
|
char *error; /* textual HTTP error */
|
||||||
int statcode; /* status code */
|
int statcode; /* status code */
|
||||||
double dltime; /* time of the download in msecs */
|
long rd_size; /* amount of data read from socket */
|
||||||
|
double dltime; /* time it took to download the data */
|
||||||
const char *referer; /* value of the referer header. */
|
const char *referer; /* value of the referer header. */
|
||||||
char **local_file; /* local file. */
|
char **local_file; /* local file. */
|
||||||
};
|
};
|
||||||
@ -1718,9 +1719,11 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
|
|||||||
flags |= rb_read_exactly;
|
flags |= rb_read_exactly;
|
||||||
if (hs->restval > 0 && contrange == 0)
|
if (hs->restval > 0 && contrange == 0)
|
||||||
flags |= rb_skip_startpos;
|
flags |= rb_skip_startpos;
|
||||||
|
hs->len = hs->restval;
|
||||||
|
hs->rd_size = 0;
|
||||||
hs->res = fd_read_body (sock, fp, contlen != -1 ? contlen : 0,
|
hs->res = fd_read_body (sock, fp, contlen != -1 ? contlen : 0,
|
||||||
hs->restval, &hs->len, &hs->dltime, flags);
|
hs->restval, &hs->rd_size, &hs->len, &hs->dltime,
|
||||||
hs->len += hs->restval;
|
flags);
|
||||||
|
|
||||||
if (hs->res >= 0)
|
if (hs->res >= 0)
|
||||||
CLOSE_FINISH (sock);
|
CLOSE_FINISH (sock);
|
||||||
@ -2122,7 +2125,7 @@ The sizes do not match (local %ld) -- retrieving.\n"), local_size);
|
|||||||
return RETROK;
|
return RETROK;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmrate = retr_rate (hstat.len - hstat.restval, hstat.dltime, 0);
|
tmrate = retr_rate (hstat.rd_size, hstat.dltime, 0);
|
||||||
|
|
||||||
if (hstat.len == hstat.contlen)
|
if (hstat.len == hstat.contlen)
|
||||||
{
|
{
|
||||||
|
44
src/retr.c
44
src/retr.c
@ -143,7 +143,7 @@ limit_bandwidth (long bytes, struct wget_timer *timer)
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
write_data (FILE *out, const char *buf, int bufsize, long *skip,
|
write_data (FILE *out, const char *buf, int bufsize, long *skip,
|
||||||
long *transferred)
|
long *written)
|
||||||
{
|
{
|
||||||
if (!out)
|
if (!out)
|
||||||
return 1;
|
return 1;
|
||||||
@ -160,8 +160,9 @@ write_data (FILE *out, const char *buf, int bufsize, long *skip,
|
|||||||
if (bufsize == 0)
|
if (bufsize == 0)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
*transferred += bufsize;
|
|
||||||
fwrite (buf, 1, bufsize, out);
|
fwrite (buf, 1, bufsize, out);
|
||||||
|
*written += bufsize;
|
||||||
|
|
||||||
/* Immediately flush the downloaded data. This should not hinder
|
/* Immediately flush the downloaded data. This should not hinder
|
||||||
performance: fast downloads will arrive in large 16K chunks
|
performance: fast downloads will arrive in large 16K chunks
|
||||||
@ -180,9 +181,11 @@ write_data (FILE *out, const char *buf, int bufsize, long *skip,
|
|||||||
by the progress gauge.
|
by the progress gauge.
|
||||||
|
|
||||||
STARTPOS is the position from which the download starts, used by
|
STARTPOS is the position from which the download starts, used by
|
||||||
the progress gauge. The amount of data read gets stored to
|
the progress gauge. If QTYREAD is non-NULL, the value it points to
|
||||||
*TRANSFERRED. The time it took to download the data (in
|
is incremented by the amount of data read from the network. If
|
||||||
milliseconds) is stored to *ELAPSED.
|
QTYWRITTEN is non-NULL, the value it points to is incremented by
|
||||||
|
the amount of data written to disk. The time it took to download
|
||||||
|
the data (in milliseconds) is stored to ELAPSED.
|
||||||
|
|
||||||
The function exits and returns the amount of data read. In case of
|
The function exits and returns the amount of data read. In case of
|
||||||
error while reading data, -1 is returned. In case of error while
|
error while reading data, -1 is returned. In case of error while
|
||||||
@ -190,7 +193,7 @@ write_data (FILE *out, const char *buf, int bufsize, long *skip,
|
|||||||
|
|
||||||
int
|
int
|
||||||
fd_read_body (int fd, FILE *out, long toread, long startpos,
|
fd_read_body (int fd, FILE *out, long toread, long startpos,
|
||||||
long *transferred, double *elapsed, int flags)
|
long *qtyread, long *qtywritten, double *elapsed, int flags)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -212,11 +215,10 @@ fd_read_body (int fd, FILE *out, long toread, long startpos,
|
|||||||
int exact = flags & rb_read_exactly;
|
int exact = flags & rb_read_exactly;
|
||||||
long skip = 0;
|
long skip = 0;
|
||||||
|
|
||||||
/* How much data we've read. This is used internally and is
|
/* How much data we've read/written. */
|
||||||
unaffected by skipping STARTPOS. */
|
long sum_read = 0;
|
||||||
long total_read = 0;
|
long sum_written = 0;
|
||||||
|
|
||||||
*transferred = 0;
|
|
||||||
if (flags & rb_skip_startpos)
|
if (flags & rb_skip_startpos)
|
||||||
skip = startpos;
|
skip = startpos;
|
||||||
|
|
||||||
@ -251,9 +253,9 @@ fd_read_body (int fd, FILE *out, long toread, long startpos,
|
|||||||
means that it is unknown how much data is to arrive. However, if
|
means that it is unknown how much data is to arrive. However, if
|
||||||
EXACT is set, then toread==0 means what it says: that no data
|
EXACT is set, then toread==0 means what it says: that no data
|
||||||
should be read. */
|
should be read. */
|
||||||
while (!exact || (total_read < toread))
|
while (!exact || (sum_read < toread))
|
||||||
{
|
{
|
||||||
int rdsize = exact ? MIN (toread - total_read, dlbufsize) : dlbufsize;
|
int rdsize = exact ? MIN (toread - sum_read, dlbufsize) : dlbufsize;
|
||||||
double tmout = opt.read_timeout;
|
double tmout = opt.read_timeout;
|
||||||
if (progress_interactive)
|
if (progress_interactive)
|
||||||
{
|
{
|
||||||
@ -265,7 +267,7 @@ fd_read_body (int fd, FILE *out, long toread, long startpos,
|
|||||||
waittm = (wtimer_read (timer) - last_successful_read_tm) / 1000;
|
waittm = (wtimer_read (timer) - last_successful_read_tm) / 1000;
|
||||||
if (waittm + tmout > opt.read_timeout)
|
if (waittm + tmout > opt.read_timeout)
|
||||||
{
|
{
|
||||||
/* Don't allow waiting time to exceed read timeout. */
|
/* Don't let total idle time exceed read timeout. */
|
||||||
tmout = opt.read_timeout - waittm;
|
tmout = opt.read_timeout - waittm;
|
||||||
if (tmout < 0)
|
if (tmout < 0)
|
||||||
{
|
{
|
||||||
@ -278,9 +280,9 @@ fd_read_body (int fd, FILE *out, long toread, long startpos,
|
|||||||
ret = fd_read (fd, dlbuf, rdsize, tmout);
|
ret = fd_read (fd, dlbuf, rdsize, tmout);
|
||||||
|
|
||||||
if (ret == 0 || (ret < 0 && errno != ETIMEDOUT))
|
if (ret == 0 || (ret < 0 && errno != ETIMEDOUT))
|
||||||
break;
|
break; /* read error */
|
||||||
else if (ret < 0)
|
else if (ret < 0)
|
||||||
ret = 0; /* timeout */
|
ret = 0; /* read timeout */
|
||||||
|
|
||||||
if (progress || opt.limit_rate)
|
if (progress || opt.limit_rate)
|
||||||
{
|
{
|
||||||
@ -291,8 +293,8 @@ fd_read_body (int fd, FILE *out, long toread, long startpos,
|
|||||||
|
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
{
|
{
|
||||||
total_read += ret;
|
sum_read += ret;
|
||||||
if (!write_data (out, dlbuf, ret, &skip, transferred))
|
if (!write_data (out, dlbuf, ret, &skip, &sum_written))
|
||||||
{
|
{
|
||||||
ret = -2;
|
ret = -2;
|
||||||
goto out;
|
goto out;
|
||||||
@ -307,7 +309,7 @@ fd_read_body (int fd, FILE *out, long toread, long startpos,
|
|||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
if (toread > 0)
|
if (toread > 0)
|
||||||
ws_percenttitle (100.0 *
|
ws_percenttitle (100.0 *
|
||||||
(startpos + total_read) / (startpos + toread));
|
(startpos + sum_read) / (startpos + toread));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (ret < -1)
|
if (ret < -1)
|
||||||
@ -316,11 +318,17 @@ fd_read_body (int fd, FILE *out, long toread, long startpos,
|
|||||||
out:
|
out:
|
||||||
if (progress)
|
if (progress)
|
||||||
progress_finish (progress, wtimer_read (timer));
|
progress_finish (progress, wtimer_read (timer));
|
||||||
|
|
||||||
if (elapsed)
|
if (elapsed)
|
||||||
*elapsed = wtimer_read (timer);
|
*elapsed = wtimer_read (timer);
|
||||||
if (timer)
|
if (timer)
|
||||||
wtimer_delete (timer);
|
wtimer_delete (timer);
|
||||||
|
|
||||||
|
if (qtyread)
|
||||||
|
*qtyread += sum_read;
|
||||||
|
if (qtywritten)
|
||||||
|
*qtywritten += sum_written;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +36,8 @@ enum {
|
|||||||
rb_skip_startpos = 2
|
rb_skip_startpos = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
int fd_read_body PARAMS ((int, FILE *, long, long, long *, double *, int));
|
int fd_read_body PARAMS ((int, FILE *, long, long, long *, long *, double *,
|
||||||
|
int));
|
||||||
|
|
||||||
typedef const char *(*hunk_terminator_t) PARAMS ((const char *, int, int));
|
typedef const char *(*hunk_terminator_t) PARAMS ((const char *, int, int));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user