]> granicus.if.org Git - apache/commitdiff
Fix the first bucket not getting chunked properly. The reason was that
authorJustin Erenkrantz <jerenkrantz@apache.org>
Sun, 14 Oct 2001 20:41:00 +0000 (20:41 +0000)
committerJustin Erenkrantz <jerenkrantz@apache.org>
Sun, 14 Oct 2001 20:41:00 +0000 (20:41 +0000)
we left the TE header in the output headers, so ap_set_keepalive didn't
set r->chunked to 1.  So, ap_http_header_filter wouldn't insert CHUNK
filter appropriately.  I have no clue how it chunked anything at all
before this patch, but hey, it looks right now.

Tested with Yahoo, Apple, apache.org, and /.
/. is interesting in that it sends both Conn: Close and TE: chunked.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@91463 13f79535-47bb-0310-9956-ffa450edef68

modules/proxy/proxy_http.c

index 87d39fb2ed8ca005d3034248bf17232dfe3149cd..0ede23f30ac12b23fd8993dea8c22befce564d8d 100644 (file)
@@ -792,13 +792,18 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
             (r->status != HTTP_RESET_CONTENT) &&       /* not 205 */
             (r->status != HTTP_NOT_MODIFIED)) {        /* not 304 */
 
-            const char *buf;
-            if (ap_proxy_liststr((buf = apr_table_get(r->headers_out,
-                                  "Transfer-Encoding")), "chunked")) {
-            ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server,
-                         "proxy: Transfer-Encoding Chunked!");
-                apr_table_unset(r->headers_out,"Content-Length");
-            }
+            /* We need to copy the output headers and treat them as input
+             * headers as well.  BUT, we need to do this before we remove
+             * TE and C-L, so that they are preserved accordingly for
+             * ap_http_filter to know where to end.
+             */
+            rp->headers_in = apr_table_copy(r->pool, r->headers_out);
+
+            /* In order for ap_set_keepalive to work properly, we can NOT
+             * have any length information stored in the output headers.
+             */
+            apr_table_unset(r->headers_out,"Transfer-Encoding");
+            apr_table_unset(r->headers_out,"Content-Length");
 
             ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server,
                          "proxy: start body send");
@@ -811,7 +816,6 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
             /* read the body, pass it to the output filters */
                 apr_off_t readbytes;
                 apr_bucket *e;
-                rp->headers_in = r->headers_out;
                 readbytes = AP_IOBUFSIZE;
                 while (ap_get_brigade(rp->input_filters, 
                                        bb,