Changes with Apache 2.4.7
- *) core: draft-ietf-httpbis-p1-messaging-23 corrections regarding
- TE/CL conflicts. [Yann Ylavic <ylavic.dev gmail com>, Jim Jagielski]
-
*) mod_authn_socache: Support optional initialization arguments for
socache providers. [Chris Darroch]
https://svn.apache.org/viewvc?view=revision&revision=1541270
https://svn.apache.org/viewvc?view=revision&revision=1541368
2.4.x patch (plus CHANGES entry above):
- http://people.apache.org/~wrowe/httpd-2.4-r1524192-r1524770-TE-CL-v2.patch
+ http://people.apache.org/~wrowe/httpd-2.4-r1524192-r1524770-TE-CL.patch
+1:
[wrowe asks] Where is verification of (!keepalive)? Do we know the
connection will be closed anytime in the near future?
lenp = apr_table_get(f->r->headers_in, "Content-Length");
if (tenc) {
- if (strcasecmp(tenc, "chunked") == 0 /* fast path */
- || ap_find_last_token(f->r->pool, tenc, "chunked")) {
+ if (!strcasecmp(tenc, "chunked")) {
ctx->state = BODY_CHUNK;
}
- else if (f->r->proxyreq == PROXYREQ_RESPONSE) {
- /* 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."
+ /* test lenp, because it gives another case we can handle */
+ else if (!lenp) {
+ /* Something that isn't in HTTP, unless some future
+ * edition defines new transfer encodings, is unsupported.
*/
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, f->r, APLOGNO(01586)
- "Unknown Transfer-Encoding: %s;"
- " using read-until-close", tenc);
- tenc = NULL;
- }
- else {
- ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, f->r, APLOGNO(01585)
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, f->r, APLOGNO(01585)
"Unknown Transfer-Encoding: %s", tenc);
return bail_out_on_error(ctx, f, HTTP_NOT_IMPLEMENTED);
}
+ else {
+ ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, f->r, APLOGNO(01586)
+ "Unknown Transfer-Encoding: %s; using Content-Length", tenc);
+ tenc = NULL;
+ }
}
- if (lenp) {
+ if (lenp && !tenc) {
char *endstr;
ctx->state = BODY_LENGTH;
}
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)
goto traceout;
}
- 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 /* fast path */
- || ap_find_last_token(r->pool, tenc, "chunked"))) {
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(02539)
- "client sent unknown Transfer-Encoding "
- "(%s): %s", tenc, r->uri);
- r->status = HTTP_BAD_REQUEST;
- conn->keepalive = AP_CONN_CLOSE;
- 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".
- */
+ 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");
}
}