I did this
On git master, curl --fail -O -C - http://host/file when the local file had already been completely downloaded.
Server response:
< HTTP/1.1 416 Requested Range Not Satisfiable
< Server: nginx/1.22.1
< Date: Wed, 15 Feb 2023 13:29:29 GMT
< Content-Type: text/html; charset=utf8
< Content-Length: 197
< Content-Range: bytes */1234567
I expected the following
curl exits with code 0 (no error, even with --fail), because in http_should_fail():
|
/* |
|
** A 416 response to a resume request is presumably because the file is |
|
** already completely downloaded and thus not actually a fail. |
|
*/ |
|
if(data->state.resume_from && data->state.httpreq == HTTPREQ_GET && |
|
httpcode == 416) |
|
return FALSE; |
However, when the requested range was unsatisfied (e.g., Content-Range: */1234567), data->state.resume_from is overwritten with 0 (see line 3479), and thus the check above always fail.
|
else if(!k->http_bodyless && checkprefix("Content-Range:", headp)) { |
|
/* Content-Range: bytes [num]- |
|
Content-Range: bytes: [num]- |
|
Content-Range: [num]- |
|
Content-Range: [asterisk]/[total] |
|
|
|
The second format was added since Sun's webserver |
|
JavaWebServer/1.1.1 obviously sends the header this way! |
|
The third added since some servers use that! |
|
The fourth means the requested range was unsatisfied. |
|
*/ |
|
|
|
char *ptr = headp + strlen("Content-Range:"); |
|
|
|
/* Move forward until first digit or asterisk */ |
|
while(*ptr && !ISDIGIT(*ptr) && *ptr != '*') |
|
ptr++; |
|
|
|
/* if it truly stopped on a digit */ |
|
if(ISDIGIT(*ptr)) { |
|
if(!curlx_strtoofft(ptr, NULL, 10, &k->offset)) { |
|
if(data->state.resume_from == k->offset) |
|
/* we asked for a resume and we got it */ |
|
k->content_range = TRUE; |
|
} |
|
} |
|
else |
|
data->state.resume_from = 0; /* get everything */ |
|
} |
I did this
On git master,
curl --fail -O -C - http://host/filewhen the localfilehad already been completely downloaded.Server response:
I expected the following
curl exits with code 0 (no error, even with
--fail), because inhttp_should_fail():curl/lib/http.c
Lines 1161 to 1167 in 3027611
However, when the requested range was unsatisfied (e.g.,
Content-Range: */1234567),data->state.resume_fromis overwritten with0(see line 3479), and thus the check above always fail.curl/lib/http.c
Lines 3452 to 3480 in 3027611