httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Yann Ylavic <ylavic....@gmail.com>
Subject Re: svn commit: r1524161 - in /httpd/httpd/trunk: CHANGES docs/log-message-tags/next-number modules/http/http_filters.c server/protocol.c
Date Wed, 18 Sep 2013 11:49:57 GMT
S
ame patch plus a (missing) log when the request is blocked in
ap_read_request and minus a spurious semicolon unintentionally added in
ap_http_filter's log.


On Wed, Sep 18, 2013 at 1:14 PM, Jim Jagielski <jim@jagunet.com> wrote:

> Roy?
>
> On Sep 17, 2013, at 7:07 PM, Yann Ylavic <ylavic.dev@gmail.com> wrote:
>
> > The following patch seems to be "draft-ietf-httpbis-p1-messaging-23,
> > section 3.3.3.3" compliant (unlike current code) :
> >
> > </PATCH>
> > Index: server/protocol.c
> > ===================================================================
> > --- server/protocol.c    (revision 1524231)
> > +++ server/protocol.c    (working copy)
> > @@ -1091,6 +1091,8 @@ request_rec *ap_read_request(conn_rec *conn)
> >     }
> >
> >     if (!r->assbackwards) {
> > +        const char *tenc;
> > +
> >         ap_get_mime_headers_core(r, tmp_bb);
> >         if (r->status != HTTP_OK) {
> >             ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00567)
> > @@ -1102,14 +1104,30 @@ request_rec *ap_read_request(conn_rec *conn)
> >             goto traceout;
> >         }
> >
> > -        if (apr_table_get(r->headers_in, "Transfer-Encoding")
> > -            && apr_table_get(r->headers_in, "Content-Length")) {
> > -            /*
> > http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-23#page-31
> > -             * "If a message is received with both a Transfer-Encoding
> and a
> > -             * Content-Length header field, the Transfer-Encoding
> overrides the
> > -             * Content-Length. ... A sender MUST remove the received
> Content-
> > -             * Length field"
> > +        tenc = apr_table_get(r->headers_in, "Transfer-Encoding");
> > +        if (tenc) {
> > +            /*
> http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-23
> > +             * Section 3.3.3.3: "If a Transfer-Encoding header field is
> > +             * present in a request and the chunked transfer coding is
> not
> > +             * the final encoding ...; the server MUST respond with the
> 400
> > +             * (Bad Request) status code and then close the connection".
> >              */
> > +            if (strcasecmp(tenc, "chunked") != 0
> > +                    && !ap_find_last_token(r->pool, tenc, "chunked"))
{
> > +                r->status = HTTP_BAD_REQUEST;
> > +                ap_send_error_response(r, 0);
> > +                ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r);
> > +                ap_run_log_transaction(r);
> > +                apr_brigade_destroy(tmp_bb);
> > +                goto traceout;
> > +            }
> > +
> > +            /*
> http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-23
> > +             * Section 3.3.3.3: "If a message is received with both a
> > +             * Transfer-Encoding and a Content-Length header field, the
> > +             * Transfer-Encoding overrides the Content-Length. ... A
> sender
> > +             * MUST remove the received Content-Length field".
> > +             */
> >             apr_table_unset(r->headers_in, "Content-Length");
> >         }
> >     }
> > Index: modules/http/http_filters.c
> > ===================================================================
> > --- modules/http/http_filters.c    (revision 1524231)
> > +++ modules/http/http_filters.c    (working copy)
> > @@ -224,23 +224,30 @@ apr_status_t ap_http_filter(ap_filter_t *f, apr_bu
> >         lenp = apr_table_get(f->r->headers_in, "Content-Length");
> >
> >         if (tenc) {
> > -            if (!strcasecmp(tenc, "chunked")) {
> > +            if (strcasecmp(tenc, "chunked") == 0
> > +                    || ap_find_last_token(f->r->pool, tenc, "chunked"))
> {
> >                 ctx->state = BODY_CHUNK;
> >             }
> > -            /* test lenp, because it gives another case we can handle */
> > -            else if (!lenp) {
> > -                /* Something that isn't in HTTP, unless some future
> > +            else if (f->r->proxyreq != PROXYREQ_RESPONSE) {
> > +                /* Something that isn't a HTTP request, unless some
> future
> >                  * edition defines new transfer encodings, is
> unsupported.
> >                  */
> >                 ap_log_rerror(
> > -                        APLOG_MARK, APLOG_INFO, 0, f->r,
> > APLOGNO(01585) "Unknown Transfer-Encoding: %s", tenc);
> > +                        APLOG_MARK, APLOG_INFO, 0, f->r,
> > APLOGNO(01585) "Unknown Transfer-Encoding: %s; ", tenc);
> >                 return APR_ENOTIMPL;
> >             }
> >             else {
> > +                /*
> > http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-23
> > +                 * Section 3.3.3.3: "If a Transfer-Encoding header
> field is
> > +                 * present in a response and the chunked transfer
> coding is not
> > +                 * the final encoding, the message body length is
> determined by
> > +                 * reading the connection until it is closed by the
> server."
> > +                 */
> >                 ap_log_rerror(
> > -                        APLOG_MARK, APLOG_WARNING, 0, f->r,
> > APLOGNO(01586) "Unknown Transfer-Encoding: %s; using Content-Length",
> > tenc);
> > +                        APLOG_MARK, APLOG_WARNING, 0, f->r,
> > APLOGNO(01586) "Unknown Transfer-Encoding: %s; using closed
> > connection", tenc);
> >                 tenc = NULL;
> >            }
> > +            lenp = NULL;
> >         }
> >         if (lenp && !tenc) {
> >             char *endstr;
> > </PATCH>
> > <draft-ietf-httpbis-p1-messaging-23-section-3.3.3.3.patch>
>
>

Mime
View raw message