From d54668eb00c31e3eaf6987c5f4184aea98cf227e Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Thu, 7 Apr 2011 14:17:05 +0200 Subject: [PATCH] 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 --- lib/transfer.c | 23 +++++++++- tests/data/Makefile.am | 2 +- tests/data/test584 | 102 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 tests/data/test584 diff --git a/lib/transfer.c b/lib/transfer.c index bd5f49dd4..065c7341f 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -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 */ diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index e75949ffb..066ba5d90 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -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; \ diff --git a/tests/data/test584 b/tests/data/test584 new file mode 100644 index 000000000..81d6a083d --- /dev/null +++ b/tests/data/test584 @@ -0,0 +1,102 @@ + + + +HTTP +Pipelining +multi + + + +# Server-side +# Silly division of the first request is solely to appease the server which expects n_data_items == n_requests + + +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 + + + +# Client-side + + +http + + +lib530 + + +HTTP GET using pipelining (nonzero length after zero length) + + +http://%HOSTIP:%HTTPPORT/path/584 + + + +# Verify data after the test has been "shot" + + +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: */* + + + +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 + + +