From a00e7f0f5ecd8fd93951a85ef86eb8b3c58f092e Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 25 Oct 2004 11:28:40 +0000 Subject: [PATCH] Tomas Pospisek filed bug report #1053287 that proved -C - and --fail on a file that was already completely downloaded caused an error, while it doesn't if you don't use --fail! I added test case 194 to verify the fix. Grrr. CURLOPT_FAILONERROR is now added to the list stuff to remove in libcurl v8 due to all the kludges needed to support it. --- CHANGES | 6 ++++++ docs/TODO | 3 +++ lib/http.c | 8 ++++++++ lib/transfer.c | 22 +++++++++++++------- tests/data/Makefile.am | 2 +- tests/data/test194 | 46 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 tests/data/test194 diff --git a/CHANGES b/CHANGES index 1f3813fbe..c9b7f15f0 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,12 @@ Changelog Daniel (25 October 2004) +- Tomas Pospisek filed bug report #1053287 that proved -C - and --fail on a + file that was already completely downloaded caused an error, while it + doesn't if you don't use --fail! I added test case 194 to verify the fix. + Grrr. CURLOPT_FAILONERROR is now added to the list stuff to remove in + libcurl v8 due to all the kludges needed to support it. + - Mohun Biswas found out that formposting a zero-byte file didn't work very good. I fixed. diff --git a/docs/TODO b/docs/TODO index 081d23c41..7145b46f3 100644 --- a/docs/TODO +++ b/docs/TODO @@ -250,3 +250,6 @@ TODO They will instead become curlx_ - alternatives. That makes the curl app still capable of building with them from source. + + * Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird + internally. Let the app judge success or not for itself. diff --git a/lib/http.c b/lib/http.c index 80484975f..ee5b81ff6 100644 --- a/lib/http.c +++ b/lib/http.c @@ -553,6 +553,14 @@ int Curl_http_should_fail(struct connectdata *conn) if (k->httpcode < 400) return 0; + if (conn->resume_from && + (data->set.httpreq==HTTPREQ_GET) && + (k->httpcode == 416)) { + /* "Requested Range Not Satisfiable", just proceed and + pretend this is no error */ + return 0; + } + /* ** Any code >= 400 that's not 401 or 407 is always ** a terminal error diff --git a/lib/transfer.c b/lib/transfer.c index 14512a774..904dbd15b 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -487,7 +487,6 @@ CURLcode Curl_readwrite(struct connectdata *conn, (100 == k->httpcode)?conn->headerbytecount:0; if (conn->resume_from && - !k->content_range && (data->set.httpreq==HTTPREQ_GET) && (k->httpcode == 416)) { /* "Requested Range Not Satisfiable" */ @@ -613,10 +612,19 @@ CURLcode Curl_readwrite(struct connectdata *conn, (k->httpcode >= 400) && (k->httpcode != 401) && (k->httpcode != 407)) { - /* serious error, go home! */ - failf (data, "The requested URL returned error: %d", - k->httpcode); - return CURLE_HTTP_RETURNED_ERROR; + + if (conn->resume_from && + (data->set.httpreq==HTTPREQ_GET) && + (k->httpcode == 416)) { + /* "Requested Range Not Satisfiable", just proceed and + pretend this is no error */ + } + else { + /* serious error, go home! */ + failf (data, "The requested URL returned error: %d", + k->httpcode); + return CURLE_HTTP_RETURNED_ERROR; + } } if(k->httpversion == 10) @@ -954,8 +962,8 @@ CURLcode Curl_readwrite(struct connectdata *conn, /* we wanted to resume a download, although the server doesn't * seem to support this and we did this with a GET (if it * wasn't a GET we did a POST or PUT resume) */ - failf (data, "HTTP server doesn't seem to support " - "byte ranges. Cannot resume."); + failf(data, "HTTP server doesn't seem to support " + "byte ranges. Cannot resume."); return CURLE_HTTP_RANGE_ERROR; } diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 0f63d5f6f..7298caf7a 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -27,7 +27,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test172 test204 test205 test173 test174 test175 test176 test177 \ test513 test514 test178 test179 test180 test181 test182 test183 \ test184 test185 test186 test187 test188 test189 test191 test192 \ - test193 + test193 test194 # The following tests have been removed from the dist since they no longer # work. We need to fix the test suite's FTPS server first, then bring them diff --git a/tests/data/test194 b/tests/data/test194 new file mode 100644 index 000000000..4e6e0f386 --- /dev/null +++ b/tests/data/test194 @@ -0,0 +1,46 @@ +# Server-side + + +HTTP/1.1 416 Requested Range Not Satisfiable swsclose +Date: Fri, 24 Oct 2003 21:33:12 GMT +Server: Apache/1.3.19 (Unix) (Red-Hat/Linux) mod_ssl/2.8.1 OpenSSL/0.9.6 PHP/4.3.1 +Last-Modified: Fri, 24 Oct 2003 18:01:23 GMT +ETag: "ab57a-507-3f9968f3" +Accept-Ranges: bytes +Content-Length: 87 +Content-Range: bytes */87 +Content-Type: image/gif +Connection: close + + + + + +# Client-side + + +http + + +HTTP resume transfer with the whole file already downloaded and --fail + + +http://%HOSTIP:%HTTPPORT/want/194 -C 87 --fail + + + +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /want/194 HTTP/1.1 +Range: bytes=87- +Host: 127.0.0.1:%HTTPPORT +Pragma: no-cache +Accept: */* + + + +