From afe2f43f12aa7dcffdfd9ebb555f105776abdf12 Mon Sep 17 00:00:00 2001 From: "dougt%netscape.com" Date: Fri, 19 May 2000 22:56:12 +0000 Subject: [PATCH] Fix for 31164, possibly 35658, and prep work for 31174. 1) Passing the proxy hostname and port to the underlying socket and changing all users that appeared in lxr. 2) (psm-glue) registering with the cache manager to allow local loopback so that psm will work with a proxy. 3) (psm-glue) Storing proxy information in psmSocketInfo. most reviewed by gagan@netscape.com. git-svn-id: svn://10.0.0.236/trunk@70532 18797224-902f-48f8-a5cc-f745e15eee43 --- .../extensions/datetime/nsDateTimeChannel.cpp | 6 +- mozilla/extensions/finger/nsFingerChannel.cpp | 4 +- .../extensions/irc/js/lib/connection-xpcom.js | 2 +- .../psm-glue/public/nsIPSMSocketInfo.idl | 7 +- .../psm-glue/src/nsPSMComponent.cpp | 8 +- .../extensions/psm-glue/src/nsPSMShimLayer.c | 9 +- .../extensions/psm-glue/src/nsSSLIOLayer.cpp | 196 +++++++++++++----- .../extensions/psm-glue/src/nsSSLIOLayer.h | 10 +- .../psm-glue/src/nsSSLSocketProvider.cpp | 15 +- mozilla/mailnews/base/util/nsMsgProtocol.cpp | 2 +- mozilla/mailnews/imap/src/nsImapProtocol.cpp | 4 +- .../base/public/nsISocketTransportService.idl | 7 +- .../netwerk/base/src/nsSocketTransport.cpp | 62 ++++-- mozilla/netwerk/base/src/nsSocketTransport.h | 8 +- .../base/src/nsSocketTransportService.cpp | 10 +- .../datetime/src/nsDateTimeChannel.cpp | 6 +- .../protocol/finger/src/nsFingerChannel.cpp | 4 +- .../ftp/src/nsFtpConnectionThread.cpp | 4 +- .../protocol/http/src/nsHTTPHandler.cpp | 44 ++-- .../netwerk/protocol/http/src/nsHTTPHandler.h | 1 + .../protocol/http/src/nsHTTPSHandler.cpp | 21 +- .../protocol/http/src/nsHTTPSHandler.h | 8 +- .../netwerk/socket/base/nsISocketProvider.idl | 7 +- mozilla/netwerk/test/TestSocketIO.cpp | 2 +- mozilla/netwerk/test/TestSocketInput.cpp | 2 +- mozilla/netwerk/test/TestSocketTransport.cpp | 2 +- 26 files changed, 308 insertions(+), 143 deletions(-) diff --git a/mozilla/extensions/datetime/nsDateTimeChannel.cpp b/mozilla/extensions/datetime/nsDateTimeChannel.cpp index 51d36e47d22..588d3089b40 100644 --- a/mozilla/extensions/datetime/nsDateTimeChannel.cpp +++ b/mozilla/extensions/datetime/nsDateTimeChannel.cpp @@ -157,7 +157,7 @@ nsDateTimeChannel::OpenInputStream(nsIInputStream **_retval) if (NS_FAILED(rv)) return rv; nsCOMPtr channel; - rv = socketService->CreateTransport(mHost, mPort, mHost, 32, 32, getter_AddRefs(channel)); + rv = socketService->CreateTransport(mHost, mPort, nsnull, 0, 32, 32, getter_AddRefs(channel)); if (NS_FAILED(rv)) return rv; rv = channel->SetNotificationCallbacks(mCallbacks); @@ -182,7 +182,7 @@ nsDateTimeChannel::AsyncOpen(nsIStreamObserver *observer, nsISupports* ctxt) if (NS_FAILED(rv)) return rv; nsCOMPtr channel; - rv = socketService->CreateTransport(mHost, mPort, mHost, 32, 32, getter_AddRefs(channel)); + rv = socketService->CreateTransport(mHost, mPort, nsnull, 0, 32, 32, getter_AddRefs(channel)); if (NS_FAILED(rv)) return rv; rv = channel->SetNotificationCallbacks(mCallbacks); @@ -201,7 +201,7 @@ nsDateTimeChannel::AsyncRead(nsIStreamListener *aListener, if (NS_FAILED(rv)) return rv; nsCOMPtr channel; - rv = socketService->CreateTransport(mHost, mPort, mHost, 32, 32, getter_AddRefs(channel)); + rv = socketService->CreateTransport(mHost, mPort, nsnull, 0, 32, 32, getter_AddRefs(channel)); if (NS_FAILED(rv)) return rv; rv = channel->SetNotificationCallbacks(mCallbacks); diff --git a/mozilla/extensions/finger/nsFingerChannel.cpp b/mozilla/extensions/finger/nsFingerChannel.cpp index 6d0e2743fde..df0acab4d28 100644 --- a/mozilla/extensions/finger/nsFingerChannel.cpp +++ b/mozilla/extensions/finger/nsFingerChannel.cpp @@ -202,7 +202,7 @@ nsFingerChannel::OpenInputStream(nsIInputStream **_retval) if (NS_FAILED(rv)) return rv; nsCOMPtr channel; - rv = socketService->CreateTransport(mHost, mPort, mHost, BUFFER_SEG_SIZE, + rv = socketService->CreateTransport(mHost, mPort, nsnull, 0, BUFFER_SEG_SIZE, BUFFER_MAX_SIZE, getter_AddRefs(channel)); if (NS_FAILED(rv)) return rv; @@ -234,7 +234,7 @@ nsFingerChannel::AsyncRead(nsIStreamListener *aListener, nsISupports *ctxt) if (NS_FAILED(rv)) return rv; nsCOMPtr channel; - rv = socketService->CreateTransport(mHost, mPort, mHost, BUFFER_SEG_SIZE, + rv = socketService->CreateTransport(mHost, mPort, nsnull, 0, BUFFER_SEG_SIZE, BUFFER_MAX_SIZE, getter_AddRefs(channel)); if (NS_FAILED(rv)) return rv; diff --git a/mozilla/extensions/irc/js/lib/connection-xpcom.js b/mozilla/extensions/irc/js/lib/connection-xpcom.js index 8f89a9acf59..a8cadbb2f2d 100644 --- a/mozilla/extensions/irc/js/lib/connection-xpcom.js +++ b/mozilla/extensions/irc/js/lib/connection-xpcom.js @@ -72,7 +72,7 @@ CBSConnection.prototype.connect = function(host, port, bind, tcp_flag) this.bind = bind; this.tcp_flag = tcp_flag; - this._channel = this._sockService.createTransport (host, port, host, 0, 0); + this._channel = this._sockService.createTransport (host, port, null, 0, 0, 0); if (!this._channel) throw ("Error opening channel."); diff --git a/mozilla/extensions/psm-glue/public/nsIPSMSocketInfo.idl b/mozilla/extensions/psm-glue/public/nsIPSMSocketInfo.idl index 035a6872863..7219bd85767 100644 --- a/mozilla/extensions/psm-glue/public/nsIPSMSocketInfo.idl +++ b/mozilla/extensions/psm-glue/public/nsIPSMSocketInfo.idl @@ -36,10 +36,15 @@ interface nsIPSMSocketInfo : nsISupports { readonly attribute string hostName; + readonly attribute PRInt32 hostPort; + + readonly attribute string proxyName; + readonly attribute PRInt32 proxyPort; + readonly attribute psmtControlStar controlPtr; readonly attribute cmSocketStar socketPtr; readonly attribute nsFileDescStar fileDescPtr; - + void getPickledStatus(out charStar pickledStatus); }; diff --git a/mozilla/extensions/psm-glue/src/nsPSMComponent.cpp b/mozilla/extensions/psm-glue/src/nsPSMComponent.cpp index e472f59c332..d2a69d0cf8a 100644 --- a/mozilla/extensions/psm-glue/src/nsPSMComponent.cpp +++ b/mozilla/extensions/psm-glue/src/nsPSMComponent.cpp @@ -57,6 +57,8 @@ #include "nsIScriptSecurityManager.h" #include "nsICertificatePrincipal.h" +#include "nsIProtocolProxyService.h" + #define PSM_VERSION_REG_KEY "/Netscape/Personal Security Manager" #ifdef WIN32 @@ -72,7 +74,7 @@ static NS_DEFINE_CID(kCStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID); static NS_DEFINE_CID(kProfileCID, NS_PROFILE_CID); static NS_DEFINE_CID(kPrefCID, NS_PREF_CID); - +static NS_DEFINE_CID(kProtocolProxyServiceCID, NS_PROTOCOLPROXYSERVICE_CID); nsPSMComponent* nsPSMComponent::mInstance = nsnull; @@ -565,6 +567,10 @@ nsPSMComponent::GetControlConnection( CMT_CONTROL * *_retval ) PR_FREEIF(profileName); + nsCOMPtr proxySvc = do_GetService(kProtocolProxyServiceCID, &rv); + if (NS_FAILED(rv)) return rv; + proxySvc->AddNoProxyFor("127.0.0.1", mControl->port); + *_retval = mControl; return NS_OK; } diff --git a/mozilla/extensions/psm-glue/src/nsPSMShimLayer.c b/mozilla/extensions/psm-glue/src/nsPSMShimLayer.c index b95fb0778fc..999759f6f85 100644 --- a/mozilla/extensions/psm-glue/src/nsPSMShimLayer.c +++ b/mozilla/extensions/psm-glue/src/nsPSMShimLayer.c @@ -140,15 +140,10 @@ nsPSMShimConnect(CMTSocket sock, short port, char *path) switch (errcode) { case PR_IS_CONNECTED_ERROR: + case PR_IN_PROGRESS_ERROR: rv = CMTSuccess; break; - - case PR_IN_PROGRESS_ERROR: - case PR_IO_TIMEOUT_ERROR: -#ifdef WIN32 - case PR_WOULD_BLOCK_ERROR: - case PR_INVALID_ARGUMENT_ERROR: -#endif + default: rv = CMTFailure; break; diff --git a/mozilla/extensions/psm-glue/src/nsSSLIOLayer.cpp b/mozilla/extensions/psm-glue/src/nsSSLIOLayer.cpp index 00aaf333284..daa50975dd6 100644 --- a/mozilla/extensions/psm-glue/src/nsSSLIOLayer.cpp +++ b/mozilla/extensions/psm-glue/src/nsSSLIOLayer.cpp @@ -50,13 +50,22 @@ public: nsresult SetControlPtr(CMT_CONTROL *aControlPtr); nsresult SetFileDescPtr(PRFileDesc *aControlPtr); nsresult SetHostName(char *aHostName); + nsresult SetProxyName(char *aName); + + nsresult SetHostPort(PRInt32 aPort); + nsresult SetProxyPort(PRInt32 aPort); nsresult SetPickledStatus(); protected: CMT_CONTROL* mControl; CMSocket* mSocket; PRFileDesc* mFd; + nsString mHostName; + PRInt32 mHostPort; + + nsString mProxyName; + PRInt32 mProxyPort; unsigned char* mPickledStatus; }; @@ -68,33 +77,14 @@ nsSSLIOLayerConnect(PRFileDesc *fd, const PRNetAddr *addr, PRIntervalTime timeou nsresult result; PRStatus rv = PR_SUCCESS; CMTStatus status = CMTFailure; - char* hostName; - + /* Set the error in case of failure. */ PR_SetError(PR_UNKNOWN_ERROR, status); - if (!fd || !addr || !fd->secret) + if (!fd || !addr || !fd->secret || !gPSMService) return PR_FAILURE; - if (gPSMService == nsnull) - { - result = nsServiceManager::GetService( PSM_COMPONENT_PROGID, - NS_GET_IID(nsIPSMComponent), - (nsISupports**)&gPSMService); //FIX leak one per app run - if (NS_FAILED(result)) - return PR_FAILURE; - } - - - // Make the socket non-blocking... - PRSocketOptionData opt; - opt.option = PR_SockOpt_Nonblocking; - opt.value.non_blocking = PR_FALSE; - rv = PR_SetSocketOption(fd->lower, &opt); - if (PR_SUCCESS != rv) - return PR_FAILURE; - char ipBuffer[PR_NETDB_BUF_SIZE]; rv = PR_NetAddrToString(addr, (char*)&ipBuffer, PR_NETDB_BUF_SIZE); if (rv != PR_SUCCESS) @@ -106,39 +96,68 @@ nsSSLIOLayerConnect(PRFileDesc *fd, const PRNetAddr *addr, PRIntervalTime timeou strcpy(ipBuffer, ipBuffer + 7); } - + + CMT_CONTROL *control; + result = gPSMService->GetControlConnection(&control); + if (result != PR_SUCCESS) + return PR_FAILURE; + CMSocket* cmsock = (CMSocket *)PR_Malloc(sizeof(CMSocket)); if (!cmsock) return PR_FAILURE; memset(cmsock, 0, sizeof(CMSocket)); - CMT_CONTROL *control; - result = gPSMService->GetControlConnection(&control); - - if (result != PR_SUCCESS) - { - PR_FREEIF(cmsock) - return PR_FAILURE; - } - cmsock->fd = fd->lower; cmsock->isUnix = PR_FALSE; nsPSMSocketInfo *infoObject = (nsPSMSocketInfo *)fd->secret; - infoObject->GetHostName(&hostName); infoObject->SetControlPtr(control); infoObject->SetSocketPtr(cmsock); - status = CMT_OpenSSLConnection(control, - cmsock, - SSM_REQUEST_SSL_DATA_SSL, - PR_ntohs(addr->inet.port), - ipBuffer, - (hostName ? hostName : ipBuffer), - CM_FALSE, - nsnull); + char* proxyName; + char* hostName; + infoObject->GetProxyName(&proxyName); + infoObject->GetHostName(&hostName); + + if (!proxyName) + { + // Direct connection + status = CMT_OpenSSLConnection(control, + cmsock, + SSM_REQUEST_SSL_DATA_SSL, + PR_ntohs(addr->inet.port), + ipBuffer, + (hostName ? hostName : ipBuffer), + CM_FALSE, + nsnull); + + } + else + { + // not supported yet. + + return PR_FAILURE; +#if 0 + PRInt32 destPort; + + infoObject->GetProxyPort(&destPort); + + status = CMT_OpenSSLProxyConnection(control, + cmsock, + destPort, + proxyName, // wants IP + hostName); +#endif + } + + Recycle(hostName); + Recycle(proxyName); + + + + if (CMTSuccess == status) { // since our stuff can block, what we want to do is return PR_FAILURE, @@ -172,12 +191,11 @@ nsSSLIOLayerClose(PRFileDesc *fd) infoObject->GetSocketPtr(&socket); infoObject->SetPickledStatus(); - if (((PRStatus) CMT_GetSSLDataErrorCode(control, socket, &errorCode)) == PR_SUCCESS) - { - CMT_DestroyDataConnection(control, socket); - NS_RELEASE(infoObject); // if someone is interested in us, the better have an addref. - fd->identity = PR_INVALID_IO_LAYER; - } + CMT_GetSSLDataErrorCode(control, socket, &errorCode); + CMT_DestroyDataConnection(control, socket); + NS_RELEASE(infoObject); // if someone is interested in us, the better have an addref. + fd->identity = PR_INVALID_IO_LAYER; + return (PRStatus)errorCode; } @@ -340,7 +358,10 @@ nsPSMSocketInfo::SetFileDescPtr(PRFileDesc *aFilePtr) NS_IMETHODIMP nsPSMSocketInfo::GetHostName(char * *aHostName) { - *aHostName = mHostName.ToNewCString(); + if (mHostName.IsEmpty()) + *aHostName = nsnull; + else + *aHostName = mHostName.ToNewCString(); return NS_OK; } @@ -352,6 +373,56 @@ nsPSMSocketInfo::SetHostName(char *aHostName) return NS_OK; } +NS_IMETHODIMP +nsPSMSocketInfo::GetHostPort(PRInt32 *aPort) +{ + *aPort = mHostPort; + return NS_OK; +} + +nsresult +nsPSMSocketInfo::SetHostPort(PRInt32 aPort) +{ + mHostPort = aPort; + return NS_OK; +} + + +NS_IMETHODIMP +nsPSMSocketInfo::GetProxyName(char * *aName) +{ + if (mProxyName.IsEmpty()) + *aName = nsnull; + else + *aName = mProxyName.ToNewCString(); + return NS_OK; +} + + +nsresult +nsPSMSocketInfo::SetProxyName(char *aName) +{ + mProxyName.AssignWithConversion(aName); + return NS_OK; +} + + +NS_IMETHODIMP +nsPSMSocketInfo::GetProxyPort(PRInt32 *aPort) +{ + *aPort = mProxyPort; + return NS_OK; +} + +nsresult +nsPSMSocketInfo::SetProxyPort(PRInt32 aPort) +{ + mProxyPort = aPort; + return NS_OK; +} + + + nsresult nsPSMSocketInfo::SetPickledStatus() { @@ -396,7 +467,12 @@ nsPSMSocketInfo::GetPickledStatus(char * *pickledStatusString) } nsresult -nsSSLIOLayerNewSocket(const char* hostName, PRFileDesc **fd, nsISupports** info) +nsSSLIOLayerNewSocket( const char *host, + PRInt32 port, + const char *proxyHost, + PRInt32 proxyPort, + PRFileDesc **fd, + nsISupports** info) { static PRBool firstTime = PR_TRUE; if (firstTime) @@ -408,7 +484,16 @@ nsSSLIOLayerNewSocket(const char* hostName, PRFileDesc **fd, nsISupports** info) nsSSLIOLayerMethods.close = nsSSLIOLayerClose; nsSSLIOLayerMethods.read = nsSSLIOLayerRead; nsSSLIOLayerMethods.write = nsSSLIOLayerWrite; + + + nsresult result = nsServiceManager::GetService( PSM_COMPONENT_PROGID, + NS_GET_IID(nsIPSMComponent), + (nsISupports**)&gPSMService); + if (NS_FAILED(result)) + return PR_FAILURE; + firstTime = PR_FALSE; + } @@ -419,6 +504,14 @@ nsSSLIOLayerNewSocket(const char* hostName, PRFileDesc **fd, nsISupports** info) /* Get a normal NSPR socket */ sock = PR_NewTCPSocket(); if (! sock) return NS_ERROR_OUT_OF_MEMORY; + + // Make the socket non-blocking... + PRSocketOptionData opt; + opt.option = PR_SockOpt_Nonblocking; + opt.value.non_blocking = PR_FALSE; + rv = PR_SetSocketOption(sock, &opt); + if (PR_SUCCESS != rv) + return PR_FAILURE; layer = PR_CreateIOLayerStub(nsSSLIOLayerIdentity, &nsSSLIOLayerMethods); if (! layer) @@ -436,7 +529,12 @@ nsSSLIOLayerNewSocket(const char* hostName, PRFileDesc **fd, nsISupports** info) } NS_ADDREF(infoObject); - infoObject->SetHostName((char*)hostName); + + infoObject->SetHostName((char*)host); + infoObject->SetHostPort(port); + infoObject->SetProxyName((char*)proxyHost); + infoObject->SetProxyPort(proxyPort); + layer->secret = (PRFilePrivate*) infoObject; rv = PR_PushIOLayer(sock, PR_GetLayersIdentity(sock), layer); diff --git a/mozilla/extensions/psm-glue/src/nsSSLIOLayer.h b/mozilla/extensions/psm-glue/src/nsSSLIOLayer.h index fc175e544b5..7303f45b59c 100644 --- a/mozilla/extensions/psm-glue/src/nsSSLIOLayer.h +++ b/mozilla/extensions/psm-glue/src/nsSSLIOLayer.h @@ -30,8 +30,10 @@ // define taken from 4.x cartman glue code. #define SSMSTRING_PADDED_LENGTH(x) ((((x)+3)/4)*4) -nsresult nsSSLIOLayerNewSocket(const char* hostName, PRFileDesc **fd, nsISupports **securityInfo); - - - +nsresult nsSSLIOLayerNewSocket(const char *host, + PRInt32 port, + const char *proxyHost, + PRInt32 proxyPort, + PRFileDesc **fd, + nsISupports **securityInfo); #endif /* _NSSSLIOLAYER_H */ diff --git a/mozilla/extensions/psm-glue/src/nsSSLSocketProvider.cpp b/mozilla/extensions/psm-glue/src/nsSSLSocketProvider.cpp index 220b7e26f86..24836bc00a3 100644 --- a/mozilla/extensions/psm-glue/src/nsSSLSocketProvider.cpp +++ b/mozilla/extensions/psm-glue/src/nsSSLSocketProvider.cpp @@ -76,8 +76,19 @@ nsSSLSocketProvider::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult) NS_IMETHODIMP -nsSSLSocketProvider::NewSocket(const char *hostName, PRFileDesc **_result, nsISupports **securityInfo) +nsSSLSocketProvider::NewSocket(const char *host, + PRInt32 port, + const char *proxyHost, + PRInt32 proxyPort, + PRFileDesc **_result, + nsISupports **securityInfo) { - nsresult rv = nsSSLIOLayerNewSocket(hostName, _result, securityInfo); + nsresult rv = nsSSLIOLayerNewSocket(host, + port, + proxyHost, + proxyPort, + _result, + securityInfo); + return (NS_FAILED(rv)) ? NS_ERROR_SOCKET_CREATE_FAILED : NS_OK; } diff --git a/mozilla/mailnews/base/util/nsMsgProtocol.cpp b/mozilla/mailnews/base/util/nsMsgProtocol.cpp index a00d9002f99..3f8f9f606c9 100644 --- a/mozilla/mailnews/base/util/nsMsgProtocol.cpp +++ b/mozilla/mailnews/base/util/nsMsgProtocol.cpp @@ -81,7 +81,7 @@ nsresult nsMsgProtocol::OpenNetworkSocketWithInfo(const char * aHostName, PRInt3 m_readCount = -1; // with socket connections we want to read as much data as arrives m_startPosition = 0; - rv = socketService->CreateTransportOfType(connectionType, aHostName, aGetPort, nsnull, 0, 0, getter_AddRefs(m_channel)); + rv = socketService->CreateTransportOfType(connectionType, aHostName, aGetPort, nsnull, 0, 0, 0, getter_AddRefs(m_channel)); if (NS_FAILED(rv)) return rv; m_socketIsOpen = PR_FALSE; diff --git a/mozilla/mailnews/imap/src/nsImapProtocol.cpp b/mozilla/mailnews/imap/src/nsImapProtocol.cpp index e7cb8b27cc4..93fd7d49c5f 100644 --- a/mozilla/mailnews/imap/src/nsImapProtocol.cpp +++ b/mozilla/mailnews/imap/src/nsImapProtocol.cpp @@ -589,9 +589,9 @@ nsresult nsImapProtocol::SetupWithUrl(nsIURI * aURL, nsISupports* aConsumer) } if (m_overRideUrlConnectionInfo) - rv = socketService->CreateTransportOfType(connectionType, m_logonHost.GetBuffer(), m_logonPort, nsnull, 0, 0, getter_AddRefs(m_channel)); + rv = socketService->CreateTransportOfType(connectionType, m_logonHost.GetBuffer(), m_logonPort, nsnull, 0, 0, 0, getter_AddRefs(m_channel)); else - rv = socketService->CreateTransportOfType(connectionType, hostName, port, nsnull, 0, 0, getter_AddRefs(m_channel)); + rv = socketService->CreateTransportOfType(connectionType, hostName, port, nsnull, 0, 0, 0, getter_AddRefs(m_channel)); if (NS_SUCCEEDED(rv)) rv = m_channel->OpenOutputStream(getter_AddRefs(m_outputStream)); diff --git a/mozilla/netwerk/base/public/nsISocketTransportService.idl b/mozilla/netwerk/base/public/nsISocketTransportService.idl index b7f3d54af28..e9d11c7617a 100644 --- a/mozilla/netwerk/base/public/nsISocketTransportService.idl +++ b/mozilla/netwerk/base/public/nsISocketTransportService.idl @@ -38,13 +38,16 @@ interface nsISocketTransportService : nsISupports */ nsIChannel createTransport(in string host, in long port, - in string printHost, + in string proxyHost, + in long proxyPort, in unsigned long bufferSegmentSize, in unsigned long bufferMaxSize); + nsIChannel createTransportOfType(in string socketType, in string host, in long port, - in string printHost, + in string proxyHost, + in long proxyPort, in unsigned long bufferSegmentSize, in unsigned long bufferMaxSize); diff --git a/mozilla/netwerk/base/src/nsSocketTransport.cpp b/mozilla/netwerk/base/src/nsSocketTransport.cpp index 0c9950c6fb8..07fedd64be5 100644 --- a/mozilla/netwerk/base/src/nsSocketTransport.cpp +++ b/mozilla/netwerk/base/src/nsSocketTransport.cpp @@ -131,7 +131,8 @@ nsSocketTransport::nsSocketTransport(): mMonitor(nsnull), mOperation(eSocketOperation_None), mPort(0), - mPrintHost(nsnull), + mProxyHost(nsnull), + mProxyPort(0), mReadWriteState(0), mSelectFlags(0), mService(nsnull), @@ -222,7 +223,7 @@ nsSocketTransport::~nsSocketTransport() NS_IF_RELEASE (mService); - CRTFREEIF (mPrintHost); + CRTFREEIF (mProxyHost); CRTFREEIF (mHostName); CRTFREEIF (mSocketType); @@ -245,7 +246,8 @@ nsresult nsSocketTransport::Init(nsSocketTransportService* aService, const char* aHost, PRInt32 aPort, const char* aSocketType, - const char* aPrintHost, + const char* aProxyHost, + PRInt32 aProxyPort, PRUint32 bufferSegmentSize, PRUint32 bufferMaxSize) { @@ -259,24 +261,27 @@ nsresult nsSocketTransport::Init(nsSocketTransportService* aService, mService = aService; NS_ADDREF(mService); - mPort = aPort; + mPort = aPort; + mProxyPort = aProxyPort; + if (aHost && *aHost) { mHostName = nsCRT::strdup(aHost); if (!mHostName) rv = NS_ERROR_OUT_OF_MEMORY; - } - // hostname was nsnull or empty... - else - rv = NS_ERROR_FAILURE; - - if (aPrintHost) + } + else // hostname was nsnull or empty... { - mPrintHost = nsCRT::strdup(aPrintHost); - if (!mPrintHost) - rv = NS_ERROR_OUT_OF_MEMORY; + rv = NS_ERROR_FAILURE; } + if (aProxyHost && *aProxyHost) + { + mProxyHost = nsCRT::strdup(aProxyHost); + if (!mProxyHost) + rv = NS_ERROR_OUT_OF_MEMORY; + } + if (NS_SUCCEEDED(rv) && aSocketType) { mSocketType = nsCRT::strdup(aSocketType); @@ -680,7 +685,7 @@ nsresult nsSocketTransport::doResolveHost(void) // XXX: The list of ports must be restricted - see net_bad_ports_table[] in // mozilla/network/main/mkconect.c // - mNetAddress.ipv6.port = PR_htons(mPort); + mNetAddress.ipv6.port = PR_htons(((mProxyPort != -1) ? mProxyPort : mPort)); NS_WITH_SERVICE(nsIDNSService, pDNSService, @@ -694,7 +699,9 @@ nsresult nsSocketTransport::doResolveHost(void) // PR_ExitMonitor(mMonitor); - rv = pDNSService->Lookup(mHostName, this, nsnull, + rv = pDNSService->Lookup(mProxyHost ? mProxyHost : mHostName, + this, + nsnull, getter_AddRefs(mDNSRequest)); // // Aquire the SocketTransport lock again... @@ -778,7 +785,12 @@ nsresult nsSocketTransport::doConnection(PRInt16 aSelectFlags) rv = pProviderService->GetSocketProvider(mSocketType, getter_AddRefs(pProvider)); if (NS_SUCCEEDED(rv)) - rv = pProvider->NewSocket(mHostName, &mSocketFD, getter_AddRefs(mSecurityInfo)); + rv = pProvider->NewSocket(mHostName, + mPort, + mProxyHost, + mProxyPort, + &mSocketFD, + getter_AddRefs(mSecurityInfo)); } if (mSocketFD) { @@ -1726,8 +1738,17 @@ nsSocketTransport::GetOriginalURI(nsIURI* *aURL) { nsStdURL *url; url = new nsStdURL(nsnull); - url->SetHost(mHostName); - url->SetPort(mPort); + if( mProxyHost ) + { + url->SetHost(mProxyHost); + url->SetPort(mProxyPort); + } + else + { + url->SetHost(mHostName); + url->SetPort(mPort); + } + nsresult rv; rv = CallQueryInterface(url, aURL); @@ -2350,10 +2371,7 @@ nsSocketTransport::fireStatus(PRUint32 aCode) nsresult rv = GetSocketErrorString(aCode, getter_Copies(tempmesg)); nsAutoString mesg(tempmesg); - if (mPrintHost) - mesg.AppendWithConversion(mPrintHost); - else - mesg.AppendWithConversion(mHostName); + mesg.AppendWithConversion(mHostName); if (NS_FAILED(rv)) return rv; diff --git a/mozilla/netwerk/base/src/nsSocketTransport.h b/mozilla/netwerk/base/src/nsSocketTransport.h index 562d6c7430b..401500ddddd 100644 --- a/mozilla/netwerk/base/src/nsSocketTransport.h +++ b/mozilla/netwerk/base/src/nsSocketTransport.h @@ -137,7 +137,8 @@ public: const char* aHost, PRInt32 aPort, const char* aSocketType, - const char* aPrintHost, // This host is used for status mesg + const char* aProxyHost, + PRInt32 aProxyPort, PRUint32 bufferSegmentSize, PRUint32 bufferMaxSize); @@ -210,6 +211,7 @@ protected: nsCOMPtr mCallbacks; nsCOMPtr mEventSink; char* mHostName; + PRInt32 mPort; PRIntervalTime mLastActiveTime; PRCList mListLink; PRUint32 mLoadAttributes; @@ -220,8 +222,8 @@ protected: nsSocketOperation mOperation; nsCOMPtr mOwner; nsCOMPtr mSecurityInfo; - PRInt32 mPort; - char* mPrintHost; // not the proxy + PRInt32 mProxyPort; + char* mProxyHost; nsCOMPtr mReadContext; nsCOMPtr mReadListener; nsCOMPtr mReadPipeIn; diff --git a/mozilla/netwerk/base/src/nsSocketTransportService.cpp b/mozilla/netwerk/base/src/nsSocketTransportService.cpp index 0c3d910aafa..00962fec25c 100644 --- a/mozilla/netwerk/base/src/nsSocketTransportService.cpp +++ b/mozilla/netwerk/base/src/nsSocketTransportService.cpp @@ -489,12 +489,13 @@ nsSocketTransportService::Run(void) NS_IMETHODIMP nsSocketTransportService::CreateTransport(const char* aHost, PRInt32 aPort, - const char* aPrintHost, + const char* proxyHost, + PRInt32 proxyPort, PRUint32 bufferSegmentSize, PRUint32 bufferMaxSize, nsIChannel** aResult) { - return CreateTransportOfType(nsnull, aHost, aPort, aPrintHost, + return CreateTransportOfType(nsnull, aHost, aPort, proxyHost, proxyPort, bufferSegmentSize, bufferMaxSize, aResult); } @@ -502,7 +503,8 @@ NS_IMETHODIMP nsSocketTransportService::CreateTransportOfType(const char* aSocketType, const char* aHost, PRInt32 aPort, - const char* aPrintHost, + const char* proxyHost, + PRInt32 proxyPort, PRUint32 bufferSegmentSize, PRUint32 bufferMaxSize, nsIChannel** aResult) @@ -527,7 +529,7 @@ nsSocketTransportService::CreateTransportOfType(const char* aSocketType, // Create and initialize a new connection object... NS_NEWXPCOM(transport, nsSocketTransport); if (transport) { - rv = transport->Init(this, aHost, aPort, aSocketType, aPrintHost, + rv = transport->Init(this, aHost, aPort, aSocketType, proxyHost, proxyPort, bufferSegmentSize, bufferMaxSize); if (NS_FAILED(rv)) { delete transport; diff --git a/mozilla/netwerk/protocol/datetime/src/nsDateTimeChannel.cpp b/mozilla/netwerk/protocol/datetime/src/nsDateTimeChannel.cpp index 51d36e47d22..588d3089b40 100644 --- a/mozilla/netwerk/protocol/datetime/src/nsDateTimeChannel.cpp +++ b/mozilla/netwerk/protocol/datetime/src/nsDateTimeChannel.cpp @@ -157,7 +157,7 @@ nsDateTimeChannel::OpenInputStream(nsIInputStream **_retval) if (NS_FAILED(rv)) return rv; nsCOMPtr channel; - rv = socketService->CreateTransport(mHost, mPort, mHost, 32, 32, getter_AddRefs(channel)); + rv = socketService->CreateTransport(mHost, mPort, nsnull, 0, 32, 32, getter_AddRefs(channel)); if (NS_FAILED(rv)) return rv; rv = channel->SetNotificationCallbacks(mCallbacks); @@ -182,7 +182,7 @@ nsDateTimeChannel::AsyncOpen(nsIStreamObserver *observer, nsISupports* ctxt) if (NS_FAILED(rv)) return rv; nsCOMPtr channel; - rv = socketService->CreateTransport(mHost, mPort, mHost, 32, 32, getter_AddRefs(channel)); + rv = socketService->CreateTransport(mHost, mPort, nsnull, 0, 32, 32, getter_AddRefs(channel)); if (NS_FAILED(rv)) return rv; rv = channel->SetNotificationCallbacks(mCallbacks); @@ -201,7 +201,7 @@ nsDateTimeChannel::AsyncRead(nsIStreamListener *aListener, if (NS_FAILED(rv)) return rv; nsCOMPtr channel; - rv = socketService->CreateTransport(mHost, mPort, mHost, 32, 32, getter_AddRefs(channel)); + rv = socketService->CreateTransport(mHost, mPort, nsnull, 0, 32, 32, getter_AddRefs(channel)); if (NS_FAILED(rv)) return rv; rv = channel->SetNotificationCallbacks(mCallbacks); diff --git a/mozilla/netwerk/protocol/finger/src/nsFingerChannel.cpp b/mozilla/netwerk/protocol/finger/src/nsFingerChannel.cpp index 6d0e2743fde..df0acab4d28 100644 --- a/mozilla/netwerk/protocol/finger/src/nsFingerChannel.cpp +++ b/mozilla/netwerk/protocol/finger/src/nsFingerChannel.cpp @@ -202,7 +202,7 @@ nsFingerChannel::OpenInputStream(nsIInputStream **_retval) if (NS_FAILED(rv)) return rv; nsCOMPtr channel; - rv = socketService->CreateTransport(mHost, mPort, mHost, BUFFER_SEG_SIZE, + rv = socketService->CreateTransport(mHost, mPort, nsnull, 0, BUFFER_SEG_SIZE, BUFFER_MAX_SIZE, getter_AddRefs(channel)); if (NS_FAILED(rv)) return rv; @@ -234,7 +234,7 @@ nsFingerChannel::AsyncRead(nsIStreamListener *aListener, nsISupports *ctxt) if (NS_FAILED(rv)) return rv; nsCOMPtr channel; - rv = socketService->CreateTransport(mHost, mPort, mHost, BUFFER_SEG_SIZE, + rv = socketService->CreateTransport(mHost, mPort, nsnull, 0, BUFFER_SEG_SIZE, BUFFER_MAX_SIZE, getter_AddRefs(channel)); if (NS_FAILED(rv)) return rv; diff --git a/mozilla/netwerk/protocol/ftp/src/nsFtpConnectionThread.cpp b/mozilla/netwerk/protocol/ftp/src/nsFtpConnectionThread.cpp index df8e62a85d8..a4ffabc9a69 100644 --- a/mozilla/netwerk/protocol/ftp/src/nsFtpConnectionThread.cpp +++ b/mozilla/netwerk/protocol/ftp/src/nsFtpConnectionThread.cpp @@ -127,7 +127,7 @@ nsFtpConnectionThread::Process() { if (NS_FAILED(rv)) return rv; // build our own - rv = mSTS->CreateTransport(host, mPort, host, + rv = mSTS->CreateTransport(host, mPort, nsnull, 0, FTP_COMMAND_CHANNEL_SEG_SIZE, FTP_COMMAND_CHANNEL_MAX_SIZE, getter_AddRefs(mCPipe)); // the command channel @@ -1391,7 +1391,7 @@ nsFtpConnectionThread::R_pasv() { // now we know where to connect our data channel rv = mSTS->CreateTransport(mIPv6ServerAddress ? mIPv6ServerAddress : host.GetBuffer(), - port, nsnull, + port, nsnull, 0, mBufferSegmentSize, mBufferMaxSize, getter_AddRefs(mDPipe)); // the data channel if (NS_FAILED(rv)) return FTP_ERROR; diff --git a/mozilla/netwerk/protocol/http/src/nsHTTPHandler.cpp b/mozilla/netwerk/protocol/http/src/nsHTTPHandler.cpp index 37ee7389c98..26d15395837 100644 --- a/mozilla/netwerk/protocol/http/src/nsHTTPHandler.cpp +++ b/mozilla/netwerk/protocol/http/src/nsHTTPHandler.cpp @@ -971,14 +971,22 @@ nsresult nsHTTPHandler::RequestTransport(nsIURI* i_Uri, } } - if (usingProxy) - rv = CreateTransport(proxy, proxyPort, host, bufferSegmentSize, - bufferMaxSize, &trans); - else - rv = CreateTransport(host, port, host, bufferSegmentSize, - bufferMaxSize, &trans); - + rv = CreateTransport( host, + port, + proxy, + proxyPort, + bufferSegmentSize, + bufferMaxSize, + &trans ); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr trans = do_QueryInterface (*o_pTrans, &rv); + if (NS_SUCCEEDED (rv)) + { + trans->SetSocketTimeout(mRequestTimeout); + trans->SetSocketConnectTimeout(mConnectTimeout); + } } // Put it in the table... @@ -1000,7 +1008,8 @@ nsresult nsHTTPHandler::RequestTransport(nsIURI* i_Uri, nsresult nsHTTPHandler::CreateTransport(const char* host, PRInt32 port, - const char* aPrintHost, + const char* proxyHost, + PRInt32 proxyPort, PRUint32 bufferSegmentSize, PRUint32 bufferMaxSize, nsIChannel** o_pTrans) @@ -1011,17 +1020,14 @@ nsresult nsHTTPHandler::CreateTransport(const char* host, if (NS_FAILED (rv)) return rv; - rv = sts->CreateTransport(host, port, aPrintHost, bufferSegmentSize, - bufferMaxSize, o_pTrans); - if (NS_SUCCEEDED (rv)) - { - nsCOMPtr trans = do_QueryInterface (*o_pTrans, &rv); - if (NS_SUCCEEDED (rv)) - { - trans->SetSocketTimeout(mRequestTimeout); - trans->SetSocketConnectTimeout(mConnectTimeout); - } - } + rv = sts->CreateTransport(host, + port, + proxyHost, + proxyPort, + bufferSegmentSize, + bufferMaxSize, + o_pTrans); + return rv; } diff --git a/mozilla/netwerk/protocol/http/src/nsHTTPHandler.h b/mozilla/netwerk/protocol/http/src/nsHTTPHandler.h index d879bda1bad..cb2fcbb212d 100644 --- a/mozilla/netwerk/protocol/http/src/nsHTTPHandler.h +++ b/mozilla/netwerk/protocol/http/src/nsHTTPHandler.h @@ -103,6 +103,7 @@ public: virtual nsresult CreateTransport(const char* host, PRInt32 port, const char* aPrintHost, + PRBool usingProxy, PRUint32 bufferSegmentSize, PRUint32 bufferMaxSize, nsIChannel** o_pTrans); diff --git a/mozilla/netwerk/protocol/http/src/nsHTTPSHandler.cpp b/mozilla/netwerk/protocol/http/src/nsHTTPSHandler.cpp index 2ffe5c82b66..bcdbf04c645 100644 --- a/mozilla/netwerk/protocol/http/src/nsHTTPSHandler.cpp +++ b/mozilla/netwerk/protocol/http/src/nsHTTPSHandler.cpp @@ -55,10 +55,13 @@ nsHTTPSHandler::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult) return rv; } -nsresult nsHTTPSHandler::CreateTransport(const char* host, PRInt32 port, - const char* printHost, - PRUint32 bufferSegmentSize, PRUint32 bufferMaxSize, - nsIChannel** o_pTrans) +nsresult nsHTTPSHandler::CreateTransport(const char* host, + PRInt32 port, + const char* proxyHost, + PRInt32 proxyPort, + PRUint32 bufferSegmentSize, + PRUint32 bufferMaxSize, + nsIChannel** o_pTrans) { nsresult rv; @@ -66,7 +69,13 @@ nsresult nsHTTPSHandler::CreateTransport(const char* host, PRInt32 port, kSocketTransportServiceCID, &rv); if (NS_FAILED(rv)) return rv; - return rv = sts->CreateTransportOfType("ssl", host, port, - printHost, bufferSegmentSize, bufferMaxSize, o_pTrans); + return sts->CreateTransportOfType( "ssl", + host, + port, + proxyHost, + proxyPort, + bufferSegmentSize, + bufferMaxSize, + o_pTrans); } diff --git a/mozilla/netwerk/protocol/http/src/nsHTTPSHandler.h b/mozilla/netwerk/protocol/http/src/nsHTTPSHandler.h index 098a8f56398..a5e239cbfb6 100644 --- a/mozilla/netwerk/protocol/http/src/nsHTTPSHandler.h +++ b/mozilla/netwerk/protocol/http/src/nsHTTPSHandler.h @@ -69,9 +69,11 @@ public: * make a new channel. **/ - virtual nsresult CreateTransport(const char* host, PRInt32 port, - const char* printHost, - PRUint32 bufferSegmentSize, + virtual nsresult CreateTransport(const char* host, + PRInt32 port, + const char* proxyHost, + PRInt32 proxyPort, + PRUint32 bufferSegmentSize, PRUint32 bufferMaxSize, nsIChannel** o_pTrans); }; diff --git a/mozilla/netwerk/socket/base/nsISocketProvider.idl b/mozilla/netwerk/socket/base/nsISocketProvider.idl index 8ab05d54b5e..44f7646f06e 100644 --- a/mozilla/netwerk/socket/base/nsISocketProvider.idl +++ b/mozilla/netwerk/socket/base/nsISocketProvider.idl @@ -31,7 +31,12 @@ [noscript, uuid(0906de00-5414-11d3-bbc8-0000861d1237)] interface nsISocketProvider : nsISupports { - void NewSocket ( in string hostName, out nsFileDescStar fileDesc, out nsISupports securityInfo ); + void NewSocket(in string host, + in long port, + in string proxyHost, + in long proxyPort, + out nsFileDescStar fileDesc, + out nsISupports securityInfo ); }; diff --git a/mozilla/netwerk/test/TestSocketIO.cpp b/mozilla/netwerk/test/TestSocketIO.cpp index f882db18da9..c7b0f430df3 100644 --- a/mozilla/netwerk/test/TestSocketIO.cpp +++ b/mozilla/netwerk/test/TestSocketIO.cpp @@ -249,7 +249,7 @@ main(int argc, char* argv[]) // Create the socket transport... nsIChannel* transport; - rv = sts->CreateTransport(hostName, port, hostName, 0, 0, &transport); + rv = sts->CreateTransport(hostName, port, nsnull, 0, 0, 0, &transport); // This stuff is used to test the output stream #if 0 diff --git a/mozilla/netwerk/test/TestSocketInput.cpp b/mozilla/netwerk/test/TestSocketInput.cpp index ad648755665..fe5be48fe15 100644 --- a/mozilla/netwerk/test/TestSocketInput.cpp +++ b/mozilla/netwerk/test/TestSocketInput.cpp @@ -164,7 +164,7 @@ main(int argc, char* argv[]) nsIChannel* transport; - rv = sts->CreateTransport(hostName, port, hostName, 0, 0, &transport); + rv = sts->CreateTransport(hostName, port, nsnull, 0, 0, 0, &transport); if (NS_SUCCEEDED(rv)) { transport->AsyncRead(nsnull, new InputTestConsumer); diff --git a/mozilla/netwerk/test/TestSocketTransport.cpp b/mozilla/netwerk/test/TestSocketTransport.cpp index 64007508a79..f4473f69b9c 100644 --- a/mozilla/netwerk/test/TestSocketTransport.cpp +++ b/mozilla/netwerk/test/TestSocketTransport.cpp @@ -329,7 +329,7 @@ TestConnection::TestConnection(const char* aHostName, PRInt32 aPort, // Create a socket transport... NS_WITH_SERVICE(nsISocketTransportService, sts, kSocketTransportServiceCID, &rv); if (NS_SUCCEEDED(rv)) { - rv = sts->CreateTransport(aHostName, aPort, aHostName, 0, 0, &mTransport); + rv = sts->CreateTransport(aHostName, aPort, nsnull, 0, 0, 0, &mTransport); if (NS_SUCCEEDED(rv)) { // Set up the notification callbacks to provide a progress event sink. // That way we exercise the progress notification proxy code.