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:
ruslan%netscape.com
2000-04-15 00:01:23 +00:00
parent 35155abf7c
commit 0378d0baa5
6 changed files with 76 additions and 62 deletions

View File

@@ -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))

View File

@@ -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);

View File

@@ -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-
/*

View File

@@ -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

View File

@@ -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;
}

View File

@@ -104,7 +104,6 @@ public:
protected:
// nsHTTPResponseListener methods...
nsresult FireOnHeadersAvailable();
nsresult FinishedResponseHeaders();
nsresult ParseStatusLine(nsIBufferInputStream* in, PRUint32 aLength,
PRUint32 *aBytesRead);