diff --git a/src/http.c b/src/http.c index be5bbe9..1510ef7 100644 --- a/src/http.c +++ b/src/http.c @@ -1612,6 +1612,14 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy) contlen = parsed; } + /* Check if we should retry because of zero-length content*/ + + if (opt.http_retry_if_zero_lenght && (contlen <= 0)) + { + CLOSE_INVALIDATE(sock); + return ZEROLEN; + } + /* Check for keep-alive related responses. */ if (!inhibit_keep_alive && contlen != -1) { @@ -1702,6 +1710,13 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy) hs->error = xstrdup (message); xfree_null (message); + if (opt.http_retry_if_503 && statcode == HTTP_STATUS_UNAVAILABLE) + { + /* if statcode == 503 and we have option to retry on this error*/ + CLOSE_INVALIDATE (sock); + return TEMP_UNAVAIL; + } + type = resp_header_strdup (resp, "Content-Type"); if (type) { @@ -2205,7 +2220,8 @@ File `%s' already there; not retrieving.\n\n"), *hstat.local_file); { case HERR: case HEOF: case CONSOCKERR: case CONCLOSED: case CONERROR: case READERR: case WRITEFAILED: - case RANGEERR: case FOPEN_EXCL_ERR: + case RANGEERR: case FOPEN_EXCL_ERR: case TEMP_UNAVAIL: + case ZEROLEN: /* Non-fatal errors continue executing the loop, which will bring them to "while" statement at the end, to judge whether the number of tries was exceeded. */ diff --git a/src/init.c b/src/init.c index e6c87a8..d23fb7e 100644 --- a/src/init.c +++ b/src/init.c @@ -165,9 +165,11 @@ static struct { { "header", NULL, cmd_spec_header }, { "htmlextension", &opt.html_extension, cmd_boolean }, { "htmlify", NULL, cmd_spec_htmlify }, + { "http503retry", &opt.http_retry_if_503, cmd_boolean }, { "httpkeepalive", &opt.http_keep_alive, cmd_boolean }, { "httppasswd", &opt.http_passwd, cmd_string }, /* deprecated */ { "httppassword", &opt.http_passwd, cmd_string }, { "httpproxy", &opt.http_proxy, cmd_string }, + { "httpretryzerolen", &opt.http_retry_if_zero_lenght, cmd_boolean }, { "httpsproxy", &opt.https_proxy, cmd_string }, { "httpuser", &opt.http_user, cmd_string }, diff --git a/src/main.c b/src/main.c index f0864b8..1a74091 100644 --- a/src/main.c +++ b/src/main.c @@ -197,6 +197,8 @@ struct cmdline_option option_data[] = { "html-extension", 'E', OPT_BOOLEAN, "htmlextension", -1 }, { "htmlify", 0, OPT_BOOLEAN, "htmlify", -1 }, { "http-keep-alive", 0, OPT_BOOLEAN, "httpkeepalive", -1 }, + { "http-503-retry", 0, OPT_BOOLEAN, "http503retry", -1 }, + { "http-zero-len-retry", 0, OPT_BOOLEAN, "httpretryzerolen", -1 }, { "http-passwd", 0, OPT_VALUE, "httppassword", -1 }, /* deprecated */ { "http-password", 0, OPT_VALUE, "httppassword", -1 }, { "http-user", 0, OPT_VALUE, "httpuser", -1 }, @@ -514,6 +516,10 @@ HTTP options:\n"), N_("\ -E, --html-extension save HTML documents with `.html' extension.\n"), N_("\ + --http-503-retry retry if HTTP return code is 503.\n"), + N_("\ + --http-zero-len-retry retry if no `Content-Length' header, or if lenght is 0.\n"), + N_("\ --ignore-length ignore `Content-Length' header field.\n"), N_("\ --header=STRING insert STRING among the headers.\n"), diff --git a/src/options.h b/src/options.h index 714fd24..aa7d3de 100644 --- a/src/options.h +++ b/src/options.h @@ -91,6 +91,10 @@ struct options char *http_passwd; /* HTTP password. */ char **user_headers; /* User-defined header(s). */ bool http_keep_alive; /* whether we use keep-alive */ + int http_retry_if_503; /* whether we retry if http code is 503 */ + + int http_retry_if_zero_lenght; /* whether we should retry if no + content-lenght or it is 0 */ bool use_proxy; /* Do we use proxy? */ bool allow_cache; /* Do we allow server-side caching? */ diff --git a/src/wget.h b/src/wget.h index d32ef3f..ea2fae6 100644 --- a/src/wget.h +++ b/src/wget.h @@ -283,5 +283,6 @@ enum READERR, TRYLIMEXC, URLBADPATTERN, FILEBADFILE, RANGEERR, RETRBADPATTERN, RETNOTSUP, ROBOTSOK, NOROBOTS, PROXERR, /* 50 */ - AUTHFAILED, QUOTEXC, WRITEFAILED, SSLINITFAILED + AUTHFAILED, QUOTEXC, WRITEFAILED, SSLINITFAILED, ZEROLEN, + TEMP_UNAVAIL } uerr_t;