Hello list,
I'm working on a CGI written in lua and I'm using uhttpd as webserver on a tp-link AP.
I'm using external CGI interpreter, not embedded lua.

I need that the output from my CGI is chunked since I would like to avoid to buffer the
whole response and calculate the "Content-Length".

I discovered that uhttpd try to send chunked response if the response is a normal 200 OK and the method is a GET. This is my case but unfortunately I ended with a strange behavior
where sometimes the GET return with chunked content and sometimes not.

I have an html page that call the CGI with a jquery method:
    <script>
      $(document).ready(function(){
         $("#catdiv").load("../cgi-bin/board.lua?noheader=1");
      });
    </script>


the board.lua script return a piece of html code (without headers and footers).
The output of the CGI is always the same between test.

Debugging the http traffic with firefox I see that the GET of board.lua take about 33ms when the output is chunked and 20s (the full keep-alive timeout) when the output is not chunked. I see the response headers and it contain Transfer-Encoding: "chunked" directive in one case on not in the other. From client side everything seems correctly following what
the websever gives back.

If I directly call cgi-bin/board.lua it seems to always return in 33ms. Debugging the code I came up with the idea that where there are multiple GET on one http session if one GET is solved with a 204 or 304 that all other GET can't be chunked anymore. In fact my html page load other pages
(css, js, etc about 5 GET in one page refresh).

I tried with a simple patch (I'm sure this is not the best solution though) that seems to correct
my problem.

--- file.c    2015-10-07 15:39:45.169056639 +0200
+++ file.c    2015-10-07 15:39:55.859056443 +0200
@@ -807,9 +807,10 @@
         return true;

     d = dispatch_find(url, pi);
-    if (d)
+    if (d) {
+        cl->request.respond_chunked = true;
         uh_invoke_handler(cl, d, url, pi);
-    else
+    } else
         uh_file_request(cl, url, pi, tb);

     return true;


I would like to know if this have sense, if it has been corrected in other uhttpd version or if my patch
broke with some RFC recommendation.

my openwrt version is:
DISTRIB_ID='OpenWrt'
DISTRIB_RELEASE='Chaos Calmer'
DISTRIB_REVISION='r46910'
DISTRIB_CODENAME='chaos_calmer'
DISTRIB_TARGET='ar71xx/generic'
DISTRIB_DESCRIPTION='OpenWrt Chaos Calmer 15.05'
DISTRIB_TAINTS='no-all no-ipv6'

thank you in advance
Luigi
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to