Files
Mozilla/mozilla/netwerk/protocol/http/src/nsHTTPRequest.cpp
valeski%netscape.com fa400cb631 added header removal functionality and various return value checks
git-svn-id: svn://10.0.0.236/trunk@33562 18797224-902f-48f8-a5cc-f745e15eee43
1999-06-03 20:04:07 +00:00

941 lines
20 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsIUrl.h"
#include "nsHTTPRequest.h"
#include "nsVoidArray.h"
#include "nsHeaderPair.h"
#include "kHTTPHeaders.h"
#include "nsHTTPEnums.h"
#include "nsIByteBufferInputStream.h"
#include "plstr.h"
#include "nsString.h"
#include "nsITransport.h"
#include "nsHTTPConnection.h"
#include "nsHTTPResponseListener.h"
#include "nsCRT.h"
nsHTTPRequest::nsHTTPRequest(nsIUrl* i_pURL, HTTPMethod i_Method, nsITransport* i_pTransport):
m_pURI(i_pURL),
m_Method(i_Method),
m_pArray(new nsVoidArray()),
m_Version(HTTP_ONE_ZERO),
m_Request(nsnull),
m_pTransport(i_pTransport),
mRefCnt(0)
{
//Build();
}
nsHTTPRequest::~nsHTTPRequest()
{
if (m_Request)
{
delete[] m_Request;
m_Request = 0;
}
if (m_pArray)
{
delete m_pArray;
m_pArray = 0;
}
if (m_Request)
{
delete m_Request;
m_Request = 0;
}
if (m_pTransport)
NS_RELEASE(m_pTransport);
/*
if (m_pConnection)
NS_RELEASE(m_pConnection);
*/
}
NS_IMPL_ADDREF(nsHTTPRequest);
nsresult
nsHTTPRequest::Build()
{
if (m_Request)
NS_ERROR("Request already built!");
nsresult rv = NS_NewByteBufferInputStream(&m_Request);
if (NS_SUCCEEDED(rv))
{
char lineBuffer[1024]; // verify this length!
PRUint32 bytesWritten = 0;
// Do the first line
const char* methodString = MethodToString(m_Method);
PL_strncpyz(lineBuffer, methodString, PL_strlen(methodString) +1);
const char* filename;
NS_ASSERTION(m_pURI, "No URL to build request for!");
rv = m_pURI->GetPath(&filename);
PL_strcat(lineBuffer, filename);
PL_strcat(lineBuffer, " HTTP/1.0");
PL_strcat(lineBuffer, CRLF);
rv = m_Request->Fill(lineBuffer, PL_strlen(lineBuffer), &bytesWritten);
if (NS_FAILED(rv)) return rv;
/* switch (m_Method)
{
case HM_GET:
PL_strncpy(lineBuffer, MethodToString(m_Method)
break;
case HM_DELETE:
case HM_HEAD:
case HM_INDEX:
case HM_LINK:
case HM_OPTIONS:
case HM_POST:
case HM_PUT:
case HM_PATCH:
case HM_TRACE:
case HM_UNLINK:
NS_ERROR_NOT_IMPLEMENTED;
break;
default: NS_ERROR("No method set on request!");
break;
}
*/
// Write the request method and HTTP version
// Add additional headers if any
NS_ASSERTION(m_pArray, "header array is null");
for (PRInt32 i = m_pArray->Count() - 1; i >= 0; --i)
{
nsHeaderPair* element = NS_STATIC_CAST(nsHeaderPair*, m_pArray[i]);
//Copy header, put a ": " and then the value + LF
// sprintf would be easier... todo change
nsString lineBuffStr;
element->atom->ToString(lineBuffStr);
lineBuffStr.Append(": ");
lineBuffStr.Append((const nsString&)*element->value);
lineBuffStr.Append(CRLF);
NS_ASSERTION((lineBuffStr.Length() <= 1024), "Increase line buffer length!");
lineBuffStr.ToCString(lineBuffer, lineBuffStr.Length());
lineBuffer[lineBuffStr.Length()] = '\0';
rv = m_Request->Fill(lineBuffer, PL_strlen(lineBuffer), &bytesWritten);
if (NS_FAILED(rv)) return rv;
lineBuffer[0] = '\0';
}
// Send the final \n
lineBuffer[0] = CR;
lineBuffer[1] = LF;
lineBuffer[2] = '\0';
rv = m_Request->Fill(lineBuffer, PL_strlen(lineBuffer), &bytesWritten);
if (NS_FAILED(rv)) return rv;
}
return rv;
}
nsresult
nsHTTPRequest::QueryInterface(REFNSIID aIID, void** aInstancePtr)
{
if (NULL == aInstancePtr)
return NS_ERROR_NULL_POINTER;
*aInstancePtr = NULL;
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
if (aIID.Equals(nsIHTTPRequest::GetIID())) {
*aInstancePtr = (void*) ((nsIHTTPRequest*)this);
NS_ADDREF_THIS();
return NS_OK;
}
if (aIID.Equals(nsIStreamObserver::GetIID())) {
*aInstancePtr = (void*) ((nsIStreamObserver*)this);
NS_ADDREF_THIS();
return NS_OK;
}
if (aIID.Equals(nsIHTTPCommonHeaders::GetIID())) {
*aInstancePtr = (void*) ((nsIHTTPCommonHeaders*)this);
NS_ADDREF_THIS();
return NS_OK;
}
if (aIID.Equals(nsIHeader::GetIID())) {
*aInstancePtr = (void*) ((nsIHeader*)this);
NS_ADDREF_THIS();
return NS_OK;
}
return NS_NOINTERFACE;
}
NS_IMPL_RELEASE(nsHTTPRequest);
//TODO make these inlines...
NS_METHOD
nsHTTPRequest::SetAllow(const char* i_Value)
{
return SetHeader(kHH_ALLOW, i_Value);
}
NS_METHOD
nsHTTPRequest::GetAllow(const char* *o_Value) const
{
return GetHeader(kHH_ALLOW, o_Value);
}
NS_METHOD
nsHTTPRequest::SetContentBase(const char* i_Value)
{
return SetHeader(kHH_CONTENT_BASE, i_Value);
}
NS_METHOD
nsHTTPRequest::GetContentBase(const char* *o_Value) const
{
return GetHeader(kHH_CONTENT_BASE, o_Value);
}
NS_METHOD
nsHTTPRequest::SetContentEncoding(const char* i_Value)
{
return SetHeader(kHH_CONTENT_ENCODING, i_Value);
}
NS_METHOD
nsHTTPRequest::GetContentEncoding(const char* *o_Value) const
{
return GetHeader(kHH_CONTENT_ENCODING, o_Value);
}
NS_METHOD
nsHTTPRequest::SetContentLanguage(const char* i_Value)
{
return SetHeader(kHH_CONTENT_LANGUAGE, i_Value);
}
NS_METHOD
nsHTTPRequest::GetContentLanguage(const char* *o_Value) const
{
return GetHeader(kHH_CONTENT_LANGUAGE, o_Value);
}
NS_METHOD
nsHTTPRequest::SetContentLength(const char* i_Value)
{
return SetHeader(kHH_CONTENT_LENGTH, i_Value);
}
NS_METHOD
nsHTTPRequest::GetContentLength(const char* *o_Value) const
{
return GetHeader(kHH_CONTENT_LENGTH, o_Value);
}
NS_METHOD
nsHTTPRequest::SetContentLocation(const char* i_Value)
{
return SetHeader(kHH_CONTENT_LOCATION, i_Value);
}
NS_METHOD
nsHTTPRequest::GetContentLocation(const char* *o_Value) const
{
return GetHeader(kHH_CONTENT_LOCATION, o_Value);
}
NS_METHOD
nsHTTPRequest::SetContentMD5(const char* i_Value)
{
return SetHeader(kHH_CONTENT_MD5, i_Value);
}
NS_METHOD
nsHTTPRequest::GetContentMD5(const char* *o_Value) const
{
return GetHeader(kHH_CONTENT_MD5, o_Value);
}
NS_METHOD
nsHTTPRequest::SetContentRange(const char* i_Value)
{
return SetHeader(kHH_CONTENT_RANGE, i_Value);
}
NS_METHOD
nsHTTPRequest::GetContentRange(const char* *o_Value) const
{
return GetHeader(kHH_CONTENT_RANGE, o_Value);
}
NS_METHOD
nsHTTPRequest::SetContentTransferEncoding(const char* i_Value)
{
return SetHeader(kHH_CONTENT_TRANSFER_ENCODING, i_Value);
}
NS_METHOD
nsHTTPRequest::GetContentTransferEncoding(const char* *o_Value) const
{
return GetHeader(kHH_CONTENT_TRANSFER_ENCODING, o_Value);
}
NS_METHOD
nsHTTPRequest::SetContentType(const char* i_Value)
{
return SetHeader(kHH_CONTENT_TYPE, i_Value);
}
NS_METHOD
nsHTTPRequest::GetContentType(const char* *o_Value) const
{
return GetHeader(kHH_CONTENT_TYPE, o_Value);
}
NS_METHOD
nsHTTPRequest::SetDerivedFrom(const char* i_Value)
{
return SetHeader(kHH_DERIVED_FROM, i_Value);
}
NS_METHOD
nsHTTPRequest::GetDerivedFrom(const char* *o_Value) const
{
return GetHeader(kHH_DERIVED_FROM, o_Value);
}
NS_METHOD
nsHTTPRequest::SetETag(const char* i_Value)
{
return SetHeader(kHH_ETAG, i_Value);
}
NS_METHOD
nsHTTPRequest::GetETag(const char* *o_Value) const
{
return GetHeader(kHH_ETAG, o_Value);
}
NS_METHOD
nsHTTPRequest::SetExpires(const char* i_Value)
{
return SetHeader(kHH_EXPIRES, i_Value);
}
NS_METHOD
nsHTTPRequest::GetExpires(const char* *o_Value) const
{
return GetHeader(kHH_EXPIRES, o_Value);
}
NS_METHOD
nsHTTPRequest::SetLastModified(const char* i_Value)
{
return SetHeader(kHH_LAST_MODIFIED, i_Value);
}
NS_METHOD
nsHTTPRequest::GetLastModified(const char* *o_Value) const
{
return GetHeader(kHH_LAST_MODIFIED, o_Value);
}
NS_METHOD
nsHTTPRequest::SetLink(const char* i_Value)
{
return SetHeader(kHH_LINK, i_Value);
}
NS_METHOD
nsHTTPRequest::GetLink(const char* *o_Value) const
{
return GetHeader(kHH_LINK, o_Value);
}
NS_METHOD
nsHTTPRequest::GetLinkMultiple(
const char** *o_ValueArray,
int count) const
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_METHOD
nsHTTPRequest::SetTitle(const char* i_Value)
{
return SetHeader(kHH_TITLE, i_Value);
}
NS_METHOD
nsHTTPRequest::GetTitle(const char* *o_Value) const
{
return GetHeader(kHH_TITLE, o_Value);
}
NS_METHOD
nsHTTPRequest::SetURI(const char* i_Value)
{
return SetHeader(kHH_URI, i_Value);
}
NS_METHOD
nsHTTPRequest::GetURI(const char* *o_Value) const
{
return GetHeader(kHH_URI, o_Value);
}
NS_METHOD
nsHTTPRequest::SetVersion(const char* i_Value)
{
return SetHeader(kHH_VERSION, i_Value);
}
NS_METHOD
nsHTTPRequest::GetVersion(const char* *o_Value) const
{
return GetHeader(kHH_VERSION, o_Value);
}
NS_METHOD
nsHTTPRequest::SetConnection(const char* i_Value)
{
return SetHeader(kHH_CONNECTION, i_Value);
}
NS_METHOD
nsHTTPRequest::GetConnection(const char* *o_Value) const
{
return GetHeader(kHH_CONNECTION, o_Value);
}
NS_METHOD
nsHTTPRequest::SetDate(const char* i_Value)
{
return SetHeader(kHH_DATE, i_Value);
}
NS_METHOD
nsHTTPRequest::GetDate(const char* *o_Value) const
{
return GetHeader(kHH_DATE, o_Value);
}
NS_METHOD
nsHTTPRequest::SetPragma(const char* i_Value)
{
return SetHeader(kHH_PRAGMA,i_Value);
}
NS_METHOD
nsHTTPRequest::GetPragma(const char* *o_Value) const
{
return GetHeader(kHH_PRAGMA,o_Value);
}
NS_METHOD
nsHTTPRequest::SetForwarded(const char* i_Value)
{
return SetHeader(kHH_FORWARDED,i_Value);
}
NS_METHOD
nsHTTPRequest::GetForwarded(const char* *o_Value) const
{
return GetHeader(kHH_FORWARDED,o_Value);
}
NS_METHOD
nsHTTPRequest::SetMessageID(const char* i_Value)
{
return SetHeader(kHH_MESSAGE_ID,i_Value);
}
NS_METHOD
nsHTTPRequest::GetMessageID(const char* *o_Value) const
{
return GetHeader(kHH_MESSAGE_ID,o_Value);
}
NS_METHOD
nsHTTPRequest::SetMIME(const char* i_Value)
{
return SetHeader(kHH_MIME,i_Value);
}
NS_METHOD
nsHTTPRequest::GetMIME(const char* *o_Value) const
{
return GetHeader(kHH_MIME,o_Value);
}
NS_METHOD
nsHTTPRequest::SetTrailer(const char* i_Value)
{
return SetHeader(kHH_TRAILER,i_Value);
}
NS_METHOD
nsHTTPRequest::GetTrailer(const char* *o_Value) const
{
return GetHeader(kHH_TRAILER,o_Value);
}
NS_METHOD
nsHTTPRequest::SetTransfer(const char* i_Value)
{
return SetHeader(kHH_TRANSFER,i_Value);
}
NS_METHOD
nsHTTPRequest::GetTransfer(const char* *o_Value) const
{
return GetHeader(kHH_TRANSFER,o_Value);
}
// Methods from nsIHTTPRequest
NS_METHOD
nsHTTPRequest::SetAccept(const char* i_Value)
{
return SetHeader(kHH_ACCEPT,i_Value);
}
NS_METHOD
nsHTTPRequest::GetAccept(const char* *o_Value) const
{
return GetHeader(kHH_ACCEPT,o_Value);
}
NS_METHOD
nsHTTPRequest::SetAcceptChar(const char* i_Value)
{
return SetHeader(kHH_ACCEPT_CHAR,i_Value);
}
NS_METHOD
nsHTTPRequest::GetAcceptChar(const char* *o_Value) const
{
return GetHeader(kHH_ACCEPT_CHAR,o_Value);
}
NS_METHOD
nsHTTPRequest::SetAcceptEncoding(const char* i_Value)
{
return SetHeader(kHH_ACCEPT_ENCODING,i_Value);
}
NS_METHOD
nsHTTPRequest::GetAcceptEncoding(const char* *o_Value) const
{
return GetHeader(kHH_ACCEPT_ENCODING,o_Value);
}
NS_METHOD
nsHTTPRequest::SetAcceptLanguage(const char* i_Value)
{
return SetHeader(kHH_ACCEPT_LANGUAGE,i_Value);
}
NS_METHOD
nsHTTPRequest::GetAcceptLanguage(const char* *o_Value) const
{
return GetHeader(kHH_ACCEPT_LANGUAGE,o_Value);
}
NS_METHOD
nsHTTPRequest::SetAuthentication(const char* i_Value)
{
return SetHeader(kHH_AUTHENTICATION,i_Value);
}
NS_METHOD
nsHTTPRequest::GetAuthentication(const char* *o_Value) const
{
return GetHeader(kHH_AUTHENTICATION,o_Value);
}
NS_METHOD
nsHTTPRequest::SetExpect(const char* i_Value)
{
return SetHeader(kHH_EXPECT,i_Value);
}
NS_METHOD
nsHTTPRequest::GetExpect(const char** o_Value) const
{
return GetHeader(kHH_EXPECT, o_Value);
}
NS_METHOD
nsHTTPRequest::SetFrom(const char* i_Value)
{
return SetHeader(kHH_FROM,i_Value);
}
NS_METHOD
nsHTTPRequest::GetFrom(const char** o_Value) const
{
return GetHeader(kHH_FROM,o_Value);
}
/*
This is the actual Host for connection. Not necessarily the
host in the url (as in the cases of proxy connection)
*/
NS_METHOD
nsHTTPRequest::SetHost(const char* i_Value)
{
return SetHeader(kHH_HOST,i_Value);
}
NS_METHOD
nsHTTPRequest::GetHost(const char** o_Value) const
{
return GetHeader(kHH_HOST, o_Value);
}
NS_METHOD
nsHTTPRequest::SetIfModifiedSince(const char* i_Value)
{
return SetHeader(kHH_IF_MODIFIED_SINCE,i_Value);
}
NS_METHOD
nsHTTPRequest::GetIfModifiedSince(const char* *o_Value) const
{
return GetHeader(kHH_IF_MODIFIED_SINCE, o_Value);
}
NS_METHOD
nsHTTPRequest::SetIfMatch(const char* i_Value)
{
return SetHeader(kHH_IF_MATCH,i_Value);
}
NS_METHOD
nsHTTPRequest::GetIfMatch(const char* *o_Value) const
{
return GetHeader(kHH_IF_MATCH, o_Value);
}
NS_METHOD
nsHTTPRequest::SetIfMatchAny(const char* i_Value)
{
return SetHeader(kHH_IF_MATCH_ANY,i_Value);
}
NS_METHOD
nsHTTPRequest::GetIfMatchAny(const char* *o_Value) const
{
return GetHeader(kHH_IF_MATCH_ANY,o_Value);
}
NS_METHOD
nsHTTPRequest::SetIfNoneMatch(const char* i_Value)
{
return SetHeader(kHH_IF_NONE_MATCH,i_Value);
}
NS_METHOD
nsHTTPRequest::GetIfNoneMatch(const char* *o_Value) const
{
return GetHeader(kHH_IF_NONE_MATCH,o_Value);
}
NS_METHOD
nsHTTPRequest::SetIfNoneMatchAny(const char* i_Value)
{
return SetHeader(kHH_IF_NONE_MATCH_ANY,i_Value);
}
NS_METHOD
nsHTTPRequest::GetIfNoneMatchAny(const char* *o_Value) const
{
return GetHeader(kHH_IF_NONE_MATCH_ANY,o_Value);
}
NS_METHOD
nsHTTPRequest::SetIfRange(const char* i_Value)
{
return SetHeader(kHH_IF_RANGE,i_Value);
}
NS_METHOD
nsHTTPRequest::GetIfRange(const char* *o_Value) const
{
return GetHeader(kHH_IF_RANGE,o_Value);
}
NS_METHOD
nsHTTPRequest::SetIfUnmodifiedSince(const char* i_Value)
{
return SetHeader(kHH_IF_UNMODIFIED_SINCE,i_Value);
}
NS_METHOD
nsHTTPRequest::GetIfUnmodifiedSince(const char* *o_Value) const
{
return GetHeader(kHH_IF_UNMODIFIED_SINCE, o_Value);
}
NS_METHOD
nsHTTPRequest::SetMaxForwards(const char* i_Value)
{
return SetHeader(kHH_MAX_FORWARDS,i_Value);
}
NS_METHOD
nsHTTPRequest::GetMaxForwards(const char* *o_Value) const
{
return GetHeader(kHH_MAX_FORWARDS,o_Value);
}
/*
Range information for byte-range requests
may have an overloaded one. TODO later
*/
NS_METHOD
nsHTTPRequest::SetRange(const char* i_Value)
{
return SetHeader(kHH_RANGE,i_Value);
}
NS_METHOD
nsHTTPRequest::GetRange(const char* *o_Value) const
{
return GetHeader(kHH_RANGE, o_Value);
}
NS_METHOD
nsHTTPRequest::SetReferer(const char* i_Value)
{
return SetHeader(kHH_REFERER, i_Value);
}
NS_METHOD
nsHTTPRequest::GetReferer(const char* *o_Value) const
{
return GetHeader(kHH_REFERER, o_Value);
}
NS_METHOD
nsHTTPRequest::SetUserAgent(const char* i_Value)
{
return SetHeader(kHH_USER_AGENT, i_Value);
}
NS_METHOD
nsHTTPRequest::GetUserAgent(const char* *o_Value) const
{
return GetHeader(kHH_USER_AGENT, o_Value);
}
// Finally our own methods...
NS_METHOD
nsHTTPRequest::Clone(const nsHTTPRequest* *o_Request) const
{
return NS_OK;
}
NS_METHOD
nsHTTPRequest::SetMethod(HTTPMethod i_Method)
{
m_Method = i_Method;
return NS_OK;
}
HTTPMethod
nsHTTPRequest::GetMethod(void) const
{
return m_Method;
}
NS_METHOD
nsHTTPRequest::SetPriority()
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_METHOD
nsHTTPRequest::GetPriority()
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_METHOD
nsHTTPRequest::SetHeader(const char* i_Header, const char* i_Value)
{
NS_ASSERTION(m_pArray, "header array doesn't exist.");
if (i_Value)
{
//The tempValue gets copied so we can do away with it...
nsString tempValue(i_Value);
nsHeaderPair* pair = new nsHeaderPair(i_Header, &tempValue);
if (pair)
{
//TODO set uniqueness? how...
return m_pArray->AppendElement(pair);
}
else
return NS_ERROR_OUT_OF_MEMORY;
}
else if (i_Header)
{
nsIAtom* header = NS_NewAtom(i_Header);
if (!atom)
return NS_ERROR_OUT_OF_MEMORY;
PRInt32 cnt = m_pArray->Count();
for (PRInt32 i = 0; i < cnt; i++) {
nsHeaderPair* element = NS_STATIC_CAST(nsHeaderPair*, m_pArray[i]);
if (header == element->atom) {
m_pArray->RemoveElementAt(i);
cnt = m_pArray->Count();
i = -1; // reset the counter so we can start from the top again
}
}
return NS_OK;
}
return NS_ERROR_NULL_POINTER;
}
NS_METHOD
nsHTTPRequest::GetHeader(const char* i_Header, const char* *o_Value) const
{
NS_ASSERTION(m_pArray, "header array doesn't exist.");
if (!i_Header || !o_Value)
return NS_ERROR_NULL_POINTER;
nsIAtom* header = NS_NewAtom(i_Header);
if (!header)
return NS_ERROR_OUT_OF_MEMORY;
for (PRInt32 i = m_pArray->Count() - 1; i >= 0; --i)
{
nsHeaderPair* element = NS_STATIC_CAST(nsHeaderPair*, m_pArray[i]);
if ((header == element->atom))
{
*o_Value = (element->value) ? element->value->ToNewCString() : nsnull;
return NS_OK;
}
}
*o_Value = nsnull;
return NS_ERROR_NOT_FOUND;
}
NS_METHOD
nsHTTPRequest::GetHeaderMultiple(const char* i_Header,
const char** *o_ValueArray,
int o_Count) const
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_METHOD
nsHTTPRequest::SetHTTPVersion(HTTPVersion i_Version)
{
m_Version = i_Version;
return NS_OK;
}
NS_METHOD
nsHTTPRequest::GetHTTPVersion(HTTPVersion* o_Version) const
{
*o_Version = m_Version;
return NS_OK;
}
NS_METHOD
nsHTTPRequest::GetInputStream(nsIInputStream* *o_Stream)
{
if (o_Stream)
{
if (!m_Request)
{
Build();
}
m_Request->QueryInterface(nsIInputStream::GetIID(), (void**)o_Stream);
return NS_OK;
}
else
return NS_ERROR_NULL_POINTER;
}
NS_IMETHODIMP
nsHTTPRequest::OnStartBinding(nsISupports* i_pContext)
{
//TODO globally replace printf with trace calls.
//printf("nsHTTPRequest::OnStartBinding...\n");
return NS_OK;
}
NS_IMETHODIMP
nsHTTPRequest::OnStopBinding(nsISupports* i_pContext,
nsresult iStatus,
nsIString* i_pMsg)
{
//printf("nsHTTPRequest::OnStopBinding...\n");
// if we could write successfully...
if (NS_SUCCEEDED(iStatus))
{
nsresult rv;
//Prepare to receive the response!
nsHTTPResponseListener* pListener = new nsHTTPResponseListener();
if (!pListener)
return NS_ERROR_OUT_OF_MEMORY;
rv = m_pTransport->AsyncRead(
i_pContext,
m_pConnection->EventQueue(),
pListener);
return rv;
}
else
{
NS_ERROR("Failed to write to server!");
}
/*
Somewhere here we need to send a message up the event sink
that we successfully (or not) have sent request to the
server. TODO
*/
return iStatus;
}
NS_IMETHODIMP
nsHTTPRequest::SetTransport(nsITransport* i_pTransport)
{
NS_ASSERTION(!m_pTransport, "Transport being overwritten!");
m_pTransport = i_pTransport;
NS_ADDREF(m_pTransport);
return NS_OK;
}
NS_IMETHODIMP
nsHTTPRequest::SetConnection(nsHTTPConnection* i_pConnection)
{
m_pConnection = i_pConnection;
return NS_OK;
}