diff --git a/netwerk/protocol/http/src/nsHTTPChannel.cpp b/netwerk/protocol/http/src/nsHTTPChannel.cpp index f4401501fae7..52dcab45ee6d 100644 --- a/netwerk/protocol/http/src/nsHTTPChannel.cpp +++ b/netwerk/protocol/http/src/nsHTTPChannel.cpp @@ -70,7 +70,6 @@ nsHTTPChannel::nsHTTPChannel(nsIURI* i_URL, mLoadAttributes(LOAD_NORMAL), mResponseContext(nsnull), mLoadGroup(nsnull), - mPostStream(nsnull), mAuthTriedWithPrehost(PR_FALSE), mUsingProxy(PR_FALSE) { @@ -104,7 +103,6 @@ nsHTTPChannel::~nsHTTPChannel() //TODO if we keep our copy of mURI, then delete it too. NS_IF_RELEASE(mRequest); NS_IF_RELEASE(mResponse); - NS_IF_RELEASE(mPostStream); NS_IF_RELEASE(mResponseDataListener); mHandler = null_nsCOMPtr(); @@ -140,10 +138,12 @@ NS_IMPL_RELEASE(nsHTTPChannel); NS_IMETHODIMP nsHTTPChannel::IsPending(PRBool *result) { - nsresult rv = NS_ERROR_NULL_POINTER; + nsresult rv; if (mRequest) { rv = mRequest->IsPending(result); + } else { + rv = NS_ERROR_NULL_POINTER; } return rv; } @@ -151,10 +151,20 @@ nsHTTPChannel::IsPending(PRBool *result) NS_IMETHODIMP nsHTTPChannel::Cancel(void) { - nsresult rv = NS_ERROR_NULL_POINTER; + nsresult rv; + + // + // If this channel is currently waiting for a transport to become available. + // Notify the HTTPHandler that this request has been cancelled... + // + if (!mConnected && (HS_WAITING_FOR_OPEN == mState)) { + rv = mHandler->CancelPendingChannel(this); + } if (mRequest) { rv = mRequest->Cancel(); + } else { + rv = NS_ERROR_NULL_POINTER; } return rv; } @@ -162,10 +172,12 @@ nsHTTPChannel::Cancel(void) NS_IMETHODIMP nsHTTPChannel::Suspend(void) { - nsresult rv = NS_ERROR_NULL_POINTER; + nsresult rv; if (mRequest) { rv = mRequest->Suspend(); + } else { + rv = NS_ERROR_NULL_POINTER; } return rv; } @@ -173,10 +185,12 @@ nsHTTPChannel::Suspend(void) NS_IMETHODIMP nsHTTPChannel::Resume(void) { - nsresult rv = NS_ERROR_NULL_POINTER; + nsresult rv; if (mRequest) { rv = mRequest->Resume(); + } else { + rv = NS_ERROR_NULL_POINTER; } return rv; } @@ -297,7 +311,7 @@ nsHTTPChannel::GetContentType(char * *aContentType) *aContentType = nsnull; // - // If the content type has been returned by the server then retern that... + // If the content type has been returned by the server then return that... // if (mContentType.Length()) { *aContentType = mContentType.ToNewCString(); @@ -493,6 +507,53 @@ nsHTTPChannel::GetCharset(char* *o_String) return rv; } +NS_IMETHODIMP +nsHTTPChannel::SetPostDataStream(nsIInputStream* aPostStream) +{ + nsresult rv = NS_OK; + + if (aPostStream && mRequest) { + rv = mRequest->SetPostDataStream(aPostStream); + } else { + rv = NS_ERROR_NULL_POINTER; + } + + return rv; +} + +NS_IMETHODIMP +nsHTTPChannel::GetPostDataStream(nsIInputStream **o_postStream) +{ + nsresult rv = NS_OK; + + if (o_postStream && mRequest) { + rv = mRequest->GetPostDataStream(o_postStream); + } else { + rv = NS_ERROR_NULL_POINTER; + } + + return rv; +} + +NS_IMETHODIMP +nsHTTPChannel::SetAuthTriedWithPrehost(PRBool iTried) +{ + mAuthTriedWithPrehost = iTried; + return NS_OK; +} + +NS_IMETHODIMP +nsHTTPChannel::GetAuthTriedWithPrehost(PRBool* oTried) +{ + if (oTried) + { + *oTried = mAuthTriedWithPrehost; + return NS_OK; + } + else + return NS_ERROR_NULL_POINTER; +} + static NS_DEFINE_IID(kProxyObjectManagerIID, NS_IPROXYEVENT_MANAGER_IID); static NS_DEFINE_CID(kEventQueueService, NS_EVENTQUEUESERVICE_CID); @@ -582,6 +643,7 @@ nsHTTPChannel::Open(void) mState = HS_WAITING_FOR_OPEN; return NS_OK; } + if (NS_FAILED(rv)) return rv; // Check for any modules that want to set headers before we // send out a request. @@ -792,48 +854,6 @@ nsresult nsHTTPChannel::SetCharset(const char *aCharset) } -nsresult -nsHTTPChannel::SetPostDataStream(nsIInputStream* postDataStream) -{ - NS_IF_RELEASE(mPostStream); - mPostStream = postDataStream; - if (mPostStream) - NS_ADDREF(mPostStream); - return NS_OK; -} - -nsresult -nsHTTPChannel::GetPostDataStream(nsIInputStream **o_postStream) -{ - if (o_postStream) - { - *o_postStream = mPostStream; - NS_IF_ADDREF(*o_postStream); - return NS_OK; - } - return NS_ERROR_NULL_POINTER; -} - -NS_IMETHODIMP -nsHTTPChannel::SetAuthTriedWithPrehost(PRBool iTried) -{ - mAuthTriedWithPrehost = iTried; - return NS_OK; -} - -NS_IMETHODIMP -nsHTTPChannel::GetAuthTriedWithPrehost(PRBool* oTried) -{ - if (oTried) - { - *oTried = mAuthTriedWithPrehost; - return NS_OK; - } - else - return NS_ERROR_NULL_POINTER; -} - - nsresult nsHTTPChannel::Authenticate(const char *iChallenge, nsIChannel **oChannel) { diff --git a/netwerk/protocol/http/src/nsHTTPChannel.h b/netwerk/protocol/http/src/nsHTTPChannel.h index 87385e63d68f..d5766de329d9 100644 --- a/netwerk/protocol/http/src/nsHTTPChannel.h +++ b/netwerk/protocol/http/src/nsHTTPChannel.h @@ -101,7 +101,6 @@ protected: PRInt32 mContentLength; nsCString mContentType; nsCString mCharset; - nsIInputStream* mPostStream; nsCOMPtr mOwner; // Auth related stuff- /* diff --git a/netwerk/protocol/http/src/nsHTTPRequest.cpp b/netwerk/protocol/http/src/nsHTTPRequest.cpp index 5c70eec6593e..0ef9fc8ebb80 100644 --- a/netwerk/protocol/http/src/nsHTTPRequest.cpp +++ b/netwerk/protocol/http/src/nsHTTPRequest.cpp @@ -91,6 +91,9 @@ nsHTTPRequest::~nsHTTPRequest() */ } +//////////////////////////////////////////////////////////////////////////////// +// nsISupports methods: + NS_IMPL_ADDREF(nsHTTPRequest); NS_IMPL_RELEASE(nsHTTPRequest); @@ -124,18 +127,21 @@ nsHTTPRequest::QueryInterface(REFNSIID aIID, void** aInstancePtr) NS_IMETHODIMP nsHTTPRequest::IsPending(PRBool *result) { - nsresult rv = NS_ERROR_NULL_POINTER; + nsresult rv = NS_OK; if (mTransport) { rv = mTransport->IsPending(result); + } else { + *result = PR_FALSE; } + return rv; } NS_IMETHODIMP nsHTTPRequest::Cancel(void) { - nsresult rv = NS_ERROR_NULL_POINTER; + nsresult rv = NS_ERROR_FAILURE; if (mTransport) { rv = mTransport->Cancel(); @@ -146,7 +152,7 @@ nsHTTPRequest::Cancel(void) NS_IMETHODIMP nsHTTPRequest::Suspend(void) { - nsresult rv = NS_ERROR_NULL_POINTER; + nsresult rv = NS_ERROR_FAILURE; if (mTransport) { rv = mTransport->Suspend(); @@ -157,7 +163,7 @@ nsHTTPRequest::Suspend(void) NS_IMETHODIMP nsHTTPRequest::Resume(void) { - nsresult rv = NS_ERROR_NULL_POINTER; + nsresult rv = NS_ERROR_FAILURE; if (mTransport) { rv = mTransport->Resume(); @@ -320,66 +326,80 @@ nsresult nsHTTPRequest::WriteRequest(nsIChannel *aTransport, PRBool aIsProxied) return rv; } -NS_METHOD -nsHTTPRequest::Clone(const nsHTTPRequest* *o_Request) const +nsresult nsHTTPRequest::Clone(const nsHTTPRequest* *o_Request) const { return NS_ERROR_FAILURE; } -NS_METHOD -nsHTTPRequest::SetMethod(HTTPMethod i_Method) +nsresult nsHTTPRequest::SetMethod(HTTPMethod i_Method) { mMethod = i_Method; return NS_OK; } -HTTPMethod -nsHTTPRequest::GetMethod(void) const +HTTPMethod nsHTTPRequest::GetMethod(void) const { return mMethod; } -NS_METHOD -nsHTTPRequest::SetPriority() +nsresult nsHTTPRequest::SetPriority() { return NS_ERROR_NOT_IMPLEMENTED; } -NS_METHOD -nsHTTPRequest::GetPriority() +nsresult nsHTTPRequest::GetPriority() { return NS_ERROR_NOT_IMPLEMENTED; } -NS_METHOD -nsHTTPRequest::SetHeader(nsIAtom* i_Header, const char* i_Value) +nsresult nsHTTPRequest::SetHeader(nsIAtom* i_Header, const char* i_Value) { return mHeaders.SetHeader(i_Header, i_Value); } -NS_METHOD -nsHTTPRequest::GetHeader(nsIAtom* i_Header, char* *o_Value) +nsresult nsHTTPRequest::GetHeader(nsIAtom* i_Header, char* *o_Value) { return mHeaders.GetHeader(i_Header, o_Value); } -NS_METHOD -nsHTTPRequest::SetHTTPVersion(HTTPVersion i_Version) +nsresult nsHTTPRequest::SetHTTPVersion(HTTPVersion i_Version) { mVersion = i_Version; return NS_OK; } -NS_METHOD -nsHTTPRequest::GetHTTPVersion(HTTPVersion* o_Version) +nsresult nsHTTPRequest::GetHTTPVersion(HTTPVersion* o_Version) { *o_Version = mVersion; return NS_OK; } +nsresult nsHTTPRequest::SetPostDataStream(nsIInputStream* aStream) +{ + mPostDataStream = aStream; + + return NS_OK; +} + +nsresult nsHTTPRequest::GetPostDataStream(nsIInputStream* *aResult) +{ + nsresult rv = NS_OK; + + if (aResult) { + *aResult = mPostDataStream; + NS_IF_ADDREF(*aResult); + } else { + rv = NS_ERROR_NULL_POINTER; + } + + return rv; +} + +//////////////////////////////////////////////////////////////////////////////// +// nsIStreamObserver methods: NS_IMETHODIMP nsHTTPRequest::OnStartRequest(nsIChannel* channel, nsISupports* i_Context) @@ -474,8 +494,7 @@ nsHTTPRequest::OnStopRequest(nsIChannel* channel, nsISupports* i_Context, } -NS_IMETHODIMP -nsHTTPRequest::SetConnection(nsHTTPChannel* i_Connection) +nsresult nsHTTPRequest::SetConnection(nsHTTPChannel* i_Connection) { mConnection = i_Connection; return NS_OK; diff --git a/netwerk/protocol/http/src/nsHTTPRequest.h b/netwerk/protocol/http/src/nsHTTPRequest.h index bebf301cc41d..890124e6c74d 100644 --- a/netwerk/protocol/http/src/nsHTTPRequest.h +++ b/netwerk/protocol/http/src/nsHTTPRequest.h @@ -59,9 +59,8 @@ class nsHTTPRequest : public nsIStreamObserver, public: - // Constructor and destructor + // Constructor nsHTTPRequest(nsIURI* i_URL=0, HTTPMethod i_Method=HM_GET, nsIChannel* i_Tranport = nsnull); - virtual ~nsHTTPRequest(); NS_DECL_ISUPPORTS NS_DECL_NSISTREAMOBSERVER @@ -79,33 +78,38 @@ public: Similarly getting will for now only get the first occurence. TODO change to get the list. */ - NS_IMETHOD SetHeader(nsIAtom* i_Header, const char* i_Value); - NS_IMETHOD GetHeader(nsIAtom* i_Header, char* *o_Value); + nsresult SetHeader(nsIAtom* i_Header, const char* i_Value); + nsresult GetHeader(nsIAtom* i_Header, char* *o_Value); /* Clone the current request for later use. Release it after you are done. */ - NS_IMETHOD Clone(const nsHTTPRequest* *o_Copy) const; + nsresult Clone(const nsHTTPRequest* *o_Copy) const; - NS_IMETHOD SetHTTPVersion(HTTPVersion i_Version); - NS_IMETHOD GetHTTPVersion(HTTPVersion* o_Version); + nsresult SetHTTPVersion(HTTPVersion i_Version); + nsresult GetHTTPVersion(HTTPVersion* o_Version); - NS_IMETHOD SetMethod(HTTPMethod i_Method); + nsresult SetMethod(HTTPMethod i_Method); HTTPMethod GetMethod(void) const; - NS_IMETHOD SetPriority(); // TODO - NS_IMETHOD GetPriority(); //TODO + nsresult SetPriority(); // TODO + nsresult GetPriority(); //TODO nsresult GetHeaderEnumerator(nsISimpleEnumerator** aResult); - NS_IMETHOD SetConnection(nsHTTPChannel* i_Connection); + nsresult SetConnection(nsHTTPChannel* i_Connection); // Build the actual request string based on the settings. nsresult WriteRequest(nsIChannel *aChannel, PRBool aIsProxied = PR_FALSE); + nsresult GetPostDataStream(nsIInputStream* *aResult); + nsresult SetPostDataStream(nsIInputStream* aStream); + protected: + virtual ~nsHTTPRequest(); + // Use a method string corresponding to the method. const char* MethodToString(HTTPMethod i_Method=HM_GET) {