- From: Arthur Sonzogni <notifications@github.com>
- Date: Tue, 15 Jun 2021 09:21:23 -0700
- To: whatwg/fetch <fetch@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/fetch/issues/1253/861639711@github.com>
I took a look at the specification, chromium and Firefox. [Spec](https://fetch.spec.whatwg.org/#network-partition-keys): ``` To determine the network partition key, ============================== given an environment settings object settings, run these steps: 1. Let topLevelOrigin be settings’s top-level origin. 2. If topLevelOrigin is null, then set topLevelOrigin to settings’s top-level creation URL’s origin. 3. Assert: topLevelOrigin is an origin. 4. Let topLevelSite be the result of obtaining a site, given topLevelOrigin. 5 .Let secondKey be null or an implementation-defined value. 6. Return (topLevelSite, secondKey). To determine the network partition key =============================, given request, run these steps: 1. If request’s reserved client is non-null, then return the result of determining the network partition key given request’s reserved client. 2. If request’s client is non-null, then return the result of determining the network partition key given request’s client. Return null. ``` [Firefox](https://github.com/mozilla/gecko-dev/blob/b31b78eea683b0eb341c676adb422cd129909fe9/netwerk/protocol/http/nsHttpChannel.cpp#L4113): ```cpp // Assembles a cache-key from the given pieces of information and |mLoadFlags| void nsHttpChannel::AssembleCacheKey(const char* spec, uint32_t postID, nsACString& cacheKey) { cacheKey.Truncate(); if (mLoadFlags & LOAD_ANONYMOUS) { cacheKey.AssignLiteral("anon&"); } if (postID) { char buf[32]; SprintfLiteral(buf, "id=%x&", postID); cacheKey.Append(buf); } if (!cacheKey.IsEmpty()) { cacheKey.AppendLiteral("uri="); } // Strip any trailing #ref from the URL before using it as the key const char* p = strchr(spec, '#'); if (p) { cacheKey.Append(spec, p - spec); } else { cacheKey.Append(spec); } } ``` [Chrome](https://source.chromium.org/chromium/chromium/src/+/main:net/http/http_cache.cc;l=570;drc=38b4657edd4e8d0d2accdb8964c35f5ee843a75c;bpv=0;bpt=1): ```cpp // static // Generate a key that can be used inside the cache. std::string HttpCache::GenerateCacheKey(const HttpRequestInfo* request) { std::string isolation_key; if (IsSplitCacheEnabled()) { // Prepend the key with |kDoubleKeyPrefix| = "_dk_" to mark it as // double-keyed (and makes it an invalid url so that it doesn't get // confused with a single-keyed entry). Separate the origin and url // with invalid whitespace character |kDoubleKeySeparator|. DCHECK(request->network_isolation_key.IsFullyPopulated()); std::string subframe_document_resource_prefix = request->is_subframe_document_resource ? kSubframeDocumentResourcePrefix : ""; isolation_key = base::StrCat( {kDoubleKeyPrefix, subframe_document_resource_prefix, request->network_isolation_key.ToString(), kDoubleKeySeparator}); } // Strip out the reference, username, and password sections of the URL and // concatenate with the network isolation key if we are splitting the cache. std::string url = isolation_key + HttpUtil::SpecForRequest(request->url); // No valid URL can begin with numerals, so we should not have to worry // about collisions with normal URLs. if (request->upload_data_stream && request->upload_data_stream->identifier()) { url.insert(0, base::StringPrintf("%" PRId64 "/", request->upload_data_stream->identifier())); } return url; } ``` Two observations: 1. Both Chrome and Firefox are keying by form ID. The specification doesn't. If you are happy, I can make a PR to 'officialise' the behavior of both implementers. 2. Firefox is keying the cache by whether the request was make with credentials: ```cpp if (mLoadFlags & LOAD_ANONYMOUS) { cacheKey.AssignLiteral("anon&"); } ``` It means Firefox is already implementing the behavior I need. It means I can both fix the issue AND align Chrome and Firefox at the same time. Wonderful! If you are happy, I can make a PR to update the specification and Chrome. My current Chrome prototype and Firefox are alike two peas in a pod: ```cpp if (request->load_flags & LOAD_DO_NOT_SAVE_COOKIES) { [...] } ``` +CC @kinu FYI (who warned me |includeCredentials| might not be part of the HTTP cache key on Chrome, thanks!) @yutakahirano, @annevk, @mikewest: I need this, so I would be happy to work on it. Would you have some comments? -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/whatwg/fetch/issues/1253#issuecomment-861639711
Received on Tuesday, 15 June 2021 16:21:46 UTC