From 69378c14edd9375ee60b42049963c5ffe1b875e1 Mon Sep 17 00:00:00 2001 From: Valentin Gosu Date: Thu, 2 May 2024 16:34:40 +0000 Subject: [PATCH] Bug 1894206 - Speculative connect for HTTPS upgraded page loads has the wrong originAttributes r=acreskey,necko-reviewers,kershaw When entering www.wikipedia.org in the URL bar, that gets fixed up to being a http URL, and then a speculativeConnect is dispatched. nsHttpHandler::SpeculativeConnectInternal will upgrade the URL to https, but the originAttributes in the network partition key also need to be HTTPS, otherwise the speculative connection will not be used by the connection manager. Differential Revision: https://phabricator.services.mozilla.com/D209213 --- netwerk/protocol/http/nsHttpHandler.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/netwerk/protocol/http/nsHttpHandler.cpp b/netwerk/protocol/http/nsHttpHandler.cpp index 35c2582d4b58..2e5910d6597c 100644 --- a/netwerk/protocol/http/nsHttpHandler.cpp +++ b/netwerk/protocol/http/nsHttpHandler.cpp @@ -2204,12 +2204,8 @@ nsresult nsHttpHandler::SpeculativeConnectInternal( originAttributes = std::move(aOriginAttributes.ref()); } else if (aPrincipal) { originAttributes = aPrincipal->OriginAttributesRef(); - StoragePrincipalHelper::UpdateOriginAttributesForNetworkState( - aURI, originAttributes); } else if (loadContext) { loadContext->GetOriginAttributes(originAttributes); - StoragePrincipalHelper::UpdateOriginAttributesForNetworkState( - aURI, originAttributes); } nsCOMPtr clone; @@ -2222,6 +2218,15 @@ nsresult nsHttpHandler::SpeculativeConnectInternal( } } + if (!aOriginAttributes) { + // We must update the originAttributes with the network state first party + // domain **after** we upgrade aURI to https. + // Otherwise the speculative connection will be keyed by a http URL + // and end up not being used. + StoragePrincipalHelper::UpdateOriginAttributesForNetworkState( + aURI, originAttributes); + } + nsAutoCString scheme; nsresult rv = aURI->GetScheme(scheme); if (NS_FAILED(rv)) return rv;