Bug 407190 : Network (HTTP) should time out, if server does not react diff --git a/netwerk/protocol/http/src/nsHttpConnection.cpp b/netwerk/protocol/http/src/nsHttpConnection.cpp --- a/netwerk/protocol/http/src/nsHttpConnection.cpp +++ b/netwerk/protocol/http/src/nsHttpConnection.cpp @@ -462,6 +462,17 @@ nsHttpConnection::CreateTransport(PRUint rv = strans->SetSecurityCallbacks(this); if (NS_FAILED(rv)) return rv; + PRUint32 connectTimeout = gHttpHandler->ConnectTimeout(); + if (connectTimeout) { + rv = strans->SetTimeout(nsISocketTransport::TIMEOUT_CONNECT, connectTimeout); + if (NS_FAILED(rv)) return rv; + } + PRUint32 requestTimeout = gHttpHandler->RequestTimeout(); + if (requestTimeout) { + rv = strans->SetTimeout(nsISocketTransport::TIMEOUT_READ_WRITE, requestTimeout); + if (NS_FAILED(rv)) return rv; + } + // next open the socket streams nsCOMPtr sout; rv = strans->OpenOutputStream(nsITransport::OPEN_UNBUFFERED, 0, 0, diff --git a/netwerk/protocol/http/src/nsHttpHandler.cpp b/netwerk/protocol/http/src/nsHttpHandler.cpp --- a/netwerk/protocol/http/src/nsHttpHandler.cpp +++ b/netwerk/protocol/http/src/nsHttpHandler.cpp @@ -159,6 +159,8 @@ nsHttpHandler::nsHttpHandler() , mProxyCapabilities(NS_HTTP_ALLOW_KEEPALIVE) , mReferrerLevel(0xff) // by default we always send a referrer , mIdleTimeout(10) + , mConnectTimeout(0) + , mRequestTimeout(0) , mMaxRequestAttempts(10) , mMaxRequestDelay(10) , mMaxConnections(24) @@ -881,6 +883,18 @@ nsHttpHandler::PrefsChanged(nsIPrefBranc rv = prefs->GetIntPref(HTTP_PREF("keep-alive.timeout"), &val); if (NS_SUCCEEDED(rv)) mIdleTimeout = (PRUint16) CLAMP(val, 1, 0xffff); + } + + if (PREF_CHANGED(HTTP_PREF("connect.timeout"))) { + rv = prefs->GetIntPref(HTTP_PREF("connect.timeout"), &val); + if (NS_SUCCEEDED(rv)) + mConnectTimeout = (PRUint16) CLAMP(val, 0, 0xffff); + } + + if (PREF_CHANGED(HTTP_PREF("request.timeout"))) { + rv = prefs->GetIntPref(HTTP_PREF("request.timeout"), &val); + if (NS_SUCCEEDED(rv)) + mRequestTimeout = (PRUint16) CLAMP(val, 0, 0xffff); } if (PREF_CHANGED(HTTP_PREF("request.max-attempts"))) { diff --git a/netwerk/protocol/http/src/nsHttpHandler.h b/netwerk/protocol/http/src/nsHttpHandler.h --- a/netwerk/protocol/http/src/nsHttpHandler.h +++ b/netwerk/protocol/http/src/nsHttpHandler.h @@ -101,6 +101,8 @@ public: PRBool SendSecureXSiteReferrer() { return mSendSecureXSiteReferrer; } PRUint8 RedirectionLimit() { return mRedirectionLimit; } PRUint16 IdleTimeout() { return mIdleTimeout; } + PRUint16 ConnectTimeout() { return mConnectTimeout; } + PRUint16 RequestTimeout() { return mRequestTimeout; } PRUint16 MaxRequestAttempts() { return mMaxRequestAttempts; } const char *DefaultSocketType() { return mDefaultSocketType.get(); /* ok to return null */ } nsIIDNService *IDNConverter() { return mIDNConverter; } @@ -242,6 +244,8 @@ private: PRUint8 mReferrerLevel; PRUint16 mIdleTimeout; + PRUint16 mConnectTimeout; + PRUint16 mRequestTimeout; PRUint16 mMaxRequestAttempts; PRUint16 mMaxRequestDelay;