> On Jun 18, 2020, at 9:03 AM, Stefan Eissing <stefan.eiss...@greenbytes.de> 
> wrote:
>> Am 18.06.2020 um 16:51 schrieb William A Rowe Jr <wr...@rowe-clan.net>:
>> 
>> 
>>>>>> On 6/18/20 12:09 AM, Roy T. Fielding wrote:
>>>>>>>> On Jun 8, 2020, at 12:56 AM, Ruediger Pluem <rpl...@apache.org> wrote:
>>>>>>>> 
>>>>>>>> I came across the question if we should not reject HTTP protocols >= 
>>>>>>>> 2.0 in the request line when we parse it
>>>>>>>> in ap_parse_request_line.
>>>>>>>> This does not affect mod_http2 if loaded as HTTP/2.0 connections 
>>>>>>>> itself are not parsed via ap_parse_request_line
>>>>>>>> and sending a
>>>>>>>> 
>>>>>>>> GET /something HTTP/2.0
>>>>>>>> 
>>>>>>>> as request line is not a valid way to start a HTTP 2.0 connection and 
>>>>>>>> I doubt that it will be for future major versions.
>> 
>> Correct, it starts an HTTP/1.1 connection, and the response should reflect 
>> HTTP/1.1.
>> 
>>>>>>> That isn't how these things typically work. New protocols are
>>>>>>> advanced with either deliberate backwards-compat or deliberate
>>>>>>> backwards-break, with an expectation that it will either do
>>>>>>> something useful on an older-protocol server or cause a safe
>>>>>>> error in an expected way.
>>>>>>> 
>>>>>>> Hence, we might still see an HTTP/4.0 that is designed to be
>>>>>>> parsed like HTTP/1.1 (by an old server) while at the same time
>>>>>>> work perfectly for a new server. That would be some hefty magic,
>>>>>>> but it remains possible. Likewise, we might want to deploy a
>>>>>>> version of h2 or HTTP/3 that works on unix domain sockets or
>>>>>>> localhost over non-Internet TCP.
>>>>>>> 
>>>>>>> This is why the existing code did not error on protocols >= 2.0.
>>>>>>> Doing so is both unnecessary and counterproductive. If parsing
>>>>>>> fails for some other reason, we want that other reason to be
>>>>>>> in the response (because that's what the new protocol will be
>>>>>>> expecting from an old protocol server). If it doesn't fail, we
>>>>>>> want to provide the successful response because the request
>>>>>>> was deliberately crafted that way to save a round trip.
>>>>>>> 
>>>>>>> Note that the incoming request protocol version should always
>>>>>>> be distinct from any forwarded request protocol or response
>>>>>>> protocol versions.
>> 
>> Precisely. If mod_http2 or quic/mod_http3 can do something with the 
>> connection
>> based on the request line, it's up to them through the hook facility to take 
>> ownership
>> of the connection.
> 
> That is not issue. That works well. 
> 
>> If they cannot/do not, then the core http1 connection/request processors 
>> remain
>> in place and in response to "please speak in HTTP/4.0" this server will 
>> respond,
>> "sure, here is your HTTP/1.1 response" as expected and defined by the RFC.
> 
> There are now several RFCs and they differentiate between HTTP/1.1 transport 
> and
> the pure HTTP semantics. This split is not reflected in our code, yet. We 
> have 
> functions that mix both. Not as a mistake, it's historical.
> 
> ap_parse_request_line() for example, checks the initial HTTP/1.1 request line 
> *and*
> the method names, uri, header_only and other request_rec fields.
> 
> We can either copy the latter into mod_http2 and maintain it in two places or
> have a core function for it to be invoked by mod_http and mod_http2. That 
> seems 
> to be the design decision to make.

I think that is the right way forward, though we have always tried
to minimize overhead for the common case. I guess the extra cycles
are irrelevant now.

> I used ap_parse_request_line() from mod_http2 to *not* duplicate the other 
> code,
> and someone added checks in trunk that imply it only ever gets called for 
> HTTP/1.x.
> So, now it pukes. Which is good, as it brought up this discussion.

Yep. The new RFCs should be "finished" by next month due to HTTP/3
being in WGLC this month.  If anyone's interested:

   https://github.com/httpwg/http-core <https://github.com/httpwg/http-core>
   https://github.com/quicwg/base-drafts <https://github.com/quicwg/base-drafts>

...Roy

Reply via email to