Part 1: network component changes.

This commit is contained in:
wolfbeast 2019-03-07 12:45:54 +01:00 • committed by Roy Tam
commit c8412ad501
8 changed files with 104 additions and 20 deletions

View file

@ -1474,7 +1474,10 @@ pref("network.http.request.max-start-delay", 10);
pref("network.http.request.max-attempts", 10); pref("network.http.request.max-attempts", 10);
// Headers // Headers
pref("network.http.accept.default", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); pref("network.http.accept.default", "*/*");
pref("network.http.accept.navigation", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
pref("network.http.accept.image", "image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5");
pref("network.http.accept.style", "text/css,*/*;q=0.1");
// Prefs allowing granular control of referers // Prefs allowing granular control of referers
// 0=don't send any, 1=send only on clicks, 2=send on image requests as well // 0=don't send any, 1=send only on clicks, 2=send on image requests as well

View file

@ -654,8 +654,13 @@ private:
{ {
nsID channelId; nsID channelId;
nsLoadFlags flags; nsLoadFlags flags;
nsContentPolicyType contentPolicyType =
loadInfo ? loadInfo->GetExternalContentPolicyType()
: nsIContentPolicy::TYPE_OTHER;
if (NS_FAILED(gHttpHandler->NewChannelId(&channelId)) || if (NS_FAILED(gHttpHandler->NewChannelId(&channelId)) ||
NS_FAILED(chan->Init(uri, caps, nullptr, 0, nullptr, channelId)) || NS_FAILED(chan->Init(uri, caps, nullptr, 0, nullptr, channelId, contentPolicyType)) ||
NS_FAILED(chan->SetAllowAltSvc(false)) || NS_FAILED(chan->SetAllowAltSvc(false)) ||
NS_FAILED(chan->SetRedirectMode(nsIHttpChannelInternal::REDIRECT_MODE_ERROR)) || NS_FAILED(chan->SetRedirectMode(nsIHttpChannelInternal::REDIRECT_MODE_ERROR)) ||
NS_FAILED(chan->SetLoadInfo(loadInfo)) || NS_FAILED(chan->SetLoadInfo(loadInfo)) ||

View file

@ -151,7 +151,8 @@ HttpBaseChannel::Init(nsIURI *aURI,
nsProxyInfo *aProxyInfo, nsProxyInfo *aProxyInfo,
uint32_t aProxyResolveFlags, uint32_t aProxyResolveFlags,
nsIURI *aProxyURI, nsIURI *aProxyURI,
const nsID& aChannelId) const nsID& aChannelId,
nsContentPolicyType aContentPolicyType)
{ {
LOG(("HttpBaseChannel::Init [this=%p]\n", this)); LOG(("HttpBaseChannel::Init [this=%p]\n", this));
@ -200,7 +201,7 @@ HttpBaseChannel::Init(nsIURI *aURI,
rv = mRequestHead.SetHeader(nsHttp::Host, hostLine); rv = mRequestHead.SetHeader(nsHttp::Host, hostLine);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
rv = gHttpHandler->AddStandardRequestHeaders(&mRequestHead, isHTTPS); rv = gHttpHandler->AddStandardRequestHeaders(&mRequestHead, isHTTPS, aContentPolicyType);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
nsAutoCString type; nsAutoCString type;

View file

@ -99,7 +99,8 @@ public:
virtual nsresult Init(nsIURI *aURI, uint32_t aCaps, nsProxyInfo *aProxyInfo, virtual nsresult Init(nsIURI *aURI, uint32_t aCaps, nsProxyInfo *aProxyInfo,
uint32_t aProxyResolveFlags, uint32_t aProxyResolveFlags,
nsIURI *aProxyURI, nsIURI *aProxyURI,
const nsID& aChannelId); const nsID& aChannelId,
nsContentPolicyType aContentPolicyType);
// nsIRequest // nsIRequest
NS_IMETHOD GetName(nsACString& aName) override; NS_IMETHOD GetName(nsACString& aName) override;

View file

@ -324,10 +324,16 @@ nsHttpChannel::Init(nsIURI *uri,
nsProxyInfo *proxyInfo, nsProxyInfo *proxyInfo,
uint32_t proxyResolveFlags, uint32_t proxyResolveFlags,
nsIURI *proxyURI, nsIURI *proxyURI,
const nsID& channelId) const nsID& channelId,
nsContentPolicyType aContentPolicyType)
{ {
nsresult rv = HttpBaseChannel::Init(uri, caps, proxyInfo, nsresult rv = HttpBaseChannel::Init(uri,
proxyResolveFlags, proxyURI, channelId); caps,
proxyInfo,
proxyResolveFlags,
proxyURI,
channelId,
aContentPolicyType);
if (NS_FAILED(rv)) if (NS_FAILED(rv))
return rv; return rv;

View file

@ -123,7 +123,8 @@ public:
virtual nsresult Init(nsIURI *aURI, uint32_t aCaps, nsProxyInfo *aProxyInfo, virtual nsresult Init(nsIURI *aURI, uint32_t aCaps, nsProxyInfo *aProxyInfo,
uint32_t aProxyResolveFlags, uint32_t aProxyResolveFlags,
nsIURI *aProxyURI, nsIURI *aProxyURI,
const nsID& aChannelId) override; const nsID& aChannelId,
nsContentPolicyType aContentPolicyType) override;
nsresult OnPush(const nsACString &uri, Http2PushedStream *pushedStream); nsresult OnPush(const nsACString &uri, Http2PushedStream *pushedStream);

View file

@ -468,7 +468,9 @@ nsHttpHandler::InitConnectionMgr()
} }
nsresult nsresult
nsHttpHandler::AddStandardRequestHeaders(nsHttpRequestHead *request, bool isSecure) nsHttpHandler::AddStandardRequestHeaders(nsHttpRequestHead *request,
bool isSecure,
nsContentPolicyType aContentPolicyType)
{ {
nsresult rv; nsresult rv;
@ -481,7 +483,20 @@ nsHttpHandler::AddStandardRequestHeaders(nsHttpRequestHead *request, bool isSecu
// Add the "Accept" header. Note, this is set as an override because the // Add the "Accept" header. Note, this is set as an override because the
// service worker expects to see it. The other "default" headers are // service worker expects to see it. The other "default" headers are
// hidden from service worker interception. // hidden from service worker interception.
rv = request->SetHeader(nsHttp::Accept, mAccept, nsAutoCString accept;
if (aContentPolicyType == nsIContentPolicy::TYPE_DOCUMENT ||
aContentPolicyType == nsIContentPolicy::TYPE_SUBDOCUMENT) {
accept.Assign(mAcceptNavigation);
} else if (aContentPolicyType == nsIContentPolicy::TYPE_IMAGE ||
aContentPolicyType == nsIContentPolicy::TYPE_IMAGESET) {
accept.Assign(mAcceptImage);
} else if (aContentPolicyType == nsIContentPolicy::TYPE_STYLESHEET) {
accept.Assign(mAcceptStyle);
} else {
accept.Assign(mAcceptDefault);
}
rv = request->SetHeader(nsHttp::Accept, accept,
false, nsHttpHeaderArray::eVarietyRequestOverride); false, nsHttpHeaderArray::eVarietyRequestOverride);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
@ -1268,12 +1283,36 @@ nsHttpHandler::PrefsChanged(nsIPrefBranch *prefs, const char *pref)
mQoSBits = (uint8_t) clamped(val, 0, 0xff); mQoSBits = (uint8_t) clamped(val, 0, 0xff);
} }
if (PREF_CHANGED(HTTP_PREF("accept.navigation"))) {
nsXPIDLCString accept;
rv = prefs->GetCharPref(HTTP_PREF("accept.navigation"),
getter_Copies(accept));
if (NS_SUCCEEDED(rv))
SetAccept(accept, ACCEPT_NAVIGATION);
}
if (PREF_CHANGED(HTTP_PREF("accept.image"))) {
nsXPIDLCString accept;
rv = prefs->GetCharPref(HTTP_PREF("accept.image"),
getter_Copies(accept));
if (NS_SUCCEEDED(rv))
SetAccept(accept, ACCEPT_IMAGE);
}
if (PREF_CHANGED(HTTP_PREF("accept.style"))) {
nsXPIDLCString accept;
rv = prefs->GetCharPref(HTTP_PREF("accept.style"),
getter_Copies(accept));
if (NS_SUCCEEDED(rv))
SetAccept(accept, ACCEPT_STYLE);
}
if (PREF_CHANGED(HTTP_PREF("accept.default"))) { if (PREF_CHANGED(HTTP_PREF("accept.default"))) {
nsXPIDLCString accept; nsXPIDLCString accept;
rv = prefs->GetCharPref(HTTP_PREF("accept.default"), rv = prefs->GetCharPref(HTTP_PREF("accept.default"),
getter_Copies(accept)); getter_Copies(accept));
if (NS_SUCCEEDED(rv)) if (NS_SUCCEEDED(rv))
SetAccept(accept); SetAccept(accept, ACCEPT_DEFAULT);
} }
if (PREF_CHANGED(HTTP_PREF("accept-encoding"))) { if (PREF_CHANGED(HTTP_PREF("accept-encoding"))) {
@ -1897,9 +1936,21 @@ nsHttpHandler::SetAcceptLanguages()
} }
nsresult nsresult
nsHttpHandler::SetAccept(const char *aAccept) nsHttpHandler::SetAccept(const char *aAccept, AcceptType aType)
{ {
mAccept = aAccept; switch (aType) {
case ACCEPT_NAVIGATION:
mAcceptNavigation = aAccept;
break;
case ACCEPT_IMAGE:
mAcceptImage = aAccept;
break;
case ACCEPT_STYLE:
mAcceptStyle = aAccept;
break;
case ACCEPT_DEFAULT:
mAcceptDefault = aAccept;
}
return NS_OK; return NS_OK;
} }
@ -2057,7 +2108,11 @@ nsHttpHandler::NewProxiedChannel2(nsIURI *uri,
rv = NewChannelId(&channelId); rv = NewChannelId(&channelId);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
rv = httpChannel->Init(uri, caps, proxyInfo, proxyResolveFlags, proxyURI, channelId); nsContentPolicyType contentPolicyType =
aLoadInfo ? aLoadInfo->GetExternalContentPolicyType()
: nsIContentPolicy::TYPE_OTHER;
rv = httpChannel->Init(uri, caps, proxyInfo, proxyResolveFlags, proxyURI, channelId, contentPolicyType);
if (NS_FAILED(rv)) if (NS_FAILED(rv))
return rv; return rv;

View file

@ -15,6 +15,7 @@
#include "nsCOMPtr.h" #include "nsCOMPtr.h"
#include "nsWeakReference.h" #include "nsWeakReference.h"
#include "nsIContentPolicy.h"
#include "nsIHttpProtocolHandler.h" #include "nsIHttpProtocolHandler.h"
#include "nsIObserver.h" #include "nsIObserver.h"
#include "nsISpeculativeConnect.h" #include "nsISpeculativeConnect.h"
@ -50,6 +51,14 @@ enum FrameCheckLevel {
FRAMECHECK_STRICT FRAMECHECK_STRICT
}; };
// Fetch spec different http Accept types
enum AcceptType {
ACCEPT_NAVIGATION,
ACCEPT_IMAGE,
ACCEPT_STYLE,
ACCEPT_DEFAULT,
};
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// nsHttpHandler - protocol handler for HTTP and HTTPS // nsHttpHandler - protocol handler for HTTP and HTTPS
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -70,7 +79,7 @@ public:
nsHttpHandler(); nsHttpHandler();
nsresult Init(); nsresult Init();
nsresult AddStandardRequestHeaders(nsHttpRequestHead *, bool isSecure); nsresult AddStandardRequestHeaders(nsHttpRequestHead *, bool isSecure, nsContentPolicyType aContentPolicyType);
nsresult AddConnectionHeader(nsHttpRequestHead *, nsresult AddConnectionHeader(nsHttpRequestHead *,
uint32_t capabilities); uint32_t capabilities);
bool IsAcceptableEncoding(const char *encoding, bool isSecure); bool IsAcceptableEncoding(const char *encoding, bool isSecure);
@ -385,7 +394,7 @@ private:
void InitUserAgentComponents(); void InitUserAgentComponents();
void PrefsChanged(nsIPrefBranch *prefs, const char *pref); void PrefsChanged(nsIPrefBranch *prefs, const char *pref);
nsresult SetAccept(const char *); nsresult SetAccept(const char *, AcceptType aType);
nsresult SetAcceptLanguages(); nsresult SetAcceptLanguages();
nsresult SetAcceptEncodings(const char *, bool mIsSecure); nsresult SetAcceptEncodings(const char *, bool mIsSecure);
@ -394,8 +403,8 @@ private:
void NotifyObservers(nsIHttpChannel *chan, const char *event); void NotifyObservers(nsIHttpChannel *chan, const char *event);
static void TimerCallback(nsITimer * aTimer, void * aClosure); static void TimerCallback(nsITimer * aTimer, void * aClosure);
private:
private:
// cached services // cached services
nsMainThreadPtrHandle<nsIIOService> mIOService; nsMainThreadPtrHandle<nsIIOService> mIOService;
nsMainThreadPtrHandle<nsIStreamConverterService> mStreamConvSvc; nsMainThreadPtrHandle<nsIStreamConverterService> mStreamConvSvc;
@ -460,7 +469,10 @@ private:
bool mPipeliningOverSSL; bool mPipeliningOverSSL;
bool mEnforceAssocReq; bool mEnforceAssocReq;
nsCString mAccept; nsCString mAcceptNavigation;
nsCString mAcceptImage;
nsCString mAcceptStyle;
nsCString mAcceptDefault;
nsCString mAcceptLanguages; nsCString mAcceptLanguages;
nsCString mHttpAcceptEncodings; nsCString mHttpAcceptEncodings;
nsCString mHttpsAcceptEncodings; nsCString mHttpsAcceptEncodings;