- From: Kazuho Oku <kazuhooku@gmail.com>
- Date: Mon, 18 Jan 2016 09:48:19 +0900
- To: Martin Thomson <martin.thomson@gmail.com>
- Cc: Ilya Grigorik <ilya@igvita.com>, Stefan Eissing <stefan.eissing@greenbytes.de>, Amos Jeffries <squid3@treenet.co.nz>, HTTP Working Group <ietf-http-wg@w3.org>
Under the premise that we are switching to using an HTTP header, my idea at the moment is to define it like: cache-diges = 1#cache-digest-element cache-digest-element = cache-digest-nv *(OWS ";" OWS cache-digest-nv) cache-digest-nv = fresh-nv / authority-nv fresh-nv = "fresh=" fresh-value fresh-value = BASE64 encoded GCS defined in h2-cache-digest-00 (without padding) authority-nv = "authority=" authority-value authority-value = authority # defined in RFC3986 / wildcard-identifier # defined in RFC 6125 6.4.3 IMO the definition covers most of the requirements of / suggestions provided by many, including the 4 points described below: 1. Cache-Digest can be expressed as a header For example, a Cache-Digest containing https://example.com/style.jss and https://example.com/jquery.js will look like: cache-digest: fresh=AQiZAh8 2. Effective compression with HPACK A client can make the use of HPACK to effectively compress the cache-digest that changes slightly per every HTTP request, by splitting a cache-digest to two headers: a large header that does not change per every request, and a small header that encodes the delta from the large header. For example, a client sends a large cache-digest header in the first HTTP request after establishing an HTTP/2 connection. cache-digest: fresh=ABC...xyz # very large header In the following HTTP requests sent over the same connection, a client will resend the header sent in the first connection, plus a second header containing the delta from the first connection. cache-digest: fresh=ABC...xyz # the same header as above cache-digest: fresh=ax9e # digest containing delta from above 3. Specifying the scope In case the server is known to be authoritative for the entire domain (e.g. wildcard certificate is used), a client can send a cache-digest for all the hosts under that domain, by specifying the `authority` attribute. cache-digest: fresh=xxxxx; authority=*.example.com 4. Possibility to extend the header There has been discussions if we should support an encoding other than GCS, or how we can send cache-digests of a non-fresh resource. The ABNF has a room to support digests other than just the `fresh` digest (that represents the fresh resources within the cache using GCS); for example, we can afterwards define an attribute named `fresh-bf` for representing a digest of fresh resources using bloom filter cache-digest: fresh-bf=... or, we can define an attribute named `if-modified-since` to represent a digest of non-fresh resources, once we agree how they should be hashed. cache-digest: if-modified-since=... 2016-01-15 15:57 GMT+09:00 Martin Thomson <martin.thomson@gmail.com>: > On 15 January 2016 at 17:51, Kazuho Oku <kazuhooku@gmail.com> wrote: >> Considering the fact that such APIs (that are incapable of expressing >> states shared between the requests) exist, I think the semantics >> should be defined in a way that every HTTP request can be complete by >> itself if we are going to send cache digest as a header. > > Yeah, I agree. That doesn't preclude a mechanism that explicitly > creates and references state, but that might be too complex to manage. > Sending the whole table every time isn't great, but let's see if this > is successful enough to warrant further optimization first. -- Kazuho Oku
Received on Monday, 18 January 2016 00:48:49 UTC