goto out;
}
+ /* final response without error, prepare to receive the body */
+ result = http_firstwrite(data);
+ if(result)
+ goto out;
+
+ /* This is the last response that we get for the current request. Check on
+ * the body size and determine if the response is complete. */
+ result = http_size(data);
+ if(result)
+ goto out;
+
/* If we requested a "no body", this is a good time to get
* out and return home.
*/
if((k->maxdownload == 0) && (k->httpversion_sent < 20))
k->download_done = TRUE;
- /* final response without error, prepare to receive the body */
- result = http_firstwrite(data);
-
- if(!result)
- /* This is the last response that we get for the current request. Check on
- * the body size and determine if the response is complete. */
- result = http_size(data);
-
out:
if(last_hd)
/* if not written yet, write it now */
test1658 test1659 test1660 test1661 test1662 test1663 test1664 test1665 \
test1666 test1667 test1668 test1669 \
\
-test1670 test1671 test1672 test1673 test1674 test1675 test1676 \
+test1670 test1671 test1672 test1673 test1674 test1675 test1676 test1677 \
\
test1680 test1681 test1682 test1683 test1684 test1685 \
\
--- /dev/null
+<?xml version="1.0" encoding="US-ASCII"?>
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+chunked Transfer-Encoding
+Content-Length
+</keywords>
+</info>
+
+# Regression test for bug where curl stops reading chunked response
+# when both Content-Length: 0 and Transfer-Encoding: chunked headers
+# are present. Per RFC 7230 Section 3.3.3, Transfer-Encoding should
+# take precedence and Content-Length should be ignored.
+# The writedelay simulates the timing issue where chunks arrive in
+# separate packets.
+
+# Server-side
+<reply>
+<servercmd>
+writedelay: 500
+</servercmd>
+<data nocheck="yes" crlf="headers">
+HTTP/1.1 200 OK
+content-type: text/json
+connection: keep-alive
+content-length: 0
+transfer-encoding: chunked
+
+1a
+random data in first chunk
+1d
+ another data in second chunk
+15
+ third and last chunk
+0
+
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+HTTP POST response with both Transfer-Encoding chunked and Content-Length 0
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/%TESTNUMBER -d "testdata"
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol nonewline="yes" crlf="headers">
+POST /%TESTNUMBER HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 8
+Content-Type: application/x-www-form-urlencoded
+
+testdata
+</protocol>
+<stdout nonewline="yes" crlf="headers">
+HTTP/1.1 200 OK
+content-type: text/json
+connection: keep-alive
+content-length: 0
+transfer-encoding: chunked
+
+random data in first chunk another data in second chunk third and last chunk
+</stdout>
+</verify>
+</testcase>