General fixes and changed #include nsHTTPEventSink to match the camel-case

file name. Will be fixed when we migrate to network.
This commit is contained in:
gagan%netscape.com 1999-05-28 22:34:41 +00:00
Родитель 5da1825d4e
Коммит 5e2e56e50f
10 изменённых файлов: 305 добавлений и 39 удалений

Просмотреть файл

@ -49,7 +49,6 @@ CPP_OBJS= \
.\$(OBJDIR)\nsHTTPHandlerFactory.obj \
.\$(OBJDIR)\nsHTTPConnection.obj \
.\$(OBJDIR)\nsHTTPRequest.obj \
.\$(OBJDIR)\nsHTTPRequestObserver.obj \
.\$(OBJDIR)\nsHTTPResponseListener.obj \
.\$(OBJDIR)\nsHTTPResponse.obj \
$(NULL)

Просмотреть файл

@ -22,6 +22,7 @@
#include "nsIHTTPHandler.h"
#include "nsHTTPRequest.h"
#include "nsHTTPResponse.h"
#include "nsITransport.h"
nsHTTPConnection::nsHTTPConnection(
nsIURL* i_URL,
@ -49,6 +50,7 @@ nsHTTPConnection::nsHTTPConnection(
m_pRequest = new nsHTTPRequest(m_pURL);
if (!m_pRequest)
NS_ERROR("unable to create new nsHTTPRequest!");
m_pRequest->SetConnection(this);
}
@ -90,7 +92,13 @@ nsHTTPConnection::Resume(void)
NS_METHOD
nsHTTPConnection::GetInputStream(nsIInputStream* *o_Stream)
{
return NS_ERROR_NOT_IMPLEMENTED;
if (!m_bConnected)
Open();
// How do I block here?
if (m_pResponse)
return m_pResponse->GetInputStream(o_Stream);
return NS_OK; // change to error ? or block till response is set up?
}
NS_METHOD
@ -130,9 +138,44 @@ nsHTTPConnection::Open(void)
if (m_bConnected || (m_State > HS_IDLE))
return NS_ERROR_ALREADY_CONNECTED;
m_bConnected = PR_TRUE;
// Set up a new request observer and a response listener and pass to teh transport
nsresult rv = NS_OK;
return NS_ERROR_NOT_IMPLEMENTED;
const char* host;
rv = m_pURL->GetHost(&host);
if (NS_FAILED(rv)) return rv;
PRInt32 port;
rv = m_pURL->GetPort(&port);
if (NS_FAILED(rv)) return rv;
nsITransport* temp;
if (port == -1)
{
m_pHandler->GetDefaultPort(&port);
}
NS_ASSERTION(port>0, "Bad port setting!");
PRUint32 unsignedPort = port;
rv = m_pHandler->GetTransport(host, unsignedPort, &temp);
if (temp)
{
m_pRequest->SetTransport(temp);
nsIInputStream* stream;
//Get the stream where it will read the request data from
m_pRequest->GetInputStream(&stream);
rv = temp->AsyncWrite(stream, (nsISupports*)(nsIProtocolConnection*)this , m_pEventQ, m_pRequest);
m_State = HS_WAITING_FOR_RESPONSE;
m_bConnected = PR_TRUE;
}
else
NS_ERROR("Failed to create/get a transport!");
return rv;
}
NS_METHOD

Просмотреть файл

@ -94,6 +94,9 @@ public:
NS_IMETHOD GetURL(nsIURL* *o_URL) const;
NS_IMETHOD EventSink(nsIHTTPEventSink* *o_EventSink) const { if (o_EventSink) *o_EventSink = m_pEventSink; return NS_OK; };
nsIEventQueue* EventQueue(void) const { return m_pEventQ; };
private:
nsCOMPtr<nsIURL> m_pURL;
PRBool m_bConnected;

Просмотреть файл

@ -26,7 +26,7 @@
#include "nsITransport.h"
#include "nsISocketTransportService.h"
#include "nsIServiceManager.h"
#include "nsIHTTPEventSink.h"
#include "nsIHttpEventSink.h"
static NS_DEFINE_CID(kStandardUrlCID, NS_STANDARDURL_CID);
static NS_DEFINE_CID(kSocketTransportServiceCID, NS_SOCKETTRANSPORTSERVICE_CID);
@ -42,12 +42,14 @@ NS_METHOD CreateOrGetHTTPHandler(nsIHTTPHandler* *o_HTTPHandler)
}
nsHTTPHandler::nsHTTPHandler():
m_pTransportTable(nsnull),
m_pTransportTable(new nsHashtable()),
mRefCnt(0)
{
if (NS_FAILED(NS_NewISupportsArray(getter_AddRefs(m_pConnections)))) {
NS_ERROR("unable to create new ISupportsArray");
}
if (!m_pTransportTable)
NS_ERROR("Failed to create a new transport table");
}
nsHTTPHandler::~nsHTTPHandler()
@ -106,8 +108,10 @@ nsHTTPHandler::NewConnection(nsIURL* i_URL,
if (pNewInstance)
{
NS_ADDREF(pNewInstance);
*o_Instance = pNewInstance;
pNewInstance->QueryInterface(nsIProtocolConnection::GetIID(), (void**)o_Instance);
// add this instance to the active list of connections
// TODO!
NS_RELEASE(pNewInstance);
return NS_OK;
}
else
@ -215,6 +219,8 @@ nsHTTPHandler::GetTransport(const char* i_Host,
NS_ASSERTION(oldValue == nsnull, "Race condition in transport table!");
NS_ADDREF(trans);
*o_pTrans = trans;
return rv;
}

Просмотреть файл

@ -45,7 +45,7 @@
class nsHashtable;
class nsITransport;
class nsHTTPHandler : public nsIHTTPHandler, public nsIProtocolHandler
class nsHTTPHandler : public nsIHTTPHandler
//, public nsIProxy
{
@ -119,6 +119,7 @@ public:
return pHandler;
};
// Functions from nsIHTTPHandler
/*
Pull out an existing transport from the hashtable, or if none exists
create one.

Просмотреть файл

@ -22,15 +22,24 @@
#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"
nsHTTPRequest::nsHTTPRequest(nsIUrl* i_pURL, HTTPMethod i_Method):
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_Request(nsnull),
m_pTransport(i_pTransport),
mRefCnt(0)
{
Build();
//Build();
}
nsHTTPRequest::~nsHTTPRequest()
@ -45,6 +54,17 @@ nsHTTPRequest::~nsHTTPRequest()
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);
@ -52,7 +72,72 @@ NS_IMPL_ADDREF(nsHTTPRequest);
nsresult
nsHTTPRequest::Build()
{
return NS_OK;
if (m_Request)
NS_ERROR("Request already built!");
nsresult rv = NS_NewByteBufferInputStream(&m_Request);
if (m_Request)
{
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.1\n");
/* 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
if (m_pArray && (0< m_pArray->Count()))
{
for (PRInt32 i = m_pArray->Count() - 1; i >= 0; --i)
{
nsHeaderPair* element = NS_STATIC_CAST(nsHeaderPair*, m_pArray->ElementAt(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('\n');
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';
}
}
}
return rv;
}
nsresult
@ -70,6 +155,11 @@ nsHTTPRequest::QueryInterface(REFNSIID aIID, void** aInstancePtr)
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();
@ -740,4 +830,72 @@ 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))
{
//Prepare to receive the response!
nsHTTPResponseListener* pListener = new nsHTTPResponseListener();
m_pTransport->AsyncRead(
i_pContext,
m_pConnection->EventQueue(),
pListener);
//TODO check this portion here...
return pListener ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
/*
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;
return NS_OK;
}
NS_IMETHODIMP
nsHTTPRequest::SetConnection(nsHTTPConnection* i_pConnection)
{
m_pConnection = i_pConnection;
return NS_OK;
}

Просмотреть файл

@ -21,26 +21,43 @@
#include "nsIHTTPCommonHeaders.h"
#include "nsIHTTPRequest.h"
#include "nsIStreamObserver.h"
class nsIInputStream;
class nsIUrl;
class nsVoidArray;
class nsIByteBufferInputStream;
class nsITransport;
class nsHTTPConnection;
/*
The nsHTTPRequest class is the request object created for each HTTP
request before the connection. A request object may be cloned and
saved for later reuse.
This is also the observer class for writing to the transport. This
receives notifications of OnStartBinding and OnStopBinding as the
request is being written out to the server. Each instance of this
class is tied to the corresponding transport that it writes the
request to.
The essential purpose of the observer portion is to create the
response listener once it is done writing a request and also notify
the handler when this is done writing a request out. The latter could
be used (later) to do pipelining.
This class is internal to the protocol handler implementation and
should theroetically not be used by the app or the core netlib.
-Gagan Saksena 03/29/99
*/
class nsHTTPRequest : public nsIHTTPRequest
class nsHTTPRequest : public nsIHTTPRequest , public nsIStreamObserver
{
public:
// Constructor and destructor
nsHTTPRequest(nsIUrl* i_URL=0, HTTPMethod i_Method=HM_GET);
nsHTTPRequest(nsIUrl* i_URL=0, HTTPMethod i_Method=HM_GET, nsITransport* i_pTranport = nsnull);
virtual ~nsHTTPRequest();
// Methods from nsISupports
@ -220,6 +237,13 @@ public:
NS_IMETHOD SetUserAgent(const char* i_Value);
NS_IMETHOD GetUserAgent(const char* *o_Value) const;
// nsIStreamObserver functions
NS_IMETHOD OnStartBinding(nsISupports* context);
NS_IMETHOD OnStopBinding(nsISupports* context,
nsresult aStatus,
nsIString* aMsg);
// Finally our own methods...
/*
Clone the current request for later use. Release it
@ -232,7 +256,16 @@ public:
NS_IMETHOD SetPriority(); // TODO
NS_IMETHOD GetPriority(); //TODO
/*
Returns the stream set up to hold the request data
Calls build if not already built.
*/
NS_IMETHOD GetInputStream(nsIInputStream* *o_Stream);
NS_IMETHOD SetTransport(nsITransport* i_pTransport);
NS_IMETHOD SetConnection(nsHTTPConnection* i_pConnection);
protected:
@ -244,17 +277,17 @@ protected:
{
static const char methods[][TOTAL_NUMBER_OF_METHODS] =
{
"DELETE",
"GET",
"HEAD",
"INDEX",
"LINK",
"OPTIONS",
"POST",
"PUT",
"PATCH",
"TRACE",
"UNLINK"
"DELETE ",
"GET ",
"HEAD ",
"INDEX ",
"LINK ",
"OPTIONS ",
"POST ",
"PUT ",
"PATCH ",
"TRACE ",
"UNLINK "
};
return methods[i_Method];
@ -263,9 +296,11 @@ protected:
nsIUrl* m_pURI;
HTTPVersion m_Version;
HTTPMethod m_Method;
// The actual request string!
char* m_Request;
// The actual request stream!
nsIByteBufferInputStream* m_Request;
nsVoidArray* m_pArray;
nsITransport* m_pTransport;
nsHTTPConnection* m_pConnection;
};
#endif /* _nsHTTPRequest_h_ */

Просмотреть файл

@ -26,8 +26,9 @@
#include "kHTTPHeaders.h"
#include "plstr.h"
nsHTTPResponse::nsHTTPResponse(nsIHTTPConnection* i_pCon):
m_pConn(dont_QueryInterface(i_pCon))
nsHTTPResponse::nsHTTPResponse(nsIHTTPConnection* i_pCon, nsIInputStream* i_InputStream):
m_pConn(dont_QueryInterface(i_pCon)),
m_pInputStream(i_InputStream)
{
}
@ -502,4 +503,11 @@ nsHTTPResponse::SetStatusString(const char* i_Status)
m_pStatusString = new char[len+1];
PL_strncpy(m_pStatusString, i_Status, len);
return NS_OK;
}
NS_METHOD
nsHTTPResponse::GetInputStream(nsIInputStream* *o_Stream)
{
*o_Stream = m_pInputStream;
return NS_OK;
}

Просмотреть файл

@ -26,6 +26,7 @@
class nsIUrl;
class nsVoidArray;
class nsIInputStream;
/*
The nsHTTPResponse class is the response object created by the response
@ -41,7 +42,7 @@ class nsHTTPResponse : public nsIHTTPResponse
public:
// Constructor and destructor
nsHTTPResponse(nsIHTTPConnection* i_pConnection);
nsHTTPResponse(nsIHTTPConnection* i_pConnection, nsIInputStream* i_InputStream);
virtual ~nsHTTPResponse();
// Methods from nsISupports
@ -160,6 +161,7 @@ public:
NS_IMETHOD SetServerVersion(const char* i_ServerVersion);
NS_IMETHOD GetInputStream(nsIInputStream* *o_Stream);
protected:
NS_IMETHOD SetHeaderInternal(const char* i_Header, const char* i_Value);
@ -172,6 +174,7 @@ protected:
HTTPVersion m_ServerVersion;
char* m_pStatusString;
PRUint32 m_Status;
nsIInputStream* m_pInputStream;
friend class nsHTTPResponseListener;
};

Просмотреть файл

@ -55,6 +55,18 @@ nsHTTPResponseListener::OnDataAvailable(nsISupports* context,
static int extrabufferlen = 0;
NS_ASSERTION(i_pStream, "Fake stream!");
// Set up the response
if (!m_pResponse)
{
m_pResponse = new nsHTTPResponse (m_pConnection, i_pStream);
if (!m_pResponse)
{
NS_ERROR("Failed to create the response object!");
return NS_ERROR_OUT_OF_MEMORY;
}
NS_ADDREF(m_pResponse);
}
//printf("nsHTTPResponseListener::OnDataAvailable...\n");
/*
Check its current state,
@ -123,15 +135,13 @@ nsHTTPResponseListener::OnStartBinding(nsISupports* i_pContext)
//printf("nsHTTPResponseListener::OnStartBinding...\n");
m_pConnection = NS_STATIC_CAST(nsIHTTPConnection*, i_pContext);
NS_ADDREF(m_pConnection);
// Set up the response
m_pResponse = new nsHTTPResponse (m_pConnection);
if (!m_pResponse)
{
NS_ERROR("Failed to create the response object!");
return NS_ERROR_OUT_OF_MEMORY;
}
NS_ADDREF(m_pResponse);
nsIHTTPEventSink* pSink= nsnull;
nsresult rv = m_pConnection->EventSink(&pSink);
if (NS_FAILED(rv))
NS_ERROR("No HTTP Event Sink!");
rv = pSink->OnStartBinding(i_pContext);
return NS_OK;
}