cgi: apply chunked grace period only when explicitly chunked
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index 8781eec..11f73d5 100755
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -302,8 +302,10 @@
 			}
 			pcgi = &(*pcgi)->cgi_list;
 		}
-		if (wsi->cgi->headers_buf)
+		if (wsi->cgi->headers_buf) {
+			lwsl_debug("close: freed cgi headers\n");
 			lws_free_set_NULL(wsi->cgi->headers_buf);
+		}
 		/* we have a cgi going, we must kill it */
 		wsi->cgi->being_closed = 1;
 		lws_cgi_kill(wsi);
@@ -2555,6 +2557,7 @@
 	"content-length: ",
 	"location: ",
 	"status: ",
+	"transfer-encoding: chunked",
 };
 
 LWS_VISIBLE LWS_EXTERN int
@@ -2608,6 +2611,8 @@
 			if (n > 512)
 				n = 512;
 
+			lwsl_debug("LHCS_DUMP_HEADERS: %d\n", n);
+
 			m = lws_write(wsi, (unsigned char *)wsi->cgi->headers_dumped,
 				      n, LWS_WRITE_HTTP_HEADERS);
 			if (m < 0) {
@@ -2618,6 +2623,7 @@
 			if (wsi->cgi->headers_dumped == wsi->cgi->headers_pos) {
 				wsi->hdr_state = LHCS_PAYLOAD;
 				lws_free_set_NULL(wsi->cgi->headers_buf);
+				lwsl_debug("freed cgi headers\n");
 			} else {
 				wsi->reason_bf |= 8;
 				lws_callback_on_writable(wsi);
@@ -2637,6 +2643,8 @@
 				lwsl_err("OOM\n");
 				return -1;
 			}
+
+			lwsl_debug("allocated cgi hdrs\n");
 			wsi->cgi->headers_pos = wsi->cgi->headers_buf;
 			wsi->cgi->headers_dumped = wsi->cgi->headers_pos;
 			wsi->cgi->headers_end = wsi->cgi->headers_buf + n - 1;
@@ -2706,6 +2714,12 @@
 				if (c == '\x0d')
 					wsi->hdr_state = LCHS_LF1;
 
+				if (wsi->hdr_state != LCHS_HEADER &&
+				    !significant_hdr[SIGNIFICANT_HDR_TRANSFER_ENCODING][wsi->cgi->match[SIGNIFICANT_HDR_TRANSFER_ENCODING]]) {
+					lwsl_debug("cgi produced chunked\n");
+					wsi->cgi->explicitly_chunked = 1;
+				}
+
 				/* presence of Location: mandates 302 retcode */
 				if (wsi->hdr_state != LCHS_HEADER &&
 				    !significant_hdr[SIGNIFICANT_HDR_LOCATION][wsi->cgi->match[SIGNIFICANT_HDR_LOCATION]]) {
@@ -2905,7 +2919,7 @@
 				lwsl_debug("%s: found PID %d on cgi list\n",
 					    __func__, n);
 
-				if (!cgi->content_length) {
+				if (!cgi->content_length && cgi->explicitly_chunked) {
 					/*
 					 * well, if he sends chunked... give him 5s after the
 					 * cgi terminated to send buffered
diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h
index 78d1ceb..8f7f796 100644
--- a/lib/private-libwebsockets.h
+++ b/lib/private-libwebsockets.h
@@ -1446,6 +1446,7 @@
 	SIGNIFICANT_HDR_CONTENT_LENGTH,
 	SIGNIFICANT_HDR_LOCATION,
 	SIGNIFICANT_HDR_STATUS,
+	SIGNIFICANT_HDR_TRANSFER_ENCODING,
 
 	SIGNIFICANT_HDR_COUNT
 };
@@ -1470,6 +1471,7 @@
 	char l[12];
 
 	unsigned int being_closed:1;
+	unsigned int explicitly_chunked:1;
 
 	unsigned char chunked_grace;
 };