On Wed, Jun 22, 2005 at 03:02:50PM -0500, William Rowe wrote:
> Prior to either patch we totally mishandled such requests.  So the
> only question which remains is; which behavior do we prefer?
> As the RFC states this is not acceptable, my gut says reject ANY
> request with both C-L and T-E of non-identity.

I don't see any reason to reject anything, 2616 dictates precisely how 
to handle requests which are malformed in this way.  I do think the 
check against "identity" is actually redundant, though; not least 
because the 2616 errata remove all references to the word.

I think correct behaviour is to just follow the letter of Section 4.4, 
point 3, as below:

                                If a message is received with both a
     Transfer-Encoding header field and a Content-Length header field,
     the latter MUST be ignored.

(and it's also going to be better to check for T-E before C-L since 
99.99% of requests received are not going to have a T-E header so it'll 
fall through slightly quicker)

Index: server/protocol.c
===================================================================
--- server/protocol.c   (revision 192995)
+++ server/protocol.c   (working copy)
@@ -899,16 +899,13 @@
             return r;
         }
 
-        if (apr_table_get(r->headers_in, "Content-Length")) {
-            const char* te = apr_table_get(r->headers_in, "Transfer-Encoding");
-            /*
-             * If the client sent any Transfer-Encoding besides "identity",
-             * the RFC says we MUST ignore the C-L header.  We kill it here
-             * to prevent more work later on in modules like mod_proxy.
-             */
-            if (te && strcasecmp("identity", te) != 0) {
-                apr_table_unset(r->headers_in, "Content-Length");
-            }
+        if (apr_table_get(r->headers_in, "Transfer-Encoding")
+            && apr_table_get(r->headers_in, "Content-Length")) {
+            /* 2616 section 4.4, point 3: "if both Transfer-Encoding
+             * and Content-Length are received, the latter MUST be
+             * ignored"; so unset it here to prevent any confusion
+             * later. */
+            apr_table_unset(r->headers_in, "Content-Length");
         }
     }
     else {


Reply via email to