mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-17 07:15:46 +00:00
Bug 1484947 - Close the transaction if PR_Read/PR_Write failed, r=nwgh
When PR_Read/PR_White returns -1, we have to use ErrorAccordingToNSPR to get the error code. We need to close the transaction if the real error happens. Differential Revision: https://phabricator.services.mozilla.com/D9674 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
fc9640b527
commit
070976655b
@ -24,6 +24,7 @@
|
||||
#include "nsNetCID.h"
|
||||
#include "nsServiceManagerUtils.h"
|
||||
#include "nsComponentManagerUtils.h"
|
||||
#include "nsSocketTransport2.h"
|
||||
#include "nsSocketTransportService2.h"
|
||||
|
||||
namespace mozilla {
|
||||
@ -134,6 +135,19 @@ TLSFilterTransaction::Close(nsresult aReason)
|
||||
}
|
||||
mTransaction->Close(aReason);
|
||||
mTransaction = nullptr;
|
||||
|
||||
RefPtr<NullHttpTransaction> baseTrans(do_QueryReferent(mWeakTrans));
|
||||
SpdyConnectTransaction *trans = baseTrans
|
||||
? baseTrans->QuerySpdyConnectTransaction()
|
||||
: nullptr;
|
||||
|
||||
LOG(("TLSFilterTransaction::Close %p aReason=%" PRIx32 " trans=%p\n",
|
||||
this, static_cast<uint32_t>(aReason), trans));
|
||||
|
||||
if (trans) {
|
||||
trans->Close(aReason);
|
||||
trans = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
nsresult
|
||||
@ -194,8 +208,15 @@ TLSFilterTransaction::OnReadSegment(const char *aData,
|
||||
// mTransaction ReadSegments actually obscures this code, so
|
||||
// keep it in a member var for this::ReadSegments to insepct. Similar
|
||||
// to nsHttpConnection::mSocketOutCondition
|
||||
mReadSegmentBlocked = (PR_GetError() == PR_WOULD_BLOCK_ERROR);
|
||||
return mReadSegmentBlocked ? NS_BASE_STREAM_WOULD_BLOCK : NS_ERROR_FAILURE;
|
||||
PRErrorCode code = PR_GetError();
|
||||
mReadSegmentBlocked = (code == PR_WOULD_BLOCK_ERROR);
|
||||
if (mReadSegmentBlocked) {
|
||||
return NS_BASE_STREAM_WOULD_BLOCK;
|
||||
}
|
||||
|
||||
nsresult rv = ErrorAccordingToNSPR(code);
|
||||
Close(rv);
|
||||
return rv;
|
||||
}
|
||||
aCount -= written;
|
||||
aData += written;
|
||||
@ -277,10 +298,13 @@ TLSFilterTransaction::OnWriteSegment(char *aData,
|
||||
mFilterReadCode = NS_OK;
|
||||
int32_t bytesRead = PR_Read(mFD, aData, aCount);
|
||||
if (bytesRead == -1) {
|
||||
if (PR_GetError() == PR_WOULD_BLOCK_ERROR) {
|
||||
PRErrorCode code = PR_GetError();
|
||||
if (code == PR_WOULD_BLOCK_ERROR) {
|
||||
return NS_BASE_STREAM_WOULD_BLOCK;
|
||||
}
|
||||
return NS_ERROR_FAILURE;
|
||||
nsresult rv = ErrorAccordingToNSPR(code);
|
||||
Close(rv);
|
||||
return rv;
|
||||
}
|
||||
*outCountRead = bytesRead;
|
||||
|
||||
@ -680,10 +704,12 @@ TLSFilterTransaction::TakeSubTransactions(
|
||||
}
|
||||
|
||||
nsresult
|
||||
TLSFilterTransaction::SetProxiedTransaction(nsAHttpTransaction *aTrans)
|
||||
TLSFilterTransaction::SetProxiedTransaction(nsAHttpTransaction *aTrans,
|
||||
nsAHttpTransaction *aSpdyConnectTransaction)
|
||||
{
|
||||
LOG(("TLSFilterTransaction::SetProxiedTransaction [this=%p] aTrans=%p\n",
|
||||
this, aTrans));
|
||||
LOG(("TLSFilterTransaction::SetProxiedTransaction [this=%p] aTrans=%p, "
|
||||
"aSpdyConnectTransaction=%p\n",
|
||||
this, aTrans, aSpdyConnectTransaction));
|
||||
|
||||
mTransaction = aTrans;
|
||||
nsCOMPtr<nsIInterfaceRequestor> callbacks;
|
||||
@ -693,6 +719,8 @@ TLSFilterTransaction::SetProxiedTransaction(nsAHttpTransaction *aTrans)
|
||||
secCtrl->SetNotificationCallbacks(callbacks);
|
||||
}
|
||||
|
||||
mWeakTrans = do_GetWeakReference(aSpdyConnectTransaction);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -1030,7 +1058,7 @@ SpdyConnectTransaction::MapStreamToHttpConnection(nsISocketTransport *aTransport
|
||||
if (mForcePlainText) {
|
||||
mTunneledConn->ForcePlainText();
|
||||
} else {
|
||||
mTunneledConn->SetupSecondaryTLS();
|
||||
mTunneledConn->SetupSecondaryTLS(this);
|
||||
mTunneledConn->SetInSpdyTunnel(true);
|
||||
}
|
||||
|
||||
|
@ -125,7 +125,8 @@ public:
|
||||
bool forceCommitment) override;
|
||||
MOZ_MUST_USE nsresult GetTransactionSecurityInfo(nsISupports **) override;
|
||||
MOZ_MUST_USE nsresult NudgeTunnel(NudgeTunnelCallback *callback);
|
||||
MOZ_MUST_USE nsresult SetProxiedTransaction(nsAHttpTransaction *aTrans);
|
||||
MOZ_MUST_USE nsresult SetProxiedTransaction(nsAHttpTransaction *aTrans,
|
||||
nsAHttpTransaction *aSpdyConnectTransaction = nullptr);
|
||||
void newIODriver(nsIAsyncInputStream *aSocketIn,
|
||||
nsIAsyncOutputStream *aSocketOut,
|
||||
nsIAsyncInputStream **outSocketIn,
|
||||
@ -156,6 +157,7 @@ private:
|
||||
|
||||
private:
|
||||
RefPtr<nsAHttpTransaction> mTransaction;
|
||||
nsWeakPtr mWeakTrans; // SpdyConnectTransaction *
|
||||
nsCOMPtr<nsISupports> mSecInfo;
|
||||
nsCOMPtr<nsITimer> mTimer;
|
||||
RefPtr<NudgeTunnelCallback> mNudgeCallback;
|
||||
|
@ -789,7 +789,8 @@ nsHttpConnection::Activate(nsAHttpTransaction *trans, uint32_t caps, int32_t pri
|
||||
}
|
||||
|
||||
if (mTLSFilter) {
|
||||
rv = mTLSFilter->SetProxiedTransaction(trans);
|
||||
RefPtr<NullHttpTransaction> baseTrans(do_QueryReferent(mWeakTrans));
|
||||
rv = mTLSFilter->SetProxiedTransaction(trans, baseTrans);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
mTransaction = mTLSFilter;
|
||||
}
|
||||
@ -2095,12 +2096,14 @@ nsHttpConnection::OnSocketReadable()
|
||||
}
|
||||
|
||||
void
|
||||
nsHttpConnection::SetupSecondaryTLS()
|
||||
nsHttpConnection::SetupSecondaryTLS(nsAHttpTransaction *aSpdyConnectTransaction)
|
||||
{
|
||||
MOZ_ASSERT(OnSocketThread(), "not on socket thread");
|
||||
MOZ_ASSERT(!mTLSFilter);
|
||||
LOG(("nsHttpConnection %p SetupSecondaryTLS %s %d\n",
|
||||
this, mConnInfo->Origin(), mConnInfo->OriginPort()));
|
||||
LOG(("nsHttpConnection %p SetupSecondaryTLS %s %d "
|
||||
"aSpdyConnectTransaction=%p\n",
|
||||
this, mConnInfo->Origin(), mConnInfo->OriginPort(),
|
||||
aSpdyConnectTransaction));
|
||||
|
||||
nsHttpConnectionInfo *ci = nullptr;
|
||||
if (mTransaction) {
|
||||
@ -2117,6 +2120,7 @@ nsHttpConnection::SetupSecondaryTLS()
|
||||
if (mTransaction) {
|
||||
mTransaction = mTLSFilter;
|
||||
}
|
||||
mWeakTrans = do_GetWeakReference(aSpdyConnectTransaction);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -215,7 +215,7 @@ public:
|
||||
static MOZ_MUST_USE nsresult MakeConnectString(nsAHttpTransaction *trans,
|
||||
nsHttpRequestHead *request,
|
||||
nsACString &result);
|
||||
void SetupSecondaryTLS();
|
||||
void SetupSecondaryTLS(nsAHttpTransaction *aSpdyConnectTransaction = nullptr);
|
||||
void SetInSpdyTunnel(bool arg);
|
||||
|
||||
// Check active connections for traffic (or not). SPDY connections send a
|
||||
@ -310,6 +310,7 @@ private:
|
||||
// transaction is open, otherwise it is null.
|
||||
RefPtr<nsAHttpTransaction> mTransaction;
|
||||
RefPtr<TLSFilterTransaction> mTLSFilter;
|
||||
nsWeakPtr mWeakTrans; // SpdyConnectTransaction *
|
||||
|
||||
RefPtr<nsHttpHandler> mHttpHandler; // keep gHttpHandler alive
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user