httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From grega...@apache.org
Subject svn commit: r158798 - in httpd/httpd/trunk: CHANGES server/protocol.c
Date Wed, 23 Mar 2005 16:36:46 GMT
Author: gregames
Date: Wed Mar 23 08:36:45 2005
New Revision: 158798

URL: http://svn.apache.org/viewcvs?view=rev&rev=158798
Log:
don't propagate input headers describing a body to a subrequest.  this can cause a
back end server to hang in a read for a body which no longer exists.

Modified:
    httpd/httpd/trunk/CHANGES
    httpd/httpd/trunk/server/protocol.c

Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/CHANGES?view=diff&r1=158797&r2=158798
==============================================================================
--- httpd/httpd/trunk/CHANGES (original)
+++ httpd/httpd/trunk/CHANGES Wed Mar 23 08:36:45 2005
@@ -4,6 +4,9 @@
 
 Changes with Apache 2.1.4
 
+  *) Don't let a subrequest inherit headers describing the original request's
+     body.  [Greg Ames]
+
   *) Fix Windows CompContext buff size miscalculation
      [Allan Edwards]
 

Modified: httpd/httpd/trunk/server/protocol.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/server/protocol.c?view=diff&r1=158797&r2=158798
==============================================================================
--- httpd/httpd/trunk/server/protocol.c (original)
+++ httpd/httpd/trunk/server/protocol.c Wed Mar 23 08:36:45 2005
@@ -987,6 +987,21 @@
     return r;
 }
 
+/* if a request with a body creates a subrequest, clone the original request's
+ * input headers minus any headers pertaining to the body which has already
+ * been read.  out-of-line helper function for ap_set_sub_req_protocol.
+ */
+
+static void clone_headers_no_body(request_rec *rnew,
+                                  const request_rec *r)
+{
+    rnew->headers_in = apr_table_copy(rnew->pool, r->headers_in);
+    apr_table_unset(rnew->headers_in, "Content-Length");
+    apr_table_unset(rnew->headers_in, "Transfer-Encoding");
+    apr_table_unset(rnew->headers_in, "Content-Type");
+    apr_table_unset(rnew->headers_in, "Content-Encoding");
+}        
+
 /*
  * A couple of other functions which initialize some of the fields of
  * a request structure, as appropriate for adjuncts of one kind or another
@@ -1008,7 +1023,15 @@
 
     rnew->status          = HTTP_OK;
 
-    rnew->headers_in      = r->headers_in;
+    /* did the original request have a body?  (e.g. POST w/SSI tags)
+     * if so, make sure the subrequest doesn't inherit body headers
+     */
+    if (r->read_length) {
+        clone_headers_no_body(rnew, r);
+    } else {
+        /* no body (common case).  clone headers the cheap way */
+        rnew->headers_in      = r->headers_in;
+    }
     rnew->subprocess_env  = apr_table_copy(rnew->pool, r->subprocess_env);
     rnew->headers_out     = apr_table_make(rnew->pool, 5);
     rnew->err_headers_out = apr_table_make(rnew->pool, 5);



Mime
View raw message