diff options
author | Daniel Stenberg <daniel@haxx.se> | 2019-08-06 11:30:08 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2019-08-07 14:45:39 +0200 |
commit | f933449d3b6c24e66d4a0c590bca3e7b2a39140d (patch) | |
tree | e12fce26c8357de4d04a48be83d90b6f5bee7cd0 /lib | |
parent | 2bdb26a507194e3fca08b3ed2a27becf222a517c (diff) |
CURLINFO_RETRY_AFTER: parse the Retry-After header value
This is only the libcurl part that provides the information. There's no
user of the parsed value. This change includes three new tests for the
parser.
Ref: #3794
Diffstat (limited to 'lib')
-rw-r--r-- | lib/getinfo.c | 5 | ||||
-rw-r--r-- | lib/http.c | 13 | ||||
-rw-r--r-- | lib/urldata.h | 2 |
3 files changed, 17 insertions, 3 deletions
diff --git a/lib/getinfo.c b/lib/getinfo.c index 5fd8dc018..2b8f2303e 100644 --- a/lib/getinfo.c +++ b/lib/getinfo.c @@ -246,7 +246,6 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info, case CURLINFO_PROTOCOL: *param_longp = data->info.conn_protocol; break; - default: return CURLE_UNKNOWN_OPTION; } @@ -304,7 +303,9 @@ static CURLcode getinfo_offt(struct Curl_easy *data, CURLINFO info, case CURLINFO_REDIRECT_TIME_T: *param_offt = data->progress.t_redirect; break; - + case CURLINFO_RETRY_AFTER: + *param_offt = data->info.retry_after; + break; default: return CURLE_UNKNOWN_OPTION; } diff --git a/lib/http.c b/lib/http.c index 9d8cd5570..cfa7093b2 100644 --- a/lib/http.c +++ b/lib/http.c @@ -3953,6 +3953,19 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data, if(result) return result; } + else if(checkprefix("Retry-After:", k->p)) { + /* Retry-After = HTTP-date / delay-seconds */ + curl_off_t retry_after = 0; /* zero for unknown or "now" */ + time_t date = curl_getdate(&k->p[12], NULL); + if(-1 == date) { + /* not a date, try it as a decimal number */ + (void)curlx_strtoofft(&k->p[12], NULL, 10, &retry_after); + } + else + /* convert date to number of seconds into the future */ + retry_after = date - time(NULL); + data->info.retry_after = retry_after; /* store it */ + } else if(!k->http_bodyless && checkprefix("Content-Range:", k->p)) { /* Content-Range: bytes [num]- Content-Range: bytes: [num]- diff --git a/lib/urldata.h b/lib/urldata.h index eabb1b5c7..fec3f755a 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1071,6 +1071,7 @@ struct PureInfo { long numconnects; /* how many new connection did libcurl created */ char *contenttype; /* the content type of the object */ char *wouldredirect; /* URL this would've been redirected to if asked to */ + curl_off_t retry_after; /* info from Retry-After: header */ /* PureInfo members 'conn_primary_ip', 'conn_primary_port', 'conn_local_ip' and, 'conn_local_port' are copied over from the connectdata struct in @@ -1090,7 +1091,6 @@ struct PureInfo { OpenSSL, GnuTLS, Schannel, NSS and GSKit builds. Asked for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ - bit timecond:1; /* set to TRUE if the time condition didn't match, which thus made the document NOT get fetched */ }; |