[master] e142a19 Correctly handle EOF responses with HTTP/1.1

Federico G. Schwindt fgsch at lodoss.net
Tue May 10 00:17:06 CEST 2016


commit e142a199c53dd9331001cb29678602e726a35690
Author: Federico G. Schwindt <fgsch at lodoss.net>
Date:   Thu May 5 16:44:25 2016 +0100

    Correctly handle EOF responses with HTTP/1.1
    
    Fixes #1918.

diff --git a/bin/varnishd/http1/cache_http1_proto.c b/bin/varnishd/http1/cache_http1_proto.c
index 30b318c..713a8d6 100644
--- a/bin/varnishd/http1/cache_http1_proto.c
+++ b/bin/varnishd/http1/cache_http1_proto.c
@@ -271,7 +271,7 @@ http1_splitline(struct http *hp, struct http_conn *htc, const int *hf,
 /*--------------------------------------------------------------------*/
 
 static enum body_status
-http1_body_status(const struct http *hp, struct http_conn *htc)
+http1_body_status(const struct http *hp, struct http_conn *htc, int request)
 {
 	ssize_t cl;
 	const char *b;
@@ -301,7 +301,7 @@ http1_body_status(const struct http *hp, struct http_conn *htc)
 		return (cl == 0 ? BS_NONE : BS_LENGTH);
 	}
 
-	if (hp->protover == 11)
+	if (hp->protover == 11 && (request || !http_HdrIs(hp, H_Connection, "close")))
 		return (BS_NONE);
 
 	if (http_HdrIs(hp, H_Connection, "keep-alive")) {
@@ -372,7 +372,7 @@ HTTP1_DissectRequest(struct http_conn *htc, struct http *hp)
 		}
 	}
 
-	htc->body_status = http1_body_status(hp, htc);
+	htc->body_status = http1_body_status(hp, htc, 1);
 	if (htc->body_status == BS_ERROR)
 		return (400);
 
@@ -451,7 +451,7 @@ HTTP1_DissectResponse(struct http_conn *htc, struct http *hp,
 	    !Tlen(hp->hd[HTTP_HDR_REASON]))
 		http_SetH(hp, HTTP_HDR_REASON, http_Status2Reason(hp->status));
 
-	htc->body_status = http1_body_status(hp, htc);
+	htc->body_status = http1_body_status(hp, htc, 0);
 
 	return (retval);
 }
diff --git a/bin/varnishtest/tests/r01918.vtc b/bin/varnishtest/tests/r01918.vtc
new file mode 100644
index 0000000..c0593aa
--- /dev/null
+++ b/bin/varnishtest/tests/r01918.vtc
@@ -0,0 +1,22 @@
+varnishtest "Check EOF responses work with HTTP/1.1"
+
+server s1 {
+	rxreq
+	txresp -nolen -bodylen 10
+	rxreq
+	txresp -hdr "Connection: close" -nolen -bodylen 10
+} -start
+
+varnish v1 -vcl+backend {
+} -start
+
+client c1 {
+	txreq -url /1
+	rxresp
+	expect resp.status == 200
+	expect resp.bodylen == 0
+	txreq -url /2
+	rxresp
+	expect resp.status == 200
+	expect resp.bodylen == 10
+} -run



More information about the varnish-commit mailing list