[package] uhttpd:
[openwrt-10.03/.git] / package / uhttpd / src / uhttpd-cgi.c
index 5565197ca7e576a2b1bf6b2069fa19a95172d494..4a30f2fc9a70677c64468c56ab06c5169affc785 100644 (file)
@@ -372,7 +372,7 @@ void uh_cgi_request(struct client *cl, struct http_request *req, struct path_inf
                                FD_SET(rfd[0], &reader);
                                FD_SET(wfd[1], &writer);
 
-                               timeout.tv_sec = 15;
+                               timeout.tv_sec = cl->server->conf->script_timeout;
                                timeout.tv_usec = 0;
 
                                /* wait until we can read or write or both */
@@ -538,11 +538,18 @@ void uh_cgi_request(struct client *cl, struct http_request *req, struct path_inf
                                        }
                                }
 
-                               /* no activity for 15 seconds... looks dead */
+                               /* timeout exceeded or interrupted by SIGCHLD */
                                else
                                {
-                                       ensure(uh_http_sendhf(cl, 504, "Gateway Timeout",
-                                               "The CGI script took too long to produce a response"));
+                                       if( (errno != EINTR) && ! header_sent )
+                                       {
+                                               ensure(uh_http_sendhf(cl, 504, "Gateway Timeout",
+                                                       "The CGI script took too long to produce "
+                                                       "a response"));
+                                       }
+
+                                       /* send final chunk if we're in chunked transfer mode */
+                                       ensure(uh_http_send(cl, req, "", 0));
 
                                        break;
                                }