Commit 2c27e4ee authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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.
parent 6ac9e67b
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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

+4 −1
Original line number Diff line number Diff line
@@ -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
+12 −3
Original line number Diff line number Diff line
@@ -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))
+1 −1
Original line number Diff line number Diff line
@@ -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

tests/data/test207

0 → 100644
+57 −0
Original line number Diff line number Diff line
#
# 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>