- From: David Benjamin <davidben@chromium.org>
- Date: Tue, 12 Oct 2021 16:58:11 -0400
- To: Felipe Gasper <felipe@felipegasper.com>
- Cc: Nick Harper <ietf@nharper.org>, Ben Schwartz <bemasc@google.com>, HTTP Working Group <ietf-http-wg@w3.org>
- Message-ID: <CAF8qwaBH5tyD1rRpCdJZ57QtyhyQy4LrX+U1=6T0KGAVR8QQ1Q@mail.gmail.com>
On Tue, Oct 12, 2021 at 4:40 PM Felipe Gasper <felipe@felipegasper.com> wrote: > > > On Oct 12, 2021, at 4:15 PM, Nick Harper <ietf@nharper.org> wrote: > > > > Upgrading a connection from HTTP/1 to HTTP/3 isn't possible since they > use different underlying transports (TCP vs QUIC). > > Oops! Sorry, I meant upgrading to H2. > > > What would be the use case for starting a TLS connection using HTTP/1 > and then later upgrading to HTTP/2, instead of always using HTTP/2 on the > connection? The in-band upgrade mechanism provided for h2c only exists so > that a client without prior knowledge can use h2c; a similar mechanism > isn't needed for h2 (over TLS) because the signal that HTTP/2 is supported > is carried in ALPN. > > We have an application server that only serves H1 right now. We’d like to > be able to add new endpoints using H2 without having to rewrite the entire > thing. > > So: > > https://ourapp.com/legacy-endpoint <--- We’d like not to rewrite this > (for now). > > https://ourapp.com/new-endpoint <--- We’d like to write this in H2. > > The in-band upgrade mechanism for h2c trivially allows this since the URL > is part of the client’s first sent line, but it doesn’t seem like the > ALPN-based negotiation can allow that … or is there some way for the client > to send the URL during the TLS handshake? > No, something like this wouldn't really work for what HTTP/2 is trying to do in the first place. One of the biggest benefits of newer protocols like HTTP/2 and HTTP/3 is better use of the network via connection reuse. That means that switching protocols on a request-by-request basis doesn't really work. As a client, once a suitable HTTP/2 or HTTP/3 connection is available, incoming requests will go to that connection. If clients probed the server with a new connection first, we'd negate all the benefits. The in-band upgrade didn't give you this property either. (The in-band upgrade is getting removed in http2bis because no one implemented it, so I'm guessing you haven't tested this?) Even if it is initiated by something URL-triggered, the end result is an HTTP/2 connection. So, suppose you hit /new-endpoint and upgraded to HTTP/2. The client now has an HTTP/2 connection available, so when you go to hit /legacy-endpoint, it would reuse that HTTP/2 connection rather than making a new one. Your HTTP/2 server continues to be responsible for /legacy-endpoint. If porting the legacy endpoints to the new application server is difficult, I think the best solution is for your HTTP/2 frontend to forward the legacy endpoints to the old application server, while speaking HTTP/2 to the client. This lets you apply the benefits of HTTP/2 across your entire origin. David
Received on Tuesday, 12 October 2021 20:59:40 UTC