HTTP pipelining: Fix handling of zero-length responses
Also add test case 584 for the same Bug: http://curl.haxx.se/bug/view.cgi?id=3214223
This commit is contained in:
parent
ee4c1206de
commit
d54668eb00
@ -500,9 +500,28 @@ static CURLcode readwrite_data(struct SessionHandle *data,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(stop_reading)
|
if(stop_reading) {
|
||||||
/* We've stopped dealing with input, get out of the do-while loop */
|
/* We've stopped dealing with input, get out of the do-while loop */
|
||||||
break;
|
|
||||||
|
if(nread > 0) {
|
||||||
|
if(conn->data->multi && Curl_multi_canPipeline(conn->data->multi)) {
|
||||||
|
infof(data,
|
||||||
|
"Rewinding stream by : %zd"
|
||||||
|
" bytes on url %s (zero-length body)\n",
|
||||||
|
nread, data->state.path);
|
||||||
|
read_rewind(conn, (size_t)nread);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
infof(data,
|
||||||
|
"Excess found in a non pipelined read:"
|
||||||
|
" excess = %zd"
|
||||||
|
" url = %s (zero-length body)\n",
|
||||||
|
nread, data->state.path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif /* CURL_DISABLE_HTTP */
|
#endif /* CURL_DISABLE_HTTP */
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
|
|||||||
test1203 test1117 test1118 test1119 test1120 test1300 test1301 test1302 \
|
test1203 test1117 test1118 test1119 test1120 test1300 test1301 test1302 \
|
||||||
test1303 test320 test321 test322 test323 test324 test1121 test581 test580 \
|
test1303 test320 test321 test322 test323 test324 test1121 test581 test580 \
|
||||||
test1304 test1305 test1306 test1307 test582 test583 test808 test809 \
|
test1304 test1305 test1306 test1307 test582 test583 test808 test809 \
|
||||||
test810 test811 test812 test813
|
test810 test811 test812 test813 test584
|
||||||
|
|
||||||
filecheck:
|
filecheck:
|
||||||
@mkdir test-place; \
|
@mkdir test-place; \
|
||||||
|
102
tests/data/test584
Normal file
102
tests/data/test584
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
<testcase>
|
||||||
|
<info>
|
||||||
|
<keywords>
|
||||||
|
HTTP
|
||||||
|
Pipelining
|
||||||
|
multi
|
||||||
|
</keywords>
|
||||||
|
</info>
|
||||||
|
|
||||||
|
# Server-side
|
||||||
|
# Silly division of the first request is solely to appease the server which expects n_data_items == n_requests
|
||||||
|
<reply>
|
||||||
|
<data1>
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Server: test-server/fake
|
||||||
|
Content-Length: 4
|
||||||
|
|
||||||
|
584
|
||||||
|
</data1>
|
||||||
|
<data2>
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
</data2>
|
||||||
|
<data3>
|
||||||
|
Server: test-server/fake
|
||||||
|
</data3>
|
||||||
|
<data4>
|
||||||
|
Content-Length: 0
|
||||||
|
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Server: test-server/fake
|
||||||
|
Content-Length: 5
|
||||||
|
|
||||||
|
585
|
||||||
|
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Server: test-server/fake
|
||||||
|
Content-Length: 4
|
||||||
|
|
||||||
|
586
|
||||||
|
</data4>
|
||||||
|
</reply>
|
||||||
|
|
||||||
|
# Client-side
|
||||||
|
<client>
|
||||||
|
<server>
|
||||||
|
http
|
||||||
|
</server>
|
||||||
|
<tool>
|
||||||
|
lib530
|
||||||
|
</tool>
|
||||||
|
<name>
|
||||||
|
HTTP GET using pipelining (nonzero length after zero length)
|
||||||
|
</name>
|
||||||
|
<command>
|
||||||
|
http://%HOSTIP:%HTTPPORT/path/584
|
||||||
|
</command>
|
||||||
|
</client>
|
||||||
|
|
||||||
|
# Verify data after the test has been "shot"
|
||||||
|
<verify>
|
||||||
|
<protocol>
|
||||||
|
GET /path/5840001 HTTP/1.1
|
||||||
|
Host: %HOSTIP:%HTTPPORT
|
||||||
|
Accept: */*
|
||||||
|
|
||||||
|
GET /path/5840002 HTTP/1.1
|
||||||
|
Host: %HOSTIP:%HTTPPORT
|
||||||
|
Accept: */*
|
||||||
|
|
||||||
|
GET /path/5840003 HTTP/1.1
|
||||||
|
Host: %HOSTIP:%HTTPPORT
|
||||||
|
Accept: */*
|
||||||
|
|
||||||
|
GET /path/5840004 HTTP/1.1
|
||||||
|
Host: %HOSTIP:%HTTPPORT
|
||||||
|
Accept: */*
|
||||||
|
|
||||||
|
</protocol>
|
||||||
|
<stdout>
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Server: test-server/fake
|
||||||
|
Content-Length: 4
|
||||||
|
|
||||||
|
584
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Server: test-server/fake
|
||||||
|
Content-Length: 0
|
||||||
|
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Server: test-server/fake
|
||||||
|
Content-Length: 5
|
||||||
|
|
||||||
|
585
|
||||||
|
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Server: test-server/fake
|
||||||
|
Content-Length: 4
|
||||||
|
|
||||||
|
586
|
||||||
|
</stdout>
|
||||||
|
</verify>
|
||||||
|
</testcase>
|
Loading…
x
Reference in New Issue
Block a user