/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is Mozilla. * * The Initial Developer of the Original Code is Netscape * Communications. Portions created by Netscape Communications are * Copyright (C) 2001 by Netscape Communications. All * Rights Reserved. * * Contributor(s): * Darin Fisher (original author) */ #ifndef nsHttpHandler_h__ #define nsHttpHandler_h__ #include "nsHttp.h" #include "nsHttpAuthCache.h" #include "nsHttpConnection.h" #include "nsHttpConnectionMgr.h" #include "nsXPIDLString.h" #include "nsString.h" #include "nsCOMPtr.h" #include "nsWeakReference.h" #include "nsVoidArray.h" #include "nsIHttpProtocolHandler.h" #include "nsIProtocolProxyService.h" #include "nsIIOService.h" #include "nsIObserver.h" #include "nsIObserverService.h" #include "nsIProxyObjectManager.h" #include "nsIProxy.h" #include "nsIStreamConverterService.h" #include "nsICacheSession.h" #include "nsIEventQueueService.h" #include "nsICookieService.h" #include "nsIMIMEService.h" #include "nsIIDNService.h" #include "nsITimer.h" class nsHttpConnectionInfo; class nsHttpHeaderArray; class nsHttpTransaction; class nsAHttpTransaction; class nsIHttpChannel; class nsIPrefBranch; //----------------------------------------------------------------------------- // nsHttpHandler - protocol handler for HTTP and HTTPS //----------------------------------------------------------------------------- class nsHttpHandler : public nsIHttpProtocolHandler , public nsIObserver , public nsSupportsWeakReference { public: NS_DECL_ISUPPORTS NS_DECL_NSIPROTOCOLHANDLER NS_DECL_NSIPROXIEDPROTOCOLHANDLER NS_DECL_NSIHTTPPROTOCOLHANDLER NS_DECL_NSIOBSERVER nsHttpHandler(); virtual ~nsHttpHandler(); nsresult Init(); nsresult AddStandardRequestHeaders(nsHttpHeaderArray *, PRUint8 capabilities, PRBool useProxy); PRBool IsAcceptableEncoding(const char *encoding); const nsAFlatCString &UserAgent(); nsHttpVersion HttpVersion() { return mHttpVersion; } nsHttpVersion ProxyHttpVersion() { return mProxyHttpVersion; } PRUint8 ReferrerLevel() { return mReferrerLevel; } PRBool SendSecureXSiteReferrer() { return mSendSecureXSiteReferrer; } PRUint8 RedirectionLimit() { return mRedirectionLimit; } PRUint16 IdleTimeout() { return mIdleTimeout; } PRUint16 MaxRequestAttempts() { return mMaxRequestAttempts; } const char *DefaultSocketType() { return mDefaultSocketType.get(); /* ok to return null */ } nsIIDNService *IDNConverter() { return mIDNConverter; } PRUint32 PhishyUserPassLength() { return mPhishyUserPassLength; } PRBool IsPersistentHttpsCachingEnabled() { return mEnablePersistentHttpsCaching; } nsHttpAuthCache *AuthCache() { return &mAuthCache; } nsHttpConnectionMgr *ConnMgr() { return mConnMgr; } // cache support nsresult GetCacheSession(nsCacheStoragePolicy, nsICacheSession **); PRUint32 GenerateUniqueID() { return ++mLastUniqueID; } PRUint32 SessionStartTime() { return mSessionStartTime; } // // Connection management methods: // // - the handler only owns idle connections; it does not own active // connections. // // - the handler keeps a count of active connections to enforce the // steady-state max-connections pref. // // Called to kick-off a new transaction, by default the transaction // will be put on the pending transaction queue if it cannot be // initiated at this time. Callable from any thread. nsresult InitiateTransaction(nsHttpTransaction *trans) { return mConnMgr->AddTransaction(trans); } // Called to cancel a transaction, which may or may not be assigned to // a connection. Callable from any thread. nsresult CancelTransaction(nsHttpTransaction *trans, nsresult reason) { return mConnMgr->CancelTransaction(trans, reason); } // Called when a connection is done processing a transaction. Callable // from any thread. nsresult ReclaimConnection(nsHttpConnection *conn) { return mConnMgr->ReclaimConnection(conn); } nsresult ProcessPendingQ(nsHttpConnectionInfo *cinfo) { return mConnMgr->ProcessPendingQ(cinfo); } nsresult GetSocketThreadEventTarget(nsIEventTarget **target) { return mConnMgr->GetSocketThreadEventTarget(target); } // // The HTTP handler caches pointers to specific XPCOM services, and // provides the following helper routines for accessing those services: // nsresult GetEventQueueService(nsIEventQueueService **); nsresult GetStreamConverterService(nsIStreamConverterService **); nsresult GetMimeService(nsIMIMEService **); nsresult GetIOService(nsIIOService** service); nsICookieService * GetCookieService(); // not addrefed // Called by the channel before writing a request void OnModifyRequest(nsIHttpChannel *chan) { NotifyObservers(chan, NS_HTTP_ON_MODIFY_REQUEST_TOPIC); } // Called by the channel once headers are available void OnExamineResponse(nsIHttpChannel *chan) { NotifyObservers(chan, NS_HTTP_ON_EXAMINE_RESPONSE_TOPIC); } // Called by the channel once headers have been merged with cached headers void OnExamineMergedResponse(nsIHttpChannel *chan) { NotifyObservers(chan, NS_HTTP_ON_EXAMINE_MERGED_RESPONSE_TOPIC); } private: // // Useragent/prefs helper methods // void BuildUserAgent(); void InitUserAgentComponents(); void PrefsChanged(nsIPrefBranch *prefs, const char *pref); nsresult SetAccept(const char *); nsresult SetAcceptLanguages(const char *); nsresult SetAcceptEncodings(const char *); nsresult SetAcceptCharsets(const char *); nsresult InitConnectionMgr(); void StartPruneDeadConnectionsTimer(); void StopPruneDeadConnectionsTimer(); void NotifyObservers(nsIHttpChannel *chan, const char *event); private: // cached services nsCOMPtr mIOService; nsCOMPtr mEventQueueService; nsCOMPtr mStreamConvSvc; nsCOMPtr mObserverService; nsCOMPtr mCookieService; nsCOMPtr mMimeService; nsCOMPtr mIDNConverter; nsCOMPtr mTimer; // the authentication credentials cache nsHttpAuthCache mAuthCache; // the connection manager nsHttpConnectionMgr *mConnMgr; // // prefs // PRUint8 mHttpVersion; PRUint8 mProxyHttpVersion; PRUint8 mCapabilities; PRUint8 mProxyCapabilities; PRUint8 mReferrerLevel; PRUint16 mIdleTimeout; PRUint16 mMaxRequestAttempts; PRUint16 mMaxRequestDelay; PRUint16 mMaxConnections; PRUint8 mMaxConnectionsPerServer; PRUint8 mMaxPersistentConnectionsPerServer; PRUint8 mMaxPersistentConnectionsPerProxy; PRUint8 mMaxPipelinedRequests; PRUint8 mRedirectionLimit; // we'll warn the user if we load an URL containing a userpass field // unless its length is less than this threshold. this warning is // intended to protect the user against spoofing attempts that use // the userpass field of the URL to obscure the actual origin server. PRUint8 mPhishyUserPassLength; nsCString mAccept; nsCString mAcceptLanguages; nsCString mAcceptEncodings; nsCString mAcceptCharsets; nsXPIDLCString mDefaultSocketType; // cache support nsCOMPtr mCacheSession_ANY; nsCOMPtr mCacheSession_MEM; PRUint32 mLastUniqueID; PRUint32 mSessionStartTime; // useragent components nsXPIDLCString mAppName; nsXPIDLCString mAppVersion; nsXPIDLCString mPlatform; nsXPIDLCString mOscpu; nsXPIDLCString mSecurity; nsXPIDLCString mLanguage; nsXPIDLCString mMisc; nsXPIDLCString mVendor; nsXPIDLCString mVendorSub; nsXPIDLCString mVendorComment; nsXPIDLCString mProduct; nsXPIDLCString mProductSub; nsXPIDLCString mProductComment; nsCString mUserAgent; nsXPIDLCString mUserAgentOverride; PRPackedBool mUserAgentIsDirty; // true if mUserAgent should be rebuilt PRPackedBool mUseCache; // mSendSecureXSiteReferrer: default is false, // if true allow referrer headers between secure non-matching hosts PRPackedBool mSendSecureXSiteReferrer; // Persistent HTTPS caching flag PRPackedBool mEnablePersistentHttpsCaching; }; //----------------------------------------------------------------------------- extern nsHttpHandler *gHttpHandler; //----------------------------------------------------------------------------- // nsHttpsHandler - thin wrapper to distinguish the HTTP handler from the // HTTPS handler (even though they share the same impl). //----------------------------------------------------------------------------- class nsHttpsHandler : public nsIHttpProtocolHandler , public nsSupportsWeakReference { public: // we basically just want to override GetScheme and GetDefaultPort... // all other methods should be forwarded to the nsHttpHandler instance. NS_DECL_ISUPPORTS NS_DECL_NSIPROTOCOLHANDLER NS_FORWARD_NSIPROXIEDPROTOCOLHANDLER (gHttpHandler->) NS_FORWARD_NSIHTTPPROTOCOLHANDLER (gHttpHandler->) nsHttpsHandler() { } virtual ~nsHttpsHandler() { } nsresult Init(); }; #endif // nsHttpHandler_h__