> Am 10.02.2022 um 14:00 schrieb Ruediger Pluem <rpl...@apache.org>:
> 
> 
> 
> On 2/10/22 11:59 AM, ic...@apache.org wrote:
>> Author: icing
>> Date: Thu Feb 10 10:59:08 2022
>> New Revision: 1897940
>> 
>> URL: http://svn.apache.org/viewvc?rev=1897940&view=rev
>> Log:
>>  *) mod_http2: :scheme pseudo-header values, not matching the
>>     connection scheme, are forwarded via absolute uris to the
>>     http protocol processing to preserve semantics of the request.
>>     Checks on combinations of pseudo-headers values/absence
>>     have been added as described in RFC 7540.
>>     Fixes <https://github.com/icing/mod_h2/issues/230>.
>> 
>> 
>> Modified:
>>    httpd/httpd/trunk/changes-entries/http2_request_scheme.txt
>>    httpd/httpd/trunk/modules/http2/h2_c2.c
>>    httpd/httpd/trunk/modules/http2/h2_request.c
>>    httpd/httpd/trunk/modules/http2/h2_stream.c
>>    httpd/httpd/trunk/test/modules/http2/test_003_get.py
>> 
> 
>> Modified: httpd/httpd/trunk/modules/http2/h2_request.c
>> URL: 
>> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_request.c?rev=1897940&r1=1897939&r2=1897940&view=diff
>> ==============================================================================
>> --- httpd/httpd/trunk/modules/http2/h2_request.c (original)
>> +++ httpd/httpd/trunk/modules/http2/h2_request.c Thu Feb 10 10:59:08 2022
> 
>> @@ -295,9 +300,30 @@ request_rec *h2_create_request_rec(const
>> 
>>     /* Time to populate r with the data we have. */
>>     r->request_time = req->request_time;
>> -    r->the_request = apr_psprintf(r->pool, "%s %s HTTP/2.0",
>> -                                  req->method, req->path ? req->path : "");
>> -    r->headers_in = apr_table_clone(r->pool, req->headers);
>> +    AP_DEBUG_ASSERT(req->authority);
>> +    if (req->scheme && (ap_cstr_casecmp(req->scheme,
>> +                        ap_ssl_conn_is_ssl(c->master? c->master : c)? 
>> "https" : "http")
>> +                        || !ap_cstr_casecmp("CONNECT", req->method))) {
>> +        /* Client sent a non-matching ':scheme' pseudo header. Forward this
>> +         * via an absolute URI in the request line.
>> +         */
>> +        r->the_request = apr_psprintf(r->pool, "%s %s://%s%s HTTP/2.0",
>> +                                      req->method, req->scheme, 
>> req->authority,
>> +                                      req->path ? req->path : "");
>> +    }
>> +    else if (req->path) {
>> +        r->the_request = apr_psprintf(r->pool, "%s %s HTTP/2.0",
>> +                                      req->method, req->path);
>> +    }
>> +    else {
>> +        /* We should only come here on a request that is errored already.
>> +         * create a request line that passes parsing, we'll die anyway.
>> +         */
>> +        AP_DEBUG_ASSERT(req->http_status != H2_HTTP_STATUS_UNSET);
>> +        r->the_request = apr_psprintf(r->pool, "%s / HTTP/2.0", 
>> req->method);
>> +    }
>> +
>> +    r->headers_in = apr_table_copy(r->pool, req->headers);
> 
> Why no longer cloning? Are all req->headers elements allocated from r->pool 
> anyway and are possible modifications of the headers
> on one side no issue for the other side?

The table itself can be modified during processing. The existing values and 
keys live in stream->pool and that one lives as long as the request. So, a copy 
of the table should suffice, IMO.
> 
>> 
>>     /* Start with r->hostname = NULL, ap_check_request_header() will get it
>>      * form Host: header, otherwise we get complains about port numbers.

Reply via email to