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:
Родитель
ee4c1206de
Коммит
d54668eb00
|
@ -500,10 +500,29 @@ static CURLcode readwrite_data(struct SessionHandle *data,
|
|||
}
|
||||
#endif
|
||||
|
||||
if(stop_reading)
|
||||
if(stop_reading) {
|
||||
/* We've stopped dealing with input, get out of the do-while loop */
|
||||
|
||||
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 */
|
||||
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
|
|||
test1203 test1117 test1118 test1119 test1120 test1300 test1301 test1302 \
|
||||
test1303 test320 test321 test322 test323 test324 test1121 test581 test580 \
|
||||
test1304 test1305 test1306 test1307 test582 test583 test808 test809 \
|
||||
test810 test811 test812 test813
|
||||
test810 test811 test812 test813 test584
|
||||
|
||||
filecheck:
|
||||
@mkdir test-place; \
|
||||
|
|
|
@ -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>
|
Загрузка…
Ссылка в новой задаче