You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by je...@apache.org on 2004/09/01 19:21:53 UTC

cvs commit: httpd-2.0/modules/proxy proxy_http.c

jerenkrantz    2004/09/01 10:21:53

  Modified:    .        CHANGES
               modules/proxy proxy_http.c
  Log:
  Fix a trio of bugs in how mod_proxy relays requests:
  
  - Fix type error in proxy-sendchunks case that caused an invalid T-E header.
  - Fix data corruption (seen with mod_ssl/mod_proxy combination) due to not
    properly setting aside the body_buckets.
  - Pass along a C-L: 0 if we still have a C-L of 0 after filtering and the
    original request to us had that as well.
  
  Revision  Changes    Path
  1.1580    +9 -0      httpd-2.0/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/CHANGES,v
  retrieving revision 1.1579
  retrieving revision 1.1580
  diff -u -u -r1.1579 -r1.1580
  --- CHANGES	1 Sep 2004 15:14:32 -0000	1.1579
  +++ CHANGES	1 Sep 2004 17:21:52 -0000	1.1580
  @@ -2,6 +2,15 @@
   
     [Remove entries to the current 2.0 section below, when backported]
   
  +  *) mod_proxy: Fix type error that prevents proxy-sendchunks from working.
  +     [Justin Erenkrantz]
  +
  +  *) mod_proxy: Fix data corruption by properly setting aside buckets.
  +     [Justin Erenkrantz]
  +
  +  *) mod_proxy: If a request has a blank body and has a 0 Content-Length
  +     headers, pass that to the proxy.  [Justin Erenkrantz]
  +
     *) Fix the handling of URIs containing %2F when AllowEncodedSlashes
        is enabled.  Previously, such urls would still be rejected with
        404.  [Jeff Trawick]
  
  
  
  1.196     +26 -2     httpd-2.0/modules/proxy/proxy_http.c
  
  Index: proxy_http.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/proxy/proxy_http.c,v
  retrieving revision 1.195
  retrieving revision 1.196
  diff -u -u -r1.195 -r1.196
  --- proxy_http.c	24 Aug 2004 08:24:18 -0000	1.195
  +++ proxy_http.c	1 Sep 2004 17:21:53 -0000	1.196
  @@ -467,7 +467,7 @@
   
       /* If we can send chunks, do so! */
       if (send_chunks) {
  -        const char *te_hdr = "Transfer-Encoding: chunked" CRLF;
  +        const char te_hdr[] = "Transfer-Encoding: chunked" CRLF;
   
           buf = apr_pmemdup(p, te_hdr, sizeof(te_hdr)-1);
           ap_xlate_proto_to_ascii(buf, sizeof(te_hdr)-1);
  @@ -552,6 +552,17 @@
               e = apr_bucket_immortal_create(ASCII_CRLF, 2, c->bucket_alloc);
               APR_BRIGADE_INSERT_TAIL(input_brigade, e);
           }
  +        else {
  +            /* The send_chunks case does not need to be setaside, but this
  +             * case does because we may have transient buckets that may get
  +             * overwritten in the next iteration of the loop.
  +             */
  +            e = APR_BRIGADE_FIRST(input_brigade);
  +            while (e != APR_BRIGADE_SENTINEL(input_brigade)) {
  +                apr_bucket_setaside(e, p);
  +                e = APR_BUCKET_NEXT(e);
  +            }
  +        }
   
           e = apr_bucket_flush_create(c->bucket_alloc);
           APR_BRIGADE_INSERT_TAIL(input_brigade, e);
  @@ -587,11 +598,24 @@
   
           if (bytes) {
               const char *cl_hdr = "Content-Length", *cl_val;
  -            cl_val = apr_off_t_toa(c->pool, bytes);
  +            cl_val = apr_off_t_toa(p, bytes);
               buf = apr_pstrcat(p, cl_hdr, ": ", cl_val, CRLF, NULL);
               ap_xlate_proto_to_ascii(buf, strlen(buf));
               e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc);
               APR_BUCKET_INSERT_AFTER(last_header_bucket, e);
  +        }
  +        else {
  +            /* A client might really have sent a C-L of 0.  Pass it on. */
  +            const char *cl_hdr = "Content-Length", *cl_val;
  +
  +            cl_val = apr_table_get(r->headers_in, cl_hdr);
  +            if (cl_val && cl_val[0] == '0' && cl_val[1] == 0) {
  +                buf = apr_pstrcat(p, cl_hdr, ": ", cl_val, CRLF, NULL);
  +                ap_xlate_proto_to_ascii(buf, strlen(buf));
  +                e = apr_bucket_pool_create(buf, strlen(buf), p,
  +                                           c->bucket_alloc);
  +                APR_BUCKET_INSERT_AFTER(last_header_bucket, e);
  +            }
           }
           status = ap_pass_brigade(origin->output_filters, header_brigade);
           if (status != APR_SUCCESS) {