]> err.no Git - varnish/commitdiff
RFC 2616 says "All 1xx (informational), 204 (no content), and 304 (not
authordes <des@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Thu, 5 Oct 2006 11:57:35 +0000 (11:57 +0000)
committerdes <des@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Thu, 5 Oct 2006 11:57:35 +0000 (11:57 +0000)
modified) responses MUST NOT include a message-body," so
Content-Length: is not needed in these cases (and Apache does indeed
not include it).  This causes PassBody() to call pass_straight() with
a NULL length argument, which waits until the connection is closed by
the server.  PassBody() should not call pass_*() at all for responses
that are known to be bodyless.

Submitted by: Dagfinn Ilmari MannsÃ¥ker <ilmari@ping.uio.no>

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1138 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_http.c
varnish-cache/bin/varnishd/cache_pass.c

index e4ecc22b853b93f2e83fb22cd080f3d82f495509..2828a6072b6f1fa4af1878379f3fa474b536d1cd 100644 (file)
@@ -371,6 +371,7 @@ void http_Setup(struct http *ht, void *space, unsigned len);
 int http_GetHdr(struct http *hp, const char *hdr, char **ptr);
 int http_GetHdrField(struct http *hp, const char *hdr, const char *field, char **ptr);
 int http_GetStatus(struct http *hp);
+int http_IsBodyless(struct http *hp);
 int http_HdrIs(struct http *hp, const char *hdr, const char *val);
 int http_GetTail(struct http *hp, unsigned len, char **b, char **e);
 int http_Read(struct http *hp, int fd, void *b, unsigned len);
index 678dbe291835b29c936926c130e9c7e1ddf59c51..56f22f1d160d4f29e2fff8b00d0bde8b5f8f6965 100644 (file)
@@ -316,6 +316,21 @@ http_GetStatus(struct http *hp)
            NULL /* XXX */, 10));
 }
 
+/*---------------------------------------------------------------------
+ * All 1xx (informational), 204 (no content), and 304 (not modified)
+ * responses MUST NOT include a message-body.
+ */
+
+int
+http_IsBodyless(struct http *hp)
+{
+       int status;
+
+       status = http_GetStatus(hp);
+       return (status >= 100 && status < 200)
+               || status == 204 || status == 304;
+}
+
 /*--------------------------------------------------------------------
  * Dissect the headers of the HTTP protocol message.
  * Detect conditionals (headers which start with '^[Ii][Ff]-')
index 694e6fa25fa2521916a106f5b581a01b917ceaf1..7df39b4737b0173179729057c973928a0a3b6559 100644 (file)
@@ -201,6 +201,8 @@ PassBody(struct sess *sp)
                cls = pass_straight(sp, vc->fd, vc->http, NULL);
        else if (http_HdrIs(vc->http, H_Transfer_Encoding, "chunked"))
                cls = pass_chunked(sp, vc->fd, vc->http);
+       else if (http_IsBodyless(vc->http))
+               cls = 0;
        else {
                cls = pass_straight(sp, vc->fd, vc->http, NULL);
        }