]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mod_http2: when failing a request, make sure the request_rec fields
authorStefan Eissing <icing@apache.org>
Thu, 29 Jun 2023 10:15:50 +0000 (10:15 +0000)
committerStefan Eissing <icing@apache.org>
Thu, 29 Jun 2023 10:15:50 +0000 (10:15 +0000)
are populated (best effort) for the response generation since this
might access fields in there.
Respect a http_status already assigned during stream processing
for error generation.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1910686 13f79535-47bb-0310-9956-ffa450edef68

modules/http2/h2_request.c

index 2a1d10145b7d8658b60970b68e64530c8474569a..de312e5889522d067b14fa02d9abc7352d57d3eb 100644 (file)
@@ -385,7 +385,11 @@ request_rec *h2_create_request_rec(const h2_request *req, conn_rec *c,
     /* Time to populate r with the data we have. */
     r->request_time = req->request_time;
     AP_DEBUG_ASSERT(req->authority);
-    if (is_connect) {
+    if (req->http_status != H2_HTTP_STATUS_UNSET) {
+        access_status = req->http_status;
+        goto die;
+    }
+    else if (is_connect) {
       /* CONNECT MUST NOT have scheme or path */
         r->the_request = apr_psprintf(r->pool, "%s %s HTTP/2.0",
                                       req->method, req->authority);
@@ -548,6 +552,16 @@ request_rec *h2_create_request_rec(const h2_request *req, conn_rec *c,
     return r;
 
 die:
+    if (!r->method) {
+        /* if we fail early, `r` is not properly initialized for error
+         * processing which accesses fields in message generation.
+         * Make a best effort. */
+        if (!r->the_request) {
+                r->the_request = apr_psprintf(r->pool, "%s %s HTTP/2.0",
+                                      req->method, req->path);
+        }
+        ap_parse_request_line(r);
+    }
     ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, c,
                   "ap_die(%d) for %s", access_status, r->the_request);
     ap_die(access_status, r);