1
0
mirror of https://github.com/moparisthebest/wget synced 2024-07-03 16:38:41 -04:00

[svn] Enabled separation of different timeout values.

This commit is contained in:
hniksic 2003-09-20 21:41:55 -07:00
parent b8e416c6c7
commit 51a8e9fa50
8 changed files with 69 additions and 25 deletions

4
NEWS
View File

@ -15,7 +15,9 @@ send a POST request with the specified contents.
** The `--timeout' option now affects DNS lookup and establishing the ** The `--timeout' option now affects DNS lookup and establishing the
connection as well. Previously it only affected reading and writing connection as well. Previously it only affected reading and writing
data. data. Those three timeouts can be set separately using
`--dns-timeout', `--connection-timeout', and `--read-timeout',
respectively.
** Download speed shown by the progress bar is based on the data ** Download speed shown by the progress bar is based on the data
recently read, rather than the average speed of the entire download. recently read, rather than the average speed of the entire download.

View File

@ -1,3 +1,11 @@
2003-09-21 Hrvoje Niksic <hniksic@xemacs.org>
* connect.c (connect_with_timeout): Made timeout type double.
* options.h (struct options): New members read_timeout,
dns_timeout, and connect_timeout.
Use them.
2003-09-21 Hrvoje Niksic <hniksic@xemacs.org> 2003-09-21 Hrvoje Niksic <hniksic@xemacs.org>
* init.c (simple_atof): New function. * init.c (simple_atof): New function.

View File

@ -117,7 +117,7 @@ connect_with_timeout_callback (void *arg)
static int static int
connect_with_timeout (int fd, const struct sockaddr *addr, int addrlen, connect_with_timeout (int fd, const struct sockaddr *addr, int addrlen,
int timeout) double timeout)
{ {
struct cwt_context ctx; struct cwt_context ctx;
ctx.fd = fd; ctx.fd = fd;
@ -205,7 +205,8 @@ connect_to_one (ip_address *addr, unsigned short port, int silent)
} }
/* Connect the socket to the remote host. */ /* Connect the socket to the remote host. */
if (connect_with_timeout (sock, &sa.sa, sockaddr_len (), opt.timeout) < 0) if (connect_with_timeout (sock, &sa.sa, sockaddr_len (),
opt.connect_timeout) < 0)
{ {
close (sock); close (sock);
sock = -1; sock = -1;
@ -385,15 +386,15 @@ select_fd (int fd, double maxtime, int writep)
/* Call accept() on MSOCK and store the result to *SOCK. This assumes /* Call accept() on MSOCK and store the result to *SOCK. This assumes
that bindport() has been used to initialize MSOCK to a correct that bindport() has been used to initialize MSOCK to a correct
value. It blocks the caller until a connection is established. If value. It blocks the caller until a connection is established. If
no connection is established for OPT.TIMEOUT seconds, the function no connection is established for OPT.CONNECT_TIMEOUT seconds, the
exits with an error status. */ function exits with an error status. */
uerr_t uerr_t
acceptport (int *sock) acceptport (int *sock)
{ {
int addrlen = sockaddr_len (); int addrlen = sockaddr_len ();
#ifdef HAVE_SELECT #ifdef HAVE_SELECT
if (select_fd (msock, opt.timeout, 0) <= 0) if (select_fd (msock, opt.connect_timeout, 0) <= 0)
return ACCEPTERR; return ACCEPTERR;
#endif #endif
if ((*sock = accept (msock, addr, &addrlen)) < 0) if ((*sock = accept (msock, addr, &addrlen)) < 0)
@ -447,7 +448,7 @@ conaddr (int fd, ip_address *ip)
/* Read at most LEN bytes from FD, storing them to BUF. This is /* Read at most LEN bytes from FD, storing them to BUF. This is
virtually the same as read(), but takes care of EINTR braindamage virtually the same as read(), but takes care of EINTR braindamage
and uses select() to timeout the stale connections (a connection is and uses select() to timeout the stale connections (a connection is
stale if more than OPT.TIMEOUT time is spent in select() or stale if more than OPT.READ_TIMEOUT time is spent in select() or
read()). */ read()). */
int int
@ -456,8 +457,8 @@ iread (int fd, char *buf, int len)
int res; int res;
#ifdef HAVE_SELECT #ifdef HAVE_SELECT
if (opt.timeout) if (opt.read_timeout)
if (select_fd (fd, opt.timeout, 0) <= 0) if (select_fd (fd, opt.read_timeout, 0) <= 0)
return -1; return -1;
#endif #endif
do do
@ -484,8 +485,8 @@ iwrite (int fd, char *buf, int len)
while (len > 0) while (len > 0)
{ {
#ifdef HAVE_SELECT #ifdef HAVE_SELECT
if (opt.timeout) if (opt.read_timeout)
if (select_fd (fd, opt.timeout, 1) <= 0) if (select_fd (fd, opt.read_timeout, 1) <= 0)
return -1; return -1;
#endif #endif
do do

View File

@ -317,8 +317,8 @@ ssl_iread (SSL *con, char *buf, int len)
int res, fd; int res, fd;
BIO_get_fd (con->rbio, &fd); BIO_get_fd (con->rbio, &fd);
#ifdef HAVE_SELECT #ifdef HAVE_SELECT
if (opt.timeout && !SSL_pending (con)) if (opt.read_timeout && !SSL_pending (con))
if (select_fd (fd, opt.timeout, 0) <= 0) if (select_fd (fd, opt.read_timeout, 0) <= 0)
return -1; return -1;
#endif #endif
do do
@ -343,8 +343,8 @@ ssl_iwrite (SSL *con, char *buf, int len)
while (len > 0) while (len > 0)
{ {
#ifdef HAVE_SELECT #ifdef HAVE_SELECT
if (opt.timeout) if (opt.read_timeout)
if (select_fd (fd, opt.timeout, 1) <= 0) if (select_fd (fd, opt.read_timeout, 1) <= 0)
return -1; return -1;
#endif #endif
do do

View File

@ -656,7 +656,7 @@ lookup_host (const char *host, int silent)
else else
hints.ai_family = PF_UNSPEC; hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
err = getaddrinfo_with_timeout (host, NULL, &hints, &ai, opt.timeout); err = getaddrinfo_with_timeout (host, NULL, &hints, &ai, opt.dns_timeout);
if (err != 0 || ai == NULL) if (err != 0 || ai == NULL)
{ {
@ -671,7 +671,7 @@ lookup_host (const char *host, int silent)
#else #else
{ {
struct hostent *hptr; struct hostent *hptr;
hptr = gethostbyname_with_timeout (host, opt.timeout); hptr = gethostbyname_with_timeout (host, opt.dns_timeout);
if (!hptr) if (!hptr)
{ {
if (!silent) if (!silent)

View File

@ -102,6 +102,7 @@ CMD_DECLARE (cmd_spec_mirror);
CMD_DECLARE (cmd_spec_progress); CMD_DECLARE (cmd_spec_progress);
CMD_DECLARE (cmd_spec_recursive); CMD_DECLARE (cmd_spec_recursive);
CMD_DECLARE (cmd_spec_restrict_file_names); CMD_DECLARE (cmd_spec_restrict_file_names);
CMD_DECLARE (cmd_spec_timeout);
CMD_DECLARE (cmd_spec_useragent); CMD_DECLARE (cmd_spec_useragent);
/* List of recognized commands, each consisting of name, closure and function. /* List of recognized commands, each consisting of name, closure and function.
@ -123,6 +124,7 @@ static struct {
{ "base", &opt.base_href, cmd_string }, { "base", &opt.base_href, cmd_string },
{ "bindaddress", &opt.bind_address, cmd_string }, { "bindaddress", &opt.bind_address, cmd_string },
{ "cache", &opt.allow_cache, cmd_boolean }, { "cache", &opt.allow_cache, cmd_boolean },
{ "connecttimeout", &opt.connect_timeout, cmd_time },
{ "continue", &opt.always_rest, cmd_boolean }, { "continue", &opt.always_rest, cmd_boolean },
{ "convertlinks", &opt.convert_links, cmd_boolean }, { "convertlinks", &opt.convert_links, cmd_boolean },
{ "cookies", &opt.cookies, cmd_boolean }, { "cookies", &opt.cookies, cmd_boolean },
@ -134,6 +136,7 @@ static struct {
{ "dirprefix", &opt.dir_prefix, cmd_directory }, { "dirprefix", &opt.dir_prefix, cmd_directory },
{ "dirstruct", NULL, cmd_spec_dirstruct }, { "dirstruct", NULL, cmd_spec_dirstruct },
{ "dnscache", &opt.dns_cache, cmd_boolean }, { "dnscache", &opt.dns_cache, cmd_boolean },
{ "dnstimeout", &opt.dns_timeout, cmd_time },
{ "domains", &opt.domains, cmd_vector }, { "domains", &opt.domains, cmd_vector },
{ "dotbytes", &opt.dot_bytes, cmd_bytes }, { "dotbytes", &opt.dot_bytes, cmd_bytes },
{ "dotsinline", &opt.dots_in_line, cmd_number }, { "dotsinline", &opt.dots_in_line, cmd_number },
@ -184,6 +187,7 @@ static struct {
{ "quiet", &opt.quiet, cmd_boolean }, { "quiet", &opt.quiet, cmd_boolean },
{ "quota", &opt.quota, cmd_bytes }, { "quota", &opt.quota, cmd_bytes },
{ "randomwait", &opt.random_wait, cmd_boolean }, { "randomwait", &opt.random_wait, cmd_boolean },
{ "readtimeout", &opt.read_timeout, cmd_time },
{ "reclevel", &opt.reclevel, cmd_number_inf }, { "reclevel", &opt.reclevel, cmd_number_inf },
{ "recursive", NULL, cmd_spec_recursive }, { "recursive", NULL, cmd_spec_recursive },
{ "referer", &opt.referer, cmd_string }, { "referer", &opt.referer, cmd_string },
@ -209,7 +213,7 @@ static struct {
{ "sslprotocol", &opt.sslprotocol, cmd_number }, { "sslprotocol", &opt.sslprotocol, cmd_number },
#endif /* HAVE_SSL */ #endif /* HAVE_SSL */
{ "strictcomments", &opt.strict_comments, cmd_boolean }, { "strictcomments", &opt.strict_comments, cmd_boolean },
{ "timeout", &opt.timeout, cmd_time }, { "timeout", NULL, cmd_spec_timeout },
{ "timestamping", &opt.timestamping, cmd_boolean }, { "timestamping", &opt.timestamping, cmd_boolean },
{ "tries", &opt.ntry, cmd_number_inf }, { "tries", &opt.ntry, cmd_number_inf },
{ "useproxy", &opt.use_proxy, cmd_boolean }, { "useproxy", &opt.use_proxy, cmd_boolean },
@ -272,9 +276,7 @@ defaults (void)
opt.no_proxy = sepstring (tmp); opt.no_proxy = sepstring (tmp);
opt.allow_cache = 1; opt.allow_cache = 1;
#ifdef HAVE_SELECT opt.read_timeout = 900;
opt.timeout = 900;
#endif
opt.use_robots = 1; opt.use_robots = 1;
opt.remove_listing = 1; opt.remove_listing = 1;
@ -1159,6 +1161,20 @@ cmd_spec_restrict_file_names (const char *com, const char *val, void *closure)
return 1; return 1;
} }
/* Set all three timeout values. */
static int
cmd_spec_timeout (const char *com, const char *val, void *closure)
{
double value;
if (!cmd_time (com, val, &value))
return 0;
opt.read_timeout = value;
opt.connect_timeout = value;
opt.dns_timeout = value;
return 1;
}
static int static int
cmd_spec_useragent (const char *com, const char *val, void *closure) cmd_spec_useragent (const char *com, const char *val, void *closure)
{ {

View File

@ -170,7 +170,10 @@ Download:\n\
-N, --timestamping don\'t re-retrieve files unless newer than local.\n\ -N, --timestamping don\'t re-retrieve files unless newer than local.\n\
-S, --server-response print server response.\n\ -S, --server-response print server response.\n\
--spider don\'t download anything.\n\ --spider don\'t download anything.\n\
-T, --timeout=SECONDS set the read timeout to SECONDS.\n\ -T, --timeout=SECONDS set all timeout values to SECONDS.\n\
--dns-timeout=SECS set the DNS lookup timeout to SECS.\n\
--connect-timeout=SECS set the connect timeout to SECS.\n\
--read-timeout=SECS set the read timeout to SECS.\n\
-w, --wait=SECONDS wait SECONDS between retrievals.\n\ -w, --wait=SECONDS wait SECONDS between retrievals.\n\
--waitretry=SECONDS wait 1...SECONDS between retries of a retrieval.\n\ --waitretry=SECONDS wait 1...SECONDS between retries of a retrieval.\n\
--random-wait wait from 0...2*WAIT secs between retrievals.\n\ --random-wait wait from 0...2*WAIT secs between retrievals.\n\
@ -315,8 +318,10 @@ main (int argc, char *const *argv)
{ "base", required_argument, NULL, 'B' }, { "base", required_argument, NULL, 'B' },
{ "bind-address", required_argument, NULL, 155 }, { "bind-address", required_argument, NULL, 155 },
{ "cache", required_argument, NULL, 'C' }, { "cache", required_argument, NULL, 'C' },
{ "connect-timeout", required_argument, NULL, 180 },
{ "cookies", required_argument, NULL, 160 }, { "cookies", required_argument, NULL, 160 },
{ "cut-dirs", required_argument, NULL, 145 }, { "cut-dirs", required_argument, NULL, 145 },
{ "dns-timeout", required_argument, NULL, 178 },
{ "directory-prefix", required_argument, NULL, 'P' }, { "directory-prefix", required_argument, NULL, 'P' },
{ "dns-cache", required_argument, NULL, 175 }, { "dns-cache", required_argument, NULL, 175 },
{ "domains", required_argument, NULL, 'D' }, { "domains", required_argument, NULL, 'D' },
@ -346,6 +351,7 @@ main (int argc, char *const *argv)
{ "proxy-passwd", required_argument, NULL, 144 }, { "proxy-passwd", required_argument, NULL, 144 },
{ "proxy-user", required_argument, NULL, 143 }, { "proxy-user", required_argument, NULL, 143 },
{ "quota", required_argument, NULL, 'Q' }, { "quota", required_argument, NULL, 'Q' },
{ "read-timeout", required_argument, NULL, 179 },
{ "reject", required_argument, NULL, 'R' }, { "reject", required_argument, NULL, 'R' },
{ "restrict-file-names", required_argument, NULL, 176 }, { "restrict-file-names", required_argument, NULL, 176 },
{ "save-cookies", required_argument, NULL, 162 }, { "save-cookies", required_argument, NULL, 162 },
@ -620,6 +626,15 @@ GNU General Public License for more details.\n"));
case 176: case 176:
setoptval ("restrictfilenames", optarg); setoptval ("restrictfilenames", optarg);
break; break;
case 178:
setoptval ("dnstimeout", optarg);
break;
case 179:
setoptval ("readtimeout", optarg);
break;
case 180:
setoptval ("connecttimeout", optarg);
break;
case 'A': case 'A':
setoptval ("accept", optarg); setoptval ("accept", optarg);
break; break;

View File

@ -107,9 +107,11 @@ struct options
char *progress_type; /* progress indicator type. */ char *progress_type; /* progress indicator type. */
char *proxy_user; /*oli*/ char *proxy_user; /*oli*/
char *proxy_passwd; char *proxy_passwd;
#ifdef HAVE_SELECT
double timeout; /* The read/connect/DNS timeout. */ double read_timeout; /* The read/write timeout. */
#endif double dns_timeout; /* The DNS timeout. */
double connect_timeout; /* The connect timeout. */
int random_wait; /* vary from 0 .. wait secs by random()? */ int random_wait; /* vary from 0 .. wait secs by random()? */
double wait; /* The wait period between retrievals. */ double wait; /* The wait period between retrievals. */
double waitretry; /* The wait period between retries. - HEH */ double waitretry; /* The wait period between retries. - HEH */