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>