← Commit list

ba600296d2

Josef Cejka
Josef Cejka
2026-06-01
SUCCESS Duration: 324s

Subject

http: prefer chunked encoding over Content-Length: 0

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

lib/http.c+11 -8
@@ -4172,6 +4172,17 @@ static CURLcode http_on_response(struct Curl_easy *data,
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.
*/
@@ -4185,14 +4196,6 @@ static CURLcode http_on_response(struct Curl_easy *data,
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 */
tests/data/Makefile.am+1 -1
@@ -222,7 +222,7 @@ test1650 test1651 test1652 test1653 test1654 test1655 test1656 test1657 \
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 \
\
tests/data/test1677+77 -0
@@ -0,0 +1,77 @@
+<?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>