From 23da1752b50568f2c49b1c63c2777ddffddaf6f5 Mon Sep 17 00:00:00 2001 From: sideshowbarker Date: Wed, 14 Aug 2024 04:23:12 -0700 Subject: [PATCH] LibWeb/Fetch: Set HTTP status code on cached responses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change causes HTTP status codes to be set on cached HTTP responses. Otherwise, without this change, no status codes at all are set on cached HTTP responses — which causes all cached responses to default to being loaded/served with a 200 status code. And as a result of that, if the cached response is from a 30x redirect, then without this change, when that cached 30x response is loaded, we don’t follow the redirect — because we see a 200 status, rather than the expected/original 30x. Fixes https://github.com/LadybirdBrowser/ladybird/issues/863 Note that this change also reverts the temporary workaround added in https://github.com/LadybirdBrowser/ladybird/commit/f735c464d3f (https://github.com/LadybirdBrowser/ladybird/pull/899). --- Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp b/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp index e290ce8659e..42828780e69 100644 --- a/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp +++ b/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp @@ -1307,6 +1307,7 @@ public: ByteBuffer body; Infrastructure::Response::BodyInfo body_info; ByteBuffer method; + Infrastructure::Status status; URL::URL url; UnixDateTime current_age; }; @@ -1347,6 +1348,7 @@ public: auto response = Infrastructure::Response::create(realm.vm()); response->set_body(body); response->set_body_info(cached_response.body_info); + response->set_status(cached_response.status); for (auto& [name, value] : cached_response.headers.headers()) { response->header_list()->append(Infrastructure::Header::from_string_pair(name, value)); } @@ -1363,6 +1365,7 @@ public: cached_response->body = response.body()->source().get(); cached_response->body_info = response.body_info(); cached_response->method = MUST(ByteBuffer::copy(http_request.method())); + cached_response->status = response.status(); cached_response->url = http_request.current_url(); cached_response->current_age = UnixDateTime::now(); m_cache.set(http_request.current_url(), move(cached_response)); @@ -1459,10 +1462,6 @@ private: // FIXME: Implement must-understand cache directive } - // FIXME: This is just for now, ad-hoc — not adhering to any particular spec. - if (response.status() == 301 || response.status() == 302 || response.status() == 303 || response.status() == 307 || response.status() == 308) - return false; - // - the no-store cache directive is not present in the response (see Section 5.2.2.5); if (request.cache_mode() == Infrastructure::Request::CacheMode::NoStore) return false;