diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2015-10-07 23:57:55 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2015-10-08 00:13:10 +0200 |
commit | 7ed2edc40dd6d0171266f3bfbc96466e1d25e3cd (patch) | |
tree | b3230a1f9c6c35fcb01b062b2850a60f194650a5 /client.c | |
parent | 1f786a55f9ad8d88a1e8322d0d363ab0602bdeb6 (diff) |
fix chunked transfer encoding in keepalive mode
The two commits
5162e3b0ee7bd1d0fd6e75e1ca7993a1834b5291
"allow request handlers to disable chunked reponses"
and
618493e378e2239f0d30902e47adfa134e649fdc
"file: disable chunked encoding for file responses"
broke the chunked transfer encoding handling for proc responses in keep-alive
connections that followed a file response with http status 204 or 304.
The effect of this bug is that cgi responses following a 204 or 304 one where
sent neither in chunked encoding nor with a content-length header, causing
browsers to stall until the keep alive timeout was reached.
Fix the logic flaw by inverting the chunk prevention flag in the client state
and by testing the chunked encoding preconditions every time instead of
once upon client (re-)initialization.
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
Diffstat (limited to 'client.c')
-rw-r--r-- | client.c | 6 |
1 files changed, 2 insertions, 4 deletions
@@ -50,7 +50,7 @@ void uh_http_header(struct client *cl, int code, const char *summary) cl->http_code = code; - if (!cl->request.respond_chunked) + if (!uh_use_chunked(cl)) enc = ""; if (r->connection_close) @@ -188,8 +188,6 @@ static int client_parse_request(struct client *cl, char *data) !conf.http_keepalive) req->connection_close = true; - req->respond_chunked = uh_use_chunked(cl); - return CLIENT_STATE_HEADER; } @@ -261,7 +259,7 @@ static bool tls_redirect_check(struct client *cl) else if ((ptr = strchr(host, ':')) != NULL) *ptr = 0; - cl->request.respond_chunked = false; + cl->request.disable_chunked = true; cl->request.connection_close = true; uh_http_header(cl, 307, "Temporary Redirect"); |