So these cumulative 4 patches, each of which focuses on a different aspect
of the request handling behavior, represent all of the fixes to 2.4.x that
never
made it to 2.2.x. With these proposals adopted, I can propose a nearly
identical backport of the revised request handling logic to both 2.4.x and
2.2.x,
if folks would be kind enough to review these precursors.
Focusing on only ap_parse_uri through ap_read_request functions, I've
attached
the remaining delta between 2.2.x and 2.4.x, for anyone interested. All of
these
differences are to be expected.
On Tue, Aug 23, 2016 at 11:57 AM, <[email protected]> wrote:
> Author: wrowe
> Date: Tue Aug 23 16:57:50 2016
> New Revision: 1757407
>
> URL: http://svn.apache.org/viewvc?rev=1757407&view=rev
> Log:
> The last proposed request handling backport to bring 2.2.x up to 2.4.x
> standards
>
> Modified:
> httpd/httpd/branches/2.2.x/STATUS
>
> Modified: httpd/httpd/branches/2.2.x/STATUS
> URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/
> STATUS?rev=1757407&r1=1757406&r2=1757407&view=diff
> ============================================================
> ==================
> --- httpd/httpd/branches/2.2.x/STATUS (original)
> +++ httpd/httpd/branches/2.2.x/STATUS Tue Aug 23 16:57:50 2016
> @@ -197,12 +197,30 @@ PATCHES PROPOSED TO BACKPORT FROM TRUNK:
> Support custom ErrorDocuments for HTTP 501 and 414 status codes.
> PR: 48357, 57167
> Submitted by: trawick, [Edward Lu <Chaosed0 gmail.com>]
> + Trunk version of patch
> http://svn.apache.org/r1392347
> http://svn.apache.org/r1635762
> Backport:
> https://raw.githubusercontent.com/wrowe/patches/master/
> backport-2.2.x-r1392347-r1635762.patch
> +1: wrowe
>
> + *) core: Limit to ten the number of tolerated empty lines between
> request.
> + Before this commit, the maximum number of empty lines was the same as
> + configured LimitRequestFields, defaulting to 100, which was way too
> much.
> + We now use a fixed/hard limit of 10 (DEFAULT_LIMIT_BLANK_LINES).
> + Exit early on ap_parse_uri failure, and ensure that proto_num and
> protocol
> + is set; this can happen with invalid CONNECT requests.
> + Submitted by: ylavic, rpluem
> + Note: http_request.c changes from this patch and follow-ups
> + r1710105, r1711902 are not applicable to the 2.2.x pipeline.
> + CHANGES is unnecessary, the regression was never released in
> 2.2.x.
> + Trunk version of patch
> + http://svn.apache.org/r1710095
> + http://svn.apache.org/r1727544
> + Backport:
> + https://raw.githubusercontent.com/wrowe/patches/master/
> backport-2.2.x-r1710095-1727544.patch
> + +1: wrowe
> +
>
> PATCHES/ISSUES THAT ARE STALLED
>
>
>
>
--- noblame 2016-08-23 11:55:52.053795974 -0500
+++ ../httpd-2.4-http/noblame 2016-08-22 19:21:10.134673139 -0500
@@ -120,11 +120,11 @@
}
} while ((len <= 0) && (--num_blank_lines >= 0));
-#ifdef AP_DEBUG_THE_REQUEST
- ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
+ if (APLOGrtrace5(r)) {
+ ap_log_rerror(APLOG_MARK, APLOG_TRACE5, 0, r,
"Request received from client: %s",
ap_escape_logitem(r->pool, r->the_request));
-#endif
+ }
r->request_time = apr_time_now();
ll = r->the_request;
@@ -195,8 +195,8 @@
"\n<pre>\n",
ap_escape_html(r->pool, key),
"</pre>\n", NULL));
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "Request header exceeds "
- "LimitRequestFieldSize after merging: %s", key);
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00560) "Request header "
+ "exceeds LimitRequestFieldSize after merging: %s", key);
return 0;
}
@@ -265,7 +265,7 @@
"<pre>\n%.*s\n</pre>\n",
field_name_len(field_escaped),
field_escaped));
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00561)
"Request header exceeds LimitRequestFieldSize%s"
"%.*s",
*field ? ": " : "",
@@ -300,7 +300,7 @@
"<pre>\n%.*s\n</pre>\n",
field_name_len(field_escaped),
field_escaped));
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00562)
"Request header exceeds LimitRequestFieldSize "
"after folding: %.*s",
field_name_len(last_field), last_field);
@@ -329,7 +329,7 @@
apr_table_setn(r->notes, "error-notes",
"The number of request header fields "
"exceeds this server's limit.");
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00563)
"Number of request headers exceeds "
"LimitRequestFields");
return;
@@ -345,11 +345,10 @@
(int)LOG_NAME_MAX_LEN,
ap_escape_html(r->pool,
last_field)));
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00564)
"Request header field is missing ':' "
"separator: %.*s", (int)LOG_NAME_MAX_LEN,
last_field);
-
return;
}
@@ -428,9 +427,11 @@
apr_socket_t *csd;
apr_interval_time_t cur_timeout;
+
apr_pool_create(&p, conn->pool);
apr_pool_tag(p, "request");
r = apr_pcalloc(p, sizeof(request_rec));
+ AP_READ_REQUEST_ENTRY((intptr_t)r, (uintptr_t)conn);
r->pool = p;
r->connection = conn;
r->server = conn->base_server;
@@ -471,19 +472,24 @@
*/
r->used_path_info = AP_REQ_DEFAULT_PATH_INFO;
+ r->useragent_addr = conn->client_addr;
+ r->useragent_ip = conn->client_ip;
+
tmp_bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
+ ap_run_pre_read_request(r, conn);
+
/* Get the request... */
if (!read_request_line(r, tmp_bb)) {
if (r->status == HTTP_REQUEST_URI_TOO_LARGE
|| r->status == HTTP_BAD_REQUEST) {
if (r->status == HTTP_REQUEST_URI_TOO_LARGE) {
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00565)
"request failed: client's request-line exceeds LimitRequestLine (longer than %d)",
r->server->limit_req_line);
}
else if (r->method == NULL) {
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00566)
"request failed: invalid characters in URI");
}
access_status = r->status;
@@ -493,26 +499,27 @@
ap_run_log_transaction(r);
r = NULL;
apr_brigade_destroy(tmp_bb);
- return r;
+ goto traceout;
}
else if (r->status == HTTP_REQUEST_TIME_OUT) {
- ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r);
+ ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, NULL);
if (!r->connection->keepalives) {
ap_run_log_transaction(r);
}
apr_brigade_destroy(tmp_bb);
- return r;
+ goto traceout;
}
apr_brigade_destroy(tmp_bb);
- return NULL;
+ r = NULL;
+ goto traceout;
}
/* We may have been in keep_alive_timeout mode, so toggle back
* to the normal timeout mode as we fetch the header lines,
* as necessary.
*/
- csd = ap_get_module_config(conn->conn_config, &core_module);
+ csd = ap_get_conn_socket(conn);
apr_socket_timeout_get(csd, &cur_timeout);
if (cur_timeout != conn->base_server->timeout) {
apr_socket_timeout_set(csd, conn->base_server->timeout);
@@ -524,13 +531,13 @@
ap_get_mime_headers_core(r, tmp_bb);
if (r->status != HTTP_OK) {
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00567)
"request failed: error reading the headers");
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);
- return r;
+ goto traceout;
}
tenc = apr_table_get(r->headers_in, "Transfer-Encoding");
@@ -543,7 +550,7 @@
*/
if (!(strcasecmp(tenc, "chunked") == 0 /* fast path */
|| ap_find_last_token(r->pool, tenc, "chunked"))) {
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
+ 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;
@@ -552,7 +559,7 @@
ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r);
ap_run_log_transaction(r);
apr_brigade_destroy(tmp_bb);
- return r;
+ goto traceout;
}
/* http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-23
@@ -571,7 +578,7 @@
* headers! Have to dink things just to make sure the error message
* comes through...
*/
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00568)
"client sent invalid HTTP/0.9 request: HEAD %s",
r->uri);
r->header_only = 0;
@@ -580,7 +587,7 @@
ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r);
ap_run_log_transaction(r);
apr_brigade_destroy(tmp_bb);
- return r;
+ goto traceout;
}
}
@@ -613,7 +620,7 @@
* a Host: header, and the server MUST respond with 400 if it doesn't.
*/
access_status = HTTP_BAD_REQUEST;
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00569)
"client sent HTTP/1.1 request without hostname "
"(see RFC2616 section 14.23): %s", r->uri);
}
@@ -633,7 +640,8 @@
ap_die(access_status, r);
ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r);
ap_run_log_transaction(r);
- return NULL;
+ r = NULL;
+ goto traceout;
}
if (((expect = apr_table_get(r->headers_in, "Expect")) != NULL)
@@ -649,15 +657,19 @@
}
else {
r->status = HTTP_EXPECTATION_FAILED;
- ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(00570)
"client sent an unrecognized expectation value of "
"Expect: %s", expect);
ap_send_error_response(r, 0);
ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r);
ap_run_log_transaction(r);
- return r;
+ goto traceout;
}
}
+ AP_READ_REQUEST_SUCCESS((uintptr_t)r, (char *)r->method, (char *)r->uri, (char *)r->server->defn_name, r->status);
+ return r;
+ traceout:
+ AP_READ_REQUEST_FAILURE((uintptr_t)r);
return r;
}