Implement firing of OnStartRequest regardless of the error code but don't
enable it yet till the webshell is fixed. git-svn-id: svn://10.0.0.236/trunk@66041 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -149,7 +149,9 @@ nsSocketTransport::nsSocketTransport():
|
||||
mSocketTimeout (PR_INTERVAL_NO_TIMEOUT),
|
||||
mSocketConnectTimeout (PR_MillisecondsToInterval (DEFAULT_SOCKET_CONNECT_TIMEOUT_IN_MS)),
|
||||
mWasConnected (PR_FALSE) ,
|
||||
mIdleTimeoutInSeconds(0)
|
||||
mIdleTimeoutInSeconds (0),
|
||||
mOnStartWriteFired (PR_FALSE),
|
||||
mOnStartReadFired (PR_FALSE)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
@@ -1811,11 +1813,10 @@ nsSocketTransport::AsyncRead(nsIStreamListener* aListener,
|
||||
|
||||
// Create a marshalling stream listener to receive notifications...
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
{
|
||||
mOnStartReadFired = PR_FALSE;
|
||||
rv = NS_NewAsyncStreamListener(getter_AddRefs(mReadListener),
|
||||
aListener, NS_CURRENT_EVENTQ);
|
||||
|
||||
mOnStartReadFired = PR_FALSE;
|
||||
}
|
||||
|
||||
if (NS_SUCCEEDED(rv))
|
||||
|
||||
@@ -91,6 +91,8 @@ nsHTTPChannel::nsHTTPChannel(nsIURI* i_URL, nsHTTPHandler* i_Handler):
|
||||
mCachedContentIsValid(PR_FALSE),
|
||||
mFiredOnHeadersAvailable(PR_FALSE),
|
||||
mFiredOpenOnStartRequest(PR_FALSE),
|
||||
mFiredResponseOnStartRequest(PR_FALSE),
|
||||
mResponseCompleted(PR_FALSE),
|
||||
mAuthTriedWithPrehost(PR_FALSE),
|
||||
mProxy(0),
|
||||
mProxyPort(-1),
|
||||
@@ -1046,7 +1048,7 @@ nsHTTPChannel::ReadFromCache()
|
||||
rv = mCacheTransport->AsyncRead(listener, mResponseContext);
|
||||
NS_RELEASE(listener);
|
||||
if (NS_FAILED(rv)) {
|
||||
ResponseCompleted(nsnull, rv, 0);
|
||||
ResponseCompleted(rv, 0);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
@@ -1120,6 +1122,9 @@ nsHTTPChannel::CacheReceivedResponse(nsIStreamListener *aListener,
|
||||
rv = mCacheEntry->SetAllowPartial(PR_FALSE);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (securityInfo)
|
||||
mCacheEntry -> SetSecurityInfo (securityInfo);
|
||||
|
||||
// Retrieve the value of the 'Last-Modified:' header, if present
|
||||
PRTime lastModified;
|
||||
PRBool lastModifiedHeaderIsPresent;
|
||||
@@ -1345,7 +1350,7 @@ nsHTTPChannel::Open(void)
|
||||
|
||||
if (NS_FAILED (rv))
|
||||
{
|
||||
ResponseCompleted (mResponseDataListener, rv, nsnull);
|
||||
ResponseCompleted (rv, nsnull);
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
@@ -1466,26 +1471,62 @@ nsresult nsHTTPChannel::Redirect(const char *aNewLocation,
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsHTTPChannel::AssureResponseOnStartFired ()
|
||||
{
|
||||
if (mOpenObserver && !mFiredOpenOnStartRequest)
|
||||
{
|
||||
PR_LOG (gHTTPLog, PR_LOG_ERROR, ("nsHTTPChannel::AssureResponseOnStartFired () [this=%x] "
|
||||
" calling mOpenObserver -> OnStartRequest ()\n",
|
||||
this));
|
||||
|
||||
nsresult nsHTTPChannel::ResponseCompleted(nsIStreamListener *aListener,
|
||||
nsresult aStatus,
|
||||
const PRUnichar* aMsg)
|
||||
mFiredOpenOnStartRequest = PR_TRUE;
|
||||
mOpenObserver -> OnStartRequest (this, mOpenContext);
|
||||
}
|
||||
|
||||
if (mResponseDataListener && !mFiredResponseOnStartRequest)
|
||||
{
|
||||
PR_LOG (gHTTPLog, PR_LOG_ERROR, ("nsHTTPChannel::AssureResponseOnStartFired () [this=%x] "
|
||||
" calling mResponseDataListener -> OnStartRequest ()\n",
|
||||
this));
|
||||
|
||||
mFiredResponseOnStartRequest = PR_TRUE;
|
||||
mResponseDataListener -> OnStartRequest (this, mResponseContext);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult nsHTTPChannel::ResponseCompleted (nsresult aStatus, const PRUnichar* aMsg)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
if (!mResponseCompleted)
|
||||
mResponseCompleted = PR_TRUE;
|
||||
else
|
||||
return rv;
|
||||
|
||||
PR_LOG(gHTTPLog, PR_LOG_ERROR, ("nsHTTPChannel::ResponseComplete () [this=%x] "
|
||||
" mDataListenet=%x, Status=%o\n",
|
||||
this, mResponseDataListener, aStatus));
|
||||
{
|
||||
// ruslan: grab the security info before the transport disappears
|
||||
nsCOMPtr<nsISupports> secInfo;
|
||||
GetSecurityInfo (getter_AddRefs (secInfo)); // this will store it
|
||||
}
|
||||
|
||||
#if 0
|
||||
// XXX/ruslan: waiting on Travis to fix DocShell
|
||||
AssureResponseOnStartFired ();
|
||||
#endif
|
||||
|
||||
//
|
||||
// First:
|
||||
//
|
||||
// Call the consumer OnStopRequest(...) to end the request...
|
||||
if (aListener)
|
||||
if (mResponseDataListener)
|
||||
{
|
||||
rv = aListener -> OnStopRequest (this, mResponseContext, aStatus, aMsg);
|
||||
mFiredResponseOnStartRequest = PR_FALSE;
|
||||
rv = mResponseDataListener -> OnStopRequest (this, mResponseContext, aStatus, aMsg);
|
||||
|
||||
if (NS_FAILED (rv))
|
||||
{
|
||||
@@ -1507,7 +1548,10 @@ nsresult nsHTTPChannel::ResponseCompleted(nsIStreamListener *aListener,
|
||||
// Finally, notify the OpenObserver that the request has completed.
|
||||
//
|
||||
if (mOpenObserver)
|
||||
{
|
||||
mFiredOpenOnStartRequest = PR_FALSE;
|
||||
mOpenObserver -> OnStopRequest (this, mOpenContext, aStatus, aMsg);
|
||||
}
|
||||
|
||||
// Null out pointers that are no longer needed...
|
||||
|
||||
@@ -1731,6 +1775,8 @@ nsHTTPChannel::FinishedResponseHeaders(void)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
AssureResponseOnStartFired ();
|
||||
|
||||
if (mFiredOnHeadersAvailable)
|
||||
return NS_OK;
|
||||
|
||||
@@ -1740,16 +1786,10 @@ nsHTTPChannel::FinishedResponseHeaders(void)
|
||||
("nsHTTPChannel::FinishedResponseHeaders [this=%x].\n",
|
||||
this));
|
||||
|
||||
if (mOpenObserver && !mFiredOpenOnStartRequest) {
|
||||
rv = mOpenObserver->OnStartRequest(this, mOpenContext);
|
||||
mFiredOpenOnStartRequest = PR_TRUE;
|
||||
|
||||
// We want to defer header completion notification until the
|
||||
// caller actually does an AsyncRead();
|
||||
if (!mResponseDataListener)
|
||||
return rv;
|
||||
}
|
||||
if (!mResponseDataListener)
|
||||
return rv;
|
||||
|
||||
AssureResponseOnStartFired ();
|
||||
|
||||
// Notify the consumer that headers are available...
|
||||
OnHeadersAvailable();
|
||||
@@ -1975,7 +2015,7 @@ nsHTTPChannel::ProcessNotModifiedResponse (nsIStreamListener *aListener)
|
||||
|
||||
rv = mCacheTransport->AsyncRead(cacheListener, mResponseContext);
|
||||
if (NS_FAILED(rv)) {
|
||||
ResponseCompleted(cacheListener, rv, nsnull);
|
||||
ResponseCompleted (rv, nsnull);
|
||||
}
|
||||
NS_RELEASE(cacheListener);
|
||||
|
||||
|
||||
@@ -90,8 +90,8 @@ public:
|
||||
nsresult Redirect(const char *aURL,
|
||||
nsIChannel **aResult);
|
||||
|
||||
nsresult ResponseCompleted(nsIStreamListener* aListener,
|
||||
nsresult aStatus,
|
||||
nsresult AssureResponseOnStartFired ();
|
||||
nsresult ResponseCompleted(nsresult aStatus,
|
||||
const PRUnichar* aMsg);
|
||||
|
||||
nsresult SetResponse(nsHTTPResponse* i_pResp);
|
||||
@@ -154,6 +154,8 @@ protected:
|
||||
|
||||
// Called mOpenObserver->OnStartRequest
|
||||
PRBool mFiredOpenOnStartRequest;
|
||||
PRBool mFiredResponseOnStartRequest;
|
||||
PRBool mResponseCompleted;
|
||||
|
||||
// Auth related stuff-
|
||||
/*
|
||||
|
||||
@@ -792,11 +792,7 @@ nsHTTPPipelinedRequest::OnStopRequest (nsIChannel* channel, nsISupports* i_Conte
|
||||
|
||||
while (req)
|
||||
{
|
||||
nsCOMPtr<nsIStreamListener> consumer;
|
||||
req -> mConnection -> GetResponseDataListener (getter_AddRefs (consumer));
|
||||
|
||||
if (consumer)
|
||||
req -> mConnection -> ResponseCompleted (consumer, rv, i_Msg);
|
||||
req -> mConnection -> ResponseCompleted (rv, i_Msg);
|
||||
|
||||
// Notify the HTTPChannel that the request has finished
|
||||
|
||||
|
||||
@@ -137,7 +137,7 @@ nsHTTPCacheListener::OnStartRequest(nsIChannel *aChannel,
|
||||
{
|
||||
PR_LOG (gHTTPLog, PR_LOG_DEBUG, ("nsHTTPCacheListener::OnStartRequest [this=%x]\n", this));
|
||||
|
||||
return mResponseDataListener -> OnStartRequest (mChannel, aContext);
|
||||
return mChannel -> AssureResponseOnStartFired ();
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
@@ -153,7 +153,7 @@ nsHTTPCacheListener::OnStopRequest(nsIChannel *aChannel,
|
||||
// is no socket transport involved nsnull is passed as the
|
||||
// transport...
|
||||
//
|
||||
return mChannel -> ResponseCompleted (mResponseDataListener, aStatus, aErrorMsg);
|
||||
return mChannel -> ResponseCompleted (aStatus, aErrorMsg);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -340,7 +340,7 @@ nsHTTPServerListener::OnDataAvailable(nsIChannel* channel,
|
||||
|
||||
if (statusCode == 304) // no content
|
||||
{
|
||||
rv = FinishedResponseHeaders ();
|
||||
rv = mChannel -> FinishedResponseHeaders ();
|
||||
if (NS_FAILED (rv))
|
||||
return rv;
|
||||
|
||||
@@ -379,7 +379,7 @@ nsHTTPServerListener::OnDataAvailable(nsIChannel* channel,
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = FinishedResponseHeaders ();
|
||||
rv = mChannel -> FinishedResponseHeaders ();
|
||||
if (NS_FAILED (rv))
|
||||
return rv;
|
||||
}
|
||||
@@ -508,7 +508,7 @@ nsHTTPServerListener::OnDataAvailable(nsIChannel* channel,
|
||||
|
||||
if (status != 304 || !mChannel -> mCachedResponse)
|
||||
{
|
||||
mChannel -> ResponseCompleted (mResponseDataListener, NS_OK, nsnull);
|
||||
mChannel -> ResponseCompleted (NS_OK, nsnull);
|
||||
mChannel -> mHTTPServerListener = 0;
|
||||
}
|
||||
|
||||
@@ -611,7 +611,7 @@ nsHTTPServerListener::OnStopRequest (nsIChannel* channel, nsISupports* i_pContex
|
||||
//
|
||||
mHeadersDone = PR_TRUE;
|
||||
if (mResponse) {
|
||||
(void)FinishedResponseHeaders();
|
||||
mChannel -> FinishedResponseHeaders();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -625,7 +625,7 @@ nsHTTPServerListener::OnStopRequest (nsIChannel* channel, nsISupports* i_pContex
|
||||
|
||||
if (status != 304 || !mChannel -> mCachedResponse)
|
||||
{
|
||||
mChannel -> ResponseCompleted (mResponseDataListener, i_Status, i_pMsg);
|
||||
mChannel -> ResponseCompleted (i_Status, i_pMsg);
|
||||
|
||||
mChannel -> mHTTPServerListener = 0;
|
||||
}
|
||||
@@ -680,7 +680,7 @@ nsHTTPServerListener::OnStopRequest (nsIChannel* channel, nsISupports* i_pContex
|
||||
while (NS_SUCCEEDED (mPipelinedRequest -> AdvanceToNextRequest ()))
|
||||
{
|
||||
OnStartRequest (nsnull, nsnull);
|
||||
mChannel -> ResponseCompleted (mResponseDataListener, i_Status, i_pMsg);
|
||||
mChannel -> ResponseCompleted (i_Status, i_pMsg);
|
||||
mChannel -> mHTTPServerListener = 0;
|
||||
}
|
||||
|
||||
@@ -722,7 +722,7 @@ nsresult nsHTTPServerListener::FireSingleOnData(nsIStreamListener *aListener,
|
||||
nsresult rv;
|
||||
|
||||
if (mHeadersDone) {
|
||||
rv = FinishedResponseHeaders();
|
||||
rv = mChannel -> FinishedResponseHeaders();
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (mBytesReceived && mResponseDataListener) {
|
||||
@@ -941,27 +941,3 @@ nsresult nsHTTPServerListener::ParseHTTPHeader(nsIBufferInputStream* in,
|
||||
|
||||
return mResponse->ParseHeader(mHeaderBuffer);
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsHTTPServerListener::FinishedResponseHeaders ()
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
rv = mChannel -> FinishedResponseHeaders ();
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
//
|
||||
// Fire the OnStartRequest notification - now that user data is available
|
||||
//
|
||||
if (NS_SUCCEEDED(rv) && mResponseDataListener)
|
||||
{
|
||||
rv = mResponseDataListener -> OnStartRequest (mChannel, mChannel -> mResponseContext);
|
||||
if (NS_FAILED(rv))
|
||||
{
|
||||
PR_LOG(gHTTPLog, PR_LOG_ERROR, ("\tOnStartRequest [this=%x]. Consumer failed!"
|
||||
"Status: %x\n", this, rv));
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -104,7 +104,6 @@ public:
|
||||
protected:
|
||||
// nsHTTPResponseListener methods...
|
||||
nsresult FireOnHeadersAvailable();
|
||||
nsresult FinishedResponseHeaders();
|
||||
|
||||
nsresult ParseStatusLine(nsIBufferInputStream* in, PRUint32 aLength,
|
||||
PRUint32 *aBytesRead);
|
||||
|
||||
Reference in New Issue
Block a user