allow request handlers to disable chunked reponses
authorJo-Philipp Wich <jow@openwrt.org>
Sat, 30 May 2015 13:48:42 +0000 (15:48 +0200)
committerJo-Philipp Wich <jow@openwrt.org>
Sat, 30 May 2015 13:51:02 +0000 (15:51 +0200)
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
client.c
uhttpd.h
utils.c

index 0d7029b..85d4625 100644 (file)
--- a/client.c
+++ b/client.c
@@ -50,7 +50,7 @@ void uh_http_header(struct client *cl, int code, const char *summary)
 
        cl->http_code = code;
 
-       if (!uh_use_chunked(cl))
+       if (!cl->request.respond_chunked)
                enc = "";
 
        if (r->connection_close)
@@ -188,6 +188,8 @@ 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;
 }
 
index 1c82d76..42385a6 100644 (file)
--- a/uhttpd.h
+++ b/uhttpd.h
@@ -111,6 +111,7 @@ struct http_request {
        int content_length;
        bool expect_cont;
        bool connection_close;
+       bool respond_chunked;
        uint8_t transfer_chunked;
        const struct auth_realm *realm;
 };
diff --git a/utils.c b/utils.c
index 1092a7d..857e326 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -37,7 +37,7 @@ bool uh_use_chunked(struct client *cl)
 
 void uh_chunk_write(struct client *cl, const void *data, int len)
 {
-       bool chunked = uh_use_chunked(cl);
+       bool chunked = cl->request.respond_chunked;
 
        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 (!uh_use_chunked(cl)) {
+       if (!cl->request.respond_chunked) {
                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 (!uh_use_chunked(cl))
+       if (!cl->request.respond_chunked)
                return;
 
        if (cl->state == CLIENT_STATE_CLEANUP)