mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-17 23:35:34 +00:00
Bug 1640091 - Make sure we TRRServiceChannel::mProxyRequest is initialized and used r=kershaw,necko-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D78525
This commit is contained in:
parent
cb3096e639
commit
cc46191834
@ -20,12 +20,12 @@ namespace net {
|
|||||||
// static
|
// static
|
||||||
nsresult ProxyConfigLookup::Create(
|
nsresult ProxyConfigLookup::Create(
|
||||||
std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI,
|
std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI,
|
||||||
uint32_t aProxyResolveFlags) {
|
uint32_t aProxyResolveFlags, nsICancelable** aLookupCancellable) {
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
|
||||||
RefPtr<ProxyConfigLookup> lookUp =
|
RefPtr<ProxyConfigLookup> lookUp =
|
||||||
new ProxyConfigLookup(std::move(aCallback), aURI, aProxyResolveFlags);
|
new ProxyConfigLookup(std::move(aCallback), aURI, aProxyResolveFlags);
|
||||||
return lookUp->DoProxyResolve();
|
return lookUp->DoProxyResolve(aLookupCancellable);
|
||||||
}
|
}
|
||||||
|
|
||||||
ProxyConfigLookup::ProxyConfigLookup(
|
ProxyConfigLookup::ProxyConfigLookup(
|
||||||
@ -37,7 +37,7 @@ ProxyConfigLookup::ProxyConfigLookup(
|
|||||||
|
|
||||||
ProxyConfigLookup::~ProxyConfigLookup() = default;
|
ProxyConfigLookup::~ProxyConfigLookup() = default;
|
||||||
|
|
||||||
nsresult ProxyConfigLookup::DoProxyResolve() {
|
nsresult ProxyConfigLookup::DoProxyResolve(nsICancelable** aLookupCancellable) {
|
||||||
if (!XRE_IsParentProcess()) {
|
if (!XRE_IsParentProcess()) {
|
||||||
RefPtr<ProxyConfigLookup> self = this;
|
RefPtr<ProxyConfigLookup> self = this;
|
||||||
bool result = ProxyConfigLookupChild::Create(
|
bool result = ProxyConfigLookupChild::Create(
|
||||||
@ -77,6 +77,10 @@ nsresult ProxyConfigLookup::DoProxyResolve() {
|
|||||||
getter_AddRefs(proxyRequest));
|
getter_AddRefs(proxyRequest));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (aLookupCancellable) {
|
||||||
|
proxyRequest.forget(aLookupCancellable);
|
||||||
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,14 +22,15 @@ class ProxyConfigLookup final : public nsIProtocolProxyCallback {
|
|||||||
|
|
||||||
static nsresult Create(
|
static nsresult Create(
|
||||||
std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI,
|
std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI,
|
||||||
uint32_t aProxyResolveFlags);
|
uint32_t aProxyResolveFlags,
|
||||||
|
nsICancelable** aLookupCancellable = nullptr);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit ProxyConfigLookup(
|
explicit ProxyConfigLookup(
|
||||||
std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI,
|
std::function<void(nsIProxyInfo*, nsresult)>&& aCallback, nsIURI* aURI,
|
||||||
uint32_t aProxyResolveFlags);
|
uint32_t aProxyResolveFlags);
|
||||||
virtual ~ProxyConfigLookup();
|
virtual ~ProxyConfigLookup();
|
||||||
nsresult DoProxyResolve();
|
nsresult DoProxyResolve(nsICancelable** aLookupCancellable);
|
||||||
|
|
||||||
std::function<void(nsIProxyInfo*, nsresult)> mCallback;
|
std::function<void(nsIProxyInfo*, nsresult)> mCallback;
|
||||||
nsCOMPtr<nsIURI> mURI;
|
nsCOMPtr<nsIURI> mURI;
|
||||||
|
@ -88,6 +88,7 @@ TRRServiceChannel::TRRServiceChannel()
|
|||||||
: HttpAsyncAborter<TRRServiceChannel>(this),
|
: HttpAsyncAborter<TRRServiceChannel>(this),
|
||||||
mTopWindowOriginComputed(false),
|
mTopWindowOriginComputed(false),
|
||||||
mPushedStreamId(0),
|
mPushedStreamId(0),
|
||||||
|
mProxyRequest(nullptr, "TRRServiceChannel::mProxyRequest"),
|
||||||
mCurrentEventTarget(GetCurrentThreadEventTarget()) {
|
mCurrentEventTarget(GetCurrentThreadEventTarget()) {
|
||||||
LOG(("TRRServiceChannel ctor [this=%p]\n", this));
|
LOG(("TRRServiceChannel ctor [this=%p]\n", this));
|
||||||
}
|
}
|
||||||
@ -107,15 +108,21 @@ TRRServiceChannel::Cancel(nsresult status) {
|
|||||||
|
|
||||||
mCanceled = true;
|
mCanceled = true;
|
||||||
mStatus = status;
|
mStatus = status;
|
||||||
if (mProxyRequest) {
|
|
||||||
nsCOMPtr<nsICancelable> proxyRequet;
|
nsCOMPtr<nsICancelable> proxyRequest;
|
||||||
proxyRequet.swap(mProxyRequest);
|
{
|
||||||
|
auto req = mProxyRequest.Lock();
|
||||||
|
proxyRequest.swap(*req);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (proxyRequest) {
|
||||||
NS_DispatchToMainThread(
|
NS_DispatchToMainThread(
|
||||||
NS_NewRunnableFunction(
|
NS_NewRunnableFunction(
|
||||||
"CancelProxyRequest",
|
"CancelProxyRequest",
|
||||||
[proxyRequet, status]() { proxyRequet->Cancel(status); }),
|
[proxyRequest, status]() { proxyRequest->Cancel(status); }),
|
||||||
NS_DISPATCH_NORMAL);
|
NS_DISPATCH_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
CancelNetworkRequest(status);
|
CancelNetworkRequest(status);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
@ -248,21 +255,37 @@ nsresult TRRServiceChannel::ResolveProxy() {
|
|||||||
|
|
||||||
// TODO: bug 1625171. Consider moving proxy resolution to socket process.
|
// TODO: bug 1625171. Consider moving proxy resolution to socket process.
|
||||||
RefPtr<TRRServiceChannel> self = this;
|
RefPtr<TRRServiceChannel> self = this;
|
||||||
|
nsCOMPtr<nsICancelable> proxyRequest;
|
||||||
nsresult rv = ProxyConfigLookup::Create(
|
nsresult rv = ProxyConfigLookup::Create(
|
||||||
[self](nsIProxyInfo* aProxyInfo, nsresult aStatus) {
|
[self](nsIProxyInfo* aProxyInfo, nsresult aStatus) {
|
||||||
self->OnProxyAvailable(nullptr, nullptr, aProxyInfo, aStatus);
|
self->OnProxyAvailable(nullptr, nullptr, aProxyInfo, aStatus);
|
||||||
},
|
},
|
||||||
mURI, mProxyResolveFlags);
|
mURI, mProxyResolveFlags, getter_AddRefs(proxyRequest));
|
||||||
|
|
||||||
if (NS_FAILED(rv)) {
|
if (NS_FAILED(rv)) {
|
||||||
if (!mCurrentEventTarget->IsOnCurrentThread()) {
|
if (!mCurrentEventTarget->IsOnCurrentThread()) {
|
||||||
mCurrentEventTarget->Dispatch(
|
return mCurrentEventTarget->Dispatch(
|
||||||
NewRunnableMethod<nsresult>("TRRServiceChannel::AsyncAbort", this,
|
NewRunnableMethod<nsresult>("TRRServiceChannel::AsyncAbort", this,
|
||||||
&TRRServiceChannel::AsyncAbort, rv),
|
&TRRServiceChannel::AsyncAbort, rv),
|
||||||
NS_DISPATCH_NORMAL);
|
NS_DISPATCH_NORMAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto req = mProxyRequest.Lock();
|
||||||
|
// We only set mProxyRequest if the channel hasn't already been cancelled
|
||||||
|
// on another thread.
|
||||||
|
if (!mCanceled) {
|
||||||
|
*req = proxyRequest.forget();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the channel has been cancelled, we go ahead and cancel the proxy
|
||||||
|
// request right here.
|
||||||
|
if (proxyRequest) {
|
||||||
|
proxyRequest->Cancel(mStatus);
|
||||||
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -288,7 +311,10 @@ TRRServiceChannel::OnProxyAvailable(nsICancelable* request, nsIChannel* channel,
|
|||||||
|
|
||||||
MOZ_ASSERT(mCurrentEventTarget->IsOnCurrentThread());
|
MOZ_ASSERT(mCurrentEventTarget->IsOnCurrentThread());
|
||||||
|
|
||||||
mProxyRequest = nullptr;
|
{
|
||||||
|
auto proxyRequest = mProxyRequest.Lock();
|
||||||
|
*proxyRequest = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ class TRRServiceChannel : public HttpBaseChannel,
|
|||||||
RefPtr<HttpTransactionShell> mTransaction;
|
RefPtr<HttpTransactionShell> mTransaction;
|
||||||
uint32_t mPushedStreamId;
|
uint32_t mPushedStreamId;
|
||||||
RefPtr<HttpTransactionShell> mTransWithPushedStream;
|
RefPtr<HttpTransactionShell> mTransWithPushedStream;
|
||||||
nsCOMPtr<nsICancelable> mProxyRequest;
|
DataMutex<nsCOMPtr<nsICancelable>> mProxyRequest;
|
||||||
nsCOMPtr<nsIEventTarget> mCurrentEventTarget;
|
nsCOMPtr<nsIEventTarget> mCurrentEventTarget;
|
||||||
|
|
||||||
friend class HttpAsyncAborter<TRRServiceChannel>;
|
friend class HttpAsyncAborter<TRRServiceChannel>;
|
||||||
|
Loading…
Reference in New Issue
Block a user