diff options
author | Chris Smowton <cs448@cam.ac.uk> | 2011-04-07 14:17:05 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2011-04-07 14:18:07 +0200 |
commit | d54668eb00c31e3eaf6987c5f4184aea98cf227e (patch) | |
tree | b438dc178e0ac209523082e25a7c149902d85860 | |
parent | ee4c1206de9ab08054b48b675fb049e64066deec (diff) |
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
-rw-r--r-- | lib/transfer.c | 23 | ||||
-rw-r--r-- | tests/data/Makefile.am | 2 | ||||
-rw-r--r-- | tests/data/test584 | 102 |
3 files changed, 124 insertions, 3 deletions
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 @@ +<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> |