From: Stefan Eissing Date: Fri, 4 Mar 2022 09:49:45 +0000 (+0000) Subject: *) mod_http2: change the port synthesis on upgraded h1 requests X-Git-Tag: 2.5.0-alpha2-ci-test-only~463 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bfb7cdf6bfd8fad9b638df68cfe9ae45041483a8;p=thirdparty%2Fapache%2Fhttpd.git *) mod_http2: change the port synthesis on upgraded h1 requests after review by rpluem. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1898593 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/http2/h2_request.c b/modules/http2/h2_request.c index 69086e0220b..c65f88d3343 100644 --- a/modules/http2/h2_request.c +++ b/modules/http2/h2_request.c @@ -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;