Commit d54668eb authored by Chris Smowton's avatar Chris Smowton Committed by Daniel Stenberg
Browse files

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
parent ee4c1206
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -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 */


+1 −1
Original line number Diff line number Diff line
@@ -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; \

tests/data/test584

0 → 100644
+102 −0
Original line number Diff line number Diff line
<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>