Commit 3631f231 authored by Dag Erling Smørgrav's avatar Dag Erling Smørgrav

RFC 2616 says "All 1xx (informational), 204 (no content), and 304 (not

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: http://www.varnish-cache.org/svn/trunk/varnish-cache@1138 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent c06e80ab
......@@ -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);
......
......@@ -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]-')
......
......@@ -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);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment