summaryrefslogtreecommitdiff
path: root/utils.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2015-10-07 23:57:55 +0200
committerJo-Philipp Wich <jow@openwrt.org>2015-10-08 00:13:10 +0200
commit7ed2edc40dd6d0171266f3bfbc96466e1d25e3cd (patch)
treeb3230a1f9c6c35fcb01b062b2850a60f194650a5 /utils.c
parent1f786a55f9ad8d88a1e8322d0d363ab0602bdeb6 (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 'utils.c')
-rw-r--r--utils.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/utils.c b/utils.c
index 857e326..29e03c0 100644
--- a/utils.c
+++ b/utils.c
@@ -32,12 +32,12 @@ bool uh_use_chunked(struct client *cl)
if (cl->http_code == 204 || cl->http_code == 304)
return false;
- return true;
+ return !cl->request.disable_chunked;
}
void uh_chunk_write(struct client *cl, const void *data, int len)
{
- bool chunked = cl->request.respond_chunked;
+ bool chunked = uh_use_chunked(cl);
if (cl->state == CLIENT_STATE_CLEANUP)
return;
@@ -60,7 +60,7 @@ void uh_chunk_vprintf(struct client *cl, const char *format, va_list arg)
return;
uloop_timeout_set(&cl->timeout, conf.network_timeout * 1000);
- if (!cl->request.respond_chunked) {
+ if (!uh_use_chunked(cl)) {
ustream_vprintf(cl->us, format, arg);
return;
}
@@ -88,7 +88,7 @@ void uh_chunk_printf(struct client *cl, const char *format, ...)
void uh_chunk_eof(struct client *cl)
{
- if (!cl->request.respond_chunked)
+ if (!uh_use_chunked(cl))
return;
if (cl->state == CLIENT_STATE_CLEANUP)