- From: Yoav Weiss <yoavweiss@google.com>
- Date: Wed, 29 Jul 2020 10:39:43 +0200
- To: Kévin Dunglas <kevin@dunglas.fr>
- Cc: public-web-perf <public-web-perf@w3.org>
- Message-ID: <CAL5BFfXxVFuBJbpeDNeaH20gsOK3D52WSJR9-6LaO+7Z6hiYBw@mail.gmail.com>
Thanks for the proposal! I answered <https://github.com/w3c/preload/pull/149#issuecomment-665523861> on the PR. Let's continue the discussion there :) On Thu, Jul 9, 2020 at 5:01 PM Kévin Dunglas <kevin@dunglas.fr> wrote: > Hi there, > > I opened a Pull Request proposing to add a new attribute to the `Link > rel=preload` HTTP header: https://github.com/w3c/preload/pull/149 > > Here is the rationale (copied from the description of the PR): > > HTTP/2 Server Push is more and more for web APIs as an alternative to > GraphQL and compound documents. Mechanisms such as the ones described in > Internet-Drafts such as Vulcain <https://github.com/dunglas/vulcain> (I'm > the author) or "HTTP-client suggested Push Preference" > <https://tools.ietf.org/html/draft-pot-prefer-push-01> allow clients to > request the server to push relations of the main resource that will be > needed by the client. Some API frameworks also allow to use HTTP/2 Server > Push instead of compound documents > <https://api-platform.com/docs/core/push-relations/>. > > While technologies such as Node.js, Go and Java allow to directly trigger > HTTP/2 Server Pushes (and can the easily implement such mechanisms), many > others including PHP and CGI haven't access to the TCP (or UDP) connection > and depend of the web server to trigger pushes. To do so they use this > specification and set Link rel=preload headers. > > Even when using technologies able to trigger true HTTP/2 Server Pushes, > it's very common for production applications to sit behind reverse proxies > such as Nginx or Apache, and/or optimization proxies such as CloudFlare or > Fastly. > Most proxies use HTTP 1.1 to connect to the upstream server. Even the few > (such as Caddy and Apache) supporting HTTP/2 or H2C don't support (yet) > proxying HTTP/2 Server Pushes. So even in these cases, Link rel=preload > headers are used to trigger the pushes. > > Currently, as very well explained in Apache's documentation > <https://httpd.apache.org/docs/2.4/en/howto/http2.html#push>, most > proxies copy only a few "safe" headers from the explicit request to Push > requests. > > This is a big limitation for HTTP APIs (among other use cases): most of > them require authorization (via cookies or the Authorization header), > content negotiation, and/or custom headers (for instance the Preload, > Fields or Prefer-Push headers defined in the previously mentioned > Internet-Drafts) for more details. See the following Nginx issues: #1817 > <https://trac.nginx.org/nginx/ticket/1817>, #1851 > <https://trac.nginx.org/nginx/ticket/1851>, #1935 > <https://trac.nginx.org/nginx/ticket/1935>. > > A few proxies (such as Caddy v1 <https://caddyserver.com/v1/docs/push>) > allow to configure which headers to pass as a workaround. But having to add > such configuration for every path requiring to pass extra headers isn't > very straightforward. > > In this PR, I propose to add a new attribute to this specification > allowing the developer to indicate to the server which headers to copy. > This approach allows the developer to configure headers to copy on a per > resource basis (and/or any other criteria at the sole discretion of the > app). The application can dynamically indicate which headers to copy (and > so implement its own security policy) without requiring specific > configuration in the web server. > > Examples: > > Copy a few headers: > > Preload: </resource>; rel=preload; as=fetch; pushheaders="Cookie, Accept-Language" > > Copy all headers: > > Preload: </resource>; rel=preload; as=fetch; pushheaders="*" > > The proposed syntax is similar to the one of Access-Control-Allow-Headers > <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers> > . > > What do you think about this proposal? > Best regards, > -- > Kévin Dunglas > > https://dunglas.fr / @dunglas <https://twitter.com/dunglas> > >
Received on Wednesday, 29 July 2020 08:40:23 UTC