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 <[email protected]> wrote: > Roy? > > On Sep 17, 2013, at 7:07 PM, Yann Ylavic <[email protected]> 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> > >
trunk-draft_ietf_httpbis_p1_messaging_23_section_3.3.3.3.patch
Description: Binary data
