diff options
author | Daniel Stenberg <daniel@haxx.se> | 2004-12-03 09:31:25 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2004-12-03 09:31:25 +0000 |
commit | 2c27e4ee767c37e1923d26dfc1cddafe31490c2c (patch) | |
tree | a588fbad167c1a9ec36f044f952aa0ee9d0a2459 | |
parent | 6ac9e67bd758e99a5ec385dba4492de3c35cd25f (diff) |
Bug report #1078066: when a chunked transfer was pre-maturely closed exactly
at a chunk boundary it was not considered an error and thus went unnoticed.
Added test case 207 to verify.
-rw-r--r-- | CHANGES | 14 | ||||
-rw-r--r-- | RELEASE-NOTES | 5 | ||||
-rw-r--r-- | lib/transfer.c | 15 | ||||
-rw-r--r-- | tests/data/Makefile.am | 2 | ||||
-rw-r--r-- | tests/data/test207 | 57 |
5 files changed, 88 insertions, 5 deletions
@@ -6,6 +6,20 @@ Changelog +Daniel (3 December 2004) +- Bug report #1078066: when a chunked transfer was pre-maturely closed exactly + at a chunk boundary it was not considered an error and thus went unnoticed. + + Added test case 207 to verify. + +Daniel (2 December 2004) +- Fixed the CONNECT loop to default timeout to 3600 seconds. + + Added test case 206 that makes CONNECT with Digest. + + Fixed a flaw that prepended "(nil)" to the initial CONNECT rqeuest's user- + agent field. + Daniel (30 November 2004) - Dan Fandrich's fix for libz 1.1 and "extra field" usage in a gzip stream diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 54358a1a5..9b8f9a866 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -23,7 +23,10 @@ This release includes the following changes: This release includes the following bugfixes: - o --disable-epsv when connecting to an IPv6 ftp server + o chunked-encoded transfers could get closed pre-maturely without error + o proxy CONNECT now default timeouts after 3600 seconds + o --disable-epsv and --disable-eprt are ignored when connecting to an IPv6 ftp + server o no more extra progress meter newline output after each Location: followed o HTTP PUT/POST with Digest, NTLM or Negotiate no longer uses HEAD o now gracefully bails out when exceeding FD_SETSIZE file descriptors diff --git a/lib/transfer.c b/lib/transfer.c index 0e443ef01..aeb830716 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -1368,9 +1368,18 @@ CURLcode Curl_readwrite(struct connectdata *conn, conn->size - k->bytecount); return CURLE_PARTIAL_FILE; } - else if(conn->bits.chunk && conn->proto.http->chunk.datasize) { - failf(data, "transfer closed with at least %d bytes remaining", - conn->proto.http->chunk.datasize); + else if(conn->bits.chunk && + (conn->proto.http->chunk.state != CHUNK_STOP)) { + /* + * In chunked mode, return an error if the connection is closed prior to + * the empty (terminiating) chunk is read. + * + * The condition above used to check for + * conn->proto.http->chunk.datasize != 0 which is true after reading + * *any* chunk, not just the empty chunk. + * + */ + failf(data, "transfer closed with outstanding read data remaining"); return CURLE_PARTIAL_FILE; } if(Curl_pgrsUpdate(conn)) diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 257256ee4..0d66f891b 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -29,7 +29,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test184 test185 test186 test187 test188 test189 test191 test192 \ test193 test194 test195 test196 test197 test198 test515 test516 \ test517 test518 test210 test211 test212 test220 test221 test222 \ - test223 test224 test206 + test223 test224 test206 test207 # 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/test207 b/tests/data/test207 new file mode 100644 index 000000000..c151d9a78 --- /dev/null +++ b/tests/data/test207 @@ -0,0 +1,57 @@ +# +# Server-side +<reply> +<data> +HTTP/1.1 200 funky chunky! swsclose +Server: fakeit/0.9 fakeitbad/1.0 +Transfer-Encoding: chunked +Connection: mooo + +41
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +
+</data> +<datacheck> +HTTP/1.1 200 funky chunky! swsclose +Server: fakeit/0.9 fakeitbad/1.0 +Transfer-Encoding: chunked +Connection: mooo + +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +</datacheck> +</reply> + +# +# Client-side +<client> +<server> +http +</server> + <name> +HTTP GET with chunked Transfer-Encoding closed pre-maturely + </name> + <command> +http://%HOSTIP:%HTTPPORT/207 +</command> +</test> + +# +# Verify data after the test has been "shot" +<verify> +<strip> +^User-Agent:.* +</strip> +<protocol> +GET /207 HTTP/1.1
+Host: 127.0.0.1:%HTTPPORT
+Pragma: no-cache
+Accept: */*
+
+</protocol> + +# curl: (18) transfer closed with outstanding read data remaining +# 18 == CURLE_PARTIAL_FILE +<errorcode> +18 +</errorcode> +</verify> |