зеркало из https://github.com/mozilla/gecko-dev.git
fixes 95671, 96129. Caching control connections fixed, removing check against browser.enabled.cache, fixing double list response handling error. r= gordon, darin, sr= darin
This commit is contained in:
Родитель
728471dfeb
Коммит
26380f5632
|
@ -766,9 +766,6 @@ nsFtpState::Process()
|
|||
if (FTP_ERROR == mState)
|
||||
mInternalError = NS_ERROR_FAILURE;
|
||||
|
||||
//(DONE)
|
||||
mNextState = FTP_COMPLETE;
|
||||
|
||||
break;
|
||||
|
||||
// SIZE
|
||||
|
@ -1235,11 +1232,17 @@ nsFtpState::S_list() {
|
|||
|
||||
FTP_STATE
|
||||
nsFtpState::R_list() {
|
||||
if ((mResponseCode/100 == 4) || (mResponseCode/100 == 5)) {
|
||||
mFireCallbacks = PR_TRUE;
|
||||
return FTP_ERROR;
|
||||
if (mResponseCode/100 == 1)
|
||||
return FTP_READ_BUF;
|
||||
|
||||
if (mResponseCode/100 == 2) {
|
||||
//(DONE)
|
||||
mNextState = FTP_COMPLETE;
|
||||
return FTP_COMPLETE;
|
||||
}
|
||||
return FTP_READ_BUF;
|
||||
|
||||
mFireCallbacks = PR_TRUE;
|
||||
return FTP_ERROR;
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
|
|
@ -88,32 +88,9 @@ NS_IMPL_THREADSAFE_ISUPPORTS2(nsFtpStreamProvider,
|
|||
// nsFtpControlConnection implementation ...
|
||||
//
|
||||
|
||||
NS_IMPL_THREADSAFE_QUERY_INTERFACE2(nsFtpControlConnection,
|
||||
nsIStreamListener,
|
||||
nsIRequestObserver);
|
||||
|
||||
NS_IMPL_THREADSAFE_ADDREF(nsFtpControlConnection);
|
||||
nsrefcnt nsFtpControlConnection::Release(void)
|
||||
{
|
||||
nsrefcnt count;
|
||||
NS_PRECONDITION(0 != mRefCnt, "dup release");
|
||||
count = PR_AtomicDecrement((PRInt32 *)&mRefCnt);
|
||||
NS_LOG_RELEASE(this, count, "nsFtpControlConnection");
|
||||
if (0 == count) {
|
||||
mRefCnt = 1; /* stabilize */
|
||||
/* enable this to find non-threadsafe destructors: */
|
||||
/* NS_ASSERT_OWNINGTHREAD(_class); */
|
||||
NS_DELETEXPCOM(this);
|
||||
return 0;
|
||||
}
|
||||
else if (1 == count && mConnected)
|
||||
{
|
||||
// mPipe has a reference to |this| caused by AsyncRead()
|
||||
// Break this cycle by calling disconnect.
|
||||
Disconnect(NS_BINDING_ABORTED);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS2(nsFtpControlConnection,
|
||||
nsIStreamListener,
|
||||
nsIRequestObserver);
|
||||
|
||||
nsFtpControlConnection::nsFtpControlConnection(const char* host, PRUint32 port)
|
||||
{
|
||||
|
@ -123,7 +100,6 @@ nsFtpControlConnection::nsFtpControlConnection(const char* host, PRUint32 port)
|
|||
mHost.Adopt(nsCRT::strdup(host));
|
||||
mPort = port;
|
||||
mServerType = 0;
|
||||
mConnected = PR_FALSE;
|
||||
|
||||
mLock = PR_NewLock();
|
||||
NS_ASSERTION(mLock, "null lock");
|
||||
|
@ -139,8 +115,8 @@ nsFtpControlConnection::~nsFtpControlConnection()
|
|||
PRBool
|
||||
nsFtpControlConnection::IsAlive()
|
||||
{
|
||||
if (!mConnected)
|
||||
return mConnected;
|
||||
if (!mCPipe)
|
||||
return PR_FALSE;
|
||||
|
||||
PRBool isAlive = PR_FALSE;
|
||||
nsCOMPtr<nsISocketTransport> sTrans = do_QueryInterface(mCPipe);
|
||||
|
@ -205,21 +181,16 @@ nsFtpControlConnection::Connect()
|
|||
nsnull, 0, PRUint32(-1), 0,
|
||||
getter_AddRefs(mReadRequest));
|
||||
|
||||
mConnected = PR_TRUE;
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsFtpControlConnection::Disconnect(nsresult status)
|
||||
{
|
||||
if (!mConnected) return NS_ERROR_FAILURE;
|
||||
if (!mCPipe) return NS_ERROR_FAILURE;
|
||||
|
||||
PR_LOG(gFTPLog, PR_LOG_ALWAYS, ("(%x) nsFtpControlConnection disconnecting (%x)", this, status));
|
||||
|
||||
if (NS_FAILED(status)) {
|
||||
mConnected = PR_FALSE;
|
||||
}
|
||||
|
||||
if (mWriteRequest) {
|
||||
mWriteRequest->Cancel(status);
|
||||
mWriteRequest = nsnull;
|
||||
|
@ -234,7 +205,7 @@ nsFtpControlConnection::Disconnect(nsresult status)
|
|||
nsresult
|
||||
nsFtpControlConnection::Write(nsCString& command, PRBool suspend)
|
||||
{
|
||||
if (!mConnected)
|
||||
if (!mCPipe)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
PRUint32 len = command.Length();
|
||||
|
@ -276,7 +247,7 @@ nsFtpControlConnection::SetStreamListener(nsIStreamListener *aListener)
|
|||
NS_IMETHODIMP
|
||||
nsFtpControlConnection::OnStartRequest(nsIRequest *request, nsISupports *aContext)
|
||||
{
|
||||
if (!mConnected)
|
||||
if (!mCPipe)
|
||||
return NS_OK;
|
||||
|
||||
// we do not care about notifications from the write channel.
|
||||
|
@ -299,7 +270,7 @@ nsFtpControlConnection::OnStopRequest(nsIRequest *request, nsISupports *aContext
|
|||
nsresult aStatus)
|
||||
{
|
||||
|
||||
if (!mConnected)
|
||||
if (!mCPipe)
|
||||
return NS_OK;
|
||||
|
||||
// we do not care about successful notifications from the write channel.
|
||||
|
@ -325,7 +296,7 @@ nsFtpControlConnection::OnDataAvailable(nsIRequest *request,
|
|||
PRUint32 aOffset,
|
||||
PRUint32 aCount)
|
||||
{
|
||||
if (!mConnected)
|
||||
if (!mCPipe)
|
||||
return NS_OK;
|
||||
|
||||
PR_Lock(mLock);
|
||||
|
|
|
@ -71,7 +71,6 @@ private:
|
|||
nsCOMPtr<nsITransport> mCPipe;
|
||||
nsCOMPtr<nsIOutputStream> mOutStream;
|
||||
nsCOMPtr<nsIStreamListener> mListener;
|
||||
PRPackedBool mConnected;
|
||||
PRPackedBool mWriteSuspened;
|
||||
};
|
||||
|
||||
|
|
|
@ -167,33 +167,16 @@ nsFtpProtocolHandler::NewChannel(nsIURI* url, nsIChannel* *result)
|
|||
nsFTPChannel* channel = nsnull;
|
||||
rv = nsFTPChannel::Create(nsnull, NS_GET_IID(nsIChannel), (void**)&channel);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsCOMPtr<nsICacheService> serv = do_GetService(kCacheServiceCID, &rv);
|
||||
if (serv)
|
||||
serv->CreateSession("FTP",
|
||||
nsICache::STORE_ANYWHERE,
|
||||
nsICache::STREAM_BASED,
|
||||
getter_AddRefs(mCacheSession));
|
||||
|
||||
static PRBool checkedPref = PR_FALSE;
|
||||
static PRBool useCache = PR_TRUE;
|
||||
|
||||
if (!checkedPref) {
|
||||
// XXX should register a prefs changed callback for this
|
||||
nsCOMPtr<nsIPref> prefs = do_GetService(kPrefServiceCID, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
prefs->GetBoolPref("browser.cache.enable", &useCache);
|
||||
|
||||
checkedPref = PR_TRUE;
|
||||
}
|
||||
|
||||
if (useCache && !mCacheSession) {
|
||||
nsCOMPtr<nsICacheService> serv = do_GetService(kCacheServiceCID, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = serv->CreateSession("FTP",
|
||||
nsICache::STORE_ANYWHERE,
|
||||
nsICache::STREAM_BASED,
|
||||
getter_AddRefs(mCacheSession));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (mCacheSession)
|
||||
rv = mCacheSession->SetDoomEntriesIfExpired(PR_TRUE);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
}
|
||||
|
||||
rv = channel->Init(url, mCacheSession);
|
||||
if (NS_FAILED(rv)) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче