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:
Chris Smowton 2011-04-07 14:17:05 +02:00 committed by Daniel Stenberg
parent ee4c1206de
commit d54668eb00
3 changed files with 124 additions and 3 deletions

View File

@ -500,9 +500,28 @@ 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 */
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 */

View File

@ -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; \

102
tests/data/test584 Normal file
View 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>