]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
*) mod_http2: change the port synthesis on upgraded h1 requests
authorStefan Eissing <icing@apache.org>
Fri, 4 Mar 2022 09:49:45 +0000 (09:49 +0000)
committerStefan Eissing <icing@apache.org>
Fri, 4 Mar 2022 09:49:45 +0000 (09:49 +0000)
     after review by rpluem.

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

modules/http2/h2_request.c

index 69086e0220b3b53201ccc75b5b7079f824ae5dc4..c65f88d3343492f51c960f08e5d6a91d5ac1bae6 100644 (file)
@@ -94,24 +94,25 @@ apr_status_t h2_request_rcreate(h2_request **preq, apr_pool_t *pool,
      * the URL for the request. r->hostname has stripped any port info that
      * might have been present. Do we need to add it?
      */
-    if (!ap_strchr_c(authority, ':')) {
-        if (r->parsed_uri.port_str) {
-            /* Yes, it was there, add it again. */
-            authority = apr_pstrcat(pool, authority, ":", r->parsed_uri.port_str, NULL);
-        }
-        else if (!r->parsed_uri.hostname && r->server && r->server->port) {
-            /* If there was no hostname in the parsed URL, the URL was relative.
-             * In that case, we restore port from our server->port, if it
-             * is known and not the default port for the scheme. */
-            apr_port_t defport = apr_uri_port_of_scheme(scheme);
-            if (defport != r->server->port) {
-                /* port info missing and port is not default for scheme: append */
-                authority = apr_psprintf(pool, "%s:%d", authority,
-                                         (int)r->server->port);
-            }
+    if (r->parsed_uri.port_str) {
+        /* Yes, it was there, add it again. */
+        authority = apr_pstrcat(pool, authority, ":", r->parsed_uri.port_str, NULL);
+    }
+    else if (r->parsed_uri.hostname) {
+        /* client sent an absolute URI, with no port in the authority.
+         * Use that also in the h2 request. */
+    }
+    else {
+        /* request came in as relative uri, meaning the client did not specify
+         * a port number and we have to guess which one to use. */
+        apr_port_t defport = apr_uri_port_of_scheme(scheme);
+        apr_port_t port = ap_get_server_port(r);
+
+        if (defport != port) {
+            authority = apr_psprintf(pool, "%s:%d", authority, (int)port);
         }
     }
-    
+
     req = apr_pcalloc(pool, sizeof(*req));
     req->method      = apr_pstrdup(pool, r->method);
     req->scheme      = scheme;