/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef HttpConnectionMgrShell_h__ #define HttpConnectionMgrShell_h__ #include "nsISupports.h" class nsIEventTarget; class nsIHttpUpgradeListener; class nsIInterfaceRequestor; namespace mozilla::net { class ARefBase; class EventTokenBucket; class HttpTransactionShell; class nsHttpConnectionInfo; class HttpConnectionBase; class nsHttpConnectionMgr; class HttpConnectionMgrParent; class SpeculativeTransaction; class ClassOfService; //---------------------------------------------------------------------------- // Abstract base class for HTTP connection manager in chrome process //---------------------------------------------------------------------------- // f5379ff9-2758-4bec-9992-2351c258aed6 #define HTTPCONNECTIONMGRSHELL_IID \ { \ 0xf5379ff9, 0x2758, 0x4bec, { \ 0x99, 0x92, 0x23, 0x51, 0xc2, 0x58, 0xae, 0xd6 \ } \ } class HttpConnectionMgrShell : public nsISupports { public: NS_DECLARE_STATIC_IID_ACCESSOR(HTTPCONNECTIONMGRSHELL_IID) enum nsParamName : uint32_t { MAX_URGENT_START_Q, MAX_CONNECTIONS, MAX_PERSISTENT_CONNECTIONS_PER_HOST, MAX_PERSISTENT_CONNECTIONS_PER_PROXY, MAX_REQUEST_DELAY, THROTTLING_ENABLED, THROTTLING_SUSPEND_FOR, THROTTLING_RESUME_FOR, THROTTLING_READ_LIMIT, THROTTLING_READ_INTERVAL, THROTTLING_HOLD_TIME, THROTTLING_MAX_TIME, PROXY_BE_CONSERVATIVE }; [[nodiscard]] virtual nsresult Init( uint16_t maxUrgentExcessiveConns, uint16_t maxConnections, uint16_t maxPersistentConnectionsPerHost, uint16_t maxPersistentConnectionsPerProxy, uint16_t maxRequestDelay, bool throttleEnabled, uint32_t throttleVersion, uint32_t throttleSuspendFor, uint32_t throttleResumeFor, uint32_t throttleReadLimit, uint32_t throttleReadInterval, uint32_t throttleHoldTime, uint32_t throttleMaxTime, bool beConservativeForProxy) = 0; [[nodiscard]] virtual nsresult Shutdown() = 0; // called from main thread to post a new request token bucket // to the socket thread [[nodiscard]] virtual nsresult UpdateRequestTokenBucket( EventTokenBucket* aBucket) = 0; // Close all idle persistent connections and prevent any active connections // from being reused. [[nodiscard]] virtual nsresult DoShiftReloadConnectionCleanup() = 0; // Like DoShiftReloadConnectionCleanup() above, but also resets CI specific // information such as Happy Eyeballs history. [[nodiscard]] virtual nsresult DoShiftReloadConnectionCleanupWithConnInfo( nsHttpConnectionInfo*) = 0; // called to force the connection manager to prune its list of idle // connections. [[nodiscard]] virtual nsresult PruneDeadConnections() = 0; // this cancels all outstanding transactions but does not shut down the mgr virtual void AbortAndCloseAllConnections(int32_t, ARefBase*) = 0; // called to update a parameter after the connection manager has already // been initialized. [[nodiscard]] virtual nsresult UpdateParam(nsParamName name, uint16_t value) = 0; // Causes a large amount of connection diagnostic information to be // printed to the javascript console virtual void PrintDiagnostics() = 0; virtual nsresult UpdateCurrentBrowserId(uint64_t aId) = 0; // adds a transaction to the list of managed transactions. [[nodiscard]] virtual nsresult AddTransaction(HttpTransactionShell*, int32_t priority) = 0; // Add a new transaction with a sticky connection from |transWithStickyConn|. [[nodiscard]] virtual nsresult AddTransactionWithStickyConn( HttpTransactionShell* trans, int32_t priority, HttpTransactionShell* transWithStickyConn) = 0; // called to reschedule the given transaction. it must already have been // added to the connection manager via AddTransaction. [[nodiscard]] virtual nsresult RescheduleTransaction(HttpTransactionShell*, int32_t priority) = 0; void virtual UpdateClassOfServiceOnTransaction( HttpTransactionShell*, const ClassOfService& classOfService) = 0; // cancels a transaction w/ the given reason. [[nodiscard]] virtual nsresult CancelTransaction(HttpTransactionShell*, nsresult reason) = 0; // called when a connection is done processing a transaction. if the // connection can be reused then it will be added to the idle list, else // it will be closed. [[nodiscard]] virtual nsresult ReclaimConnection( HttpConnectionBase* conn) = 0; // called to force the transaction queue to be processed once more, giving // preference to the specified connection. [[nodiscard]] virtual nsresult ProcessPendingQ(nsHttpConnectionInfo*) = 0; // Try and process all pending transactions [[nodiscard]] virtual nsresult ProcessPendingQ() = 0; // called to get a reference to the socket transport service. the socket // transport service is not available when the connection manager is down. [[nodiscard]] virtual nsresult GetSocketThreadTarget(nsIEventTarget**) = 0; // called to indicate a transaction for the connectionInfo is likely coming // soon. The connection manager may use this information to start a TCP // and/or SSL level handshake for that resource immediately so that it is // ready when the transaction is submitted. No obligation is taken on by the // connection manager, nor is the submitter obligated to actually submit a // real transaction for this connectionInfo. [[nodiscard]] virtual nsresult SpeculativeConnect( nsHttpConnectionInfo*, nsIInterfaceRequestor*, uint32_t caps = 0, SpeculativeTransaction* = nullptr, bool aFetchHTTPSRR = false) = 0; // "VerifyTraffic" means marking connections now, and then check again in // N seconds to see if there's been any traffic and if not, kill // that connection. [[nodiscard]] virtual nsresult VerifyTraffic() = 0; virtual void ExcludeHttp2(const nsHttpConnectionInfo* ci) = 0; virtual void ExcludeHttp3(const nsHttpConnectionInfo* ci) = 0; // clears the connection history mCT [[nodiscard]] virtual nsresult ClearConnectionHistory() = 0; // called by the main thread to execute the taketransport() logic on the // socket thread after a 101 response has been received and the socket // needs to be transferred to an expectant upgrade listener such as // websockets. // @param aTrans: a transaction that contains a sticky connection. We'll // take the transport of this connection. [[nodiscard]] virtual nsresult CompleteUpgrade( HttpTransactionShell* aTrans, nsIHttpUpgradeListener* aUpgradeListener) = 0; virtual nsHttpConnectionMgr* AsHttpConnectionMgr() = 0; virtual HttpConnectionMgrParent* AsHttpConnectionMgrParent() = 0; }; NS_DEFINE_STATIC_IID_ACCESSOR(HttpConnectionMgrShell, HTTPCONNECTIONMGRSHELL_IID) #define NS_DECL_HTTPCONNECTIONMGRSHELL \ virtual nsresult Init( \ uint16_t maxUrgentExcessiveConns, uint16_t maxConnections, \ uint16_t maxPersistentConnectionsPerHost, \ uint16_t maxPersistentConnectionsPerProxy, uint16_t maxRequestDelay, \ bool throttleEnabled, uint32_t throttleVersion, \ uint32_t throttleSuspendFor, uint32_t throttleResumeFor, \ uint32_t throttleReadLimit, uint32_t throttleReadInterval, \ uint32_t throttleHoldTime, uint32_t throttleMaxTime, \ bool beConservativeForProxy) override; \ virtual nsresult Shutdown() override; \ virtual nsresult UpdateRequestTokenBucket(EventTokenBucket* aBucket) \ override; \ virtual nsresult DoShiftReloadConnectionCleanup() override; \ virtual nsresult DoShiftReloadConnectionCleanupWithConnInfo( \ nsHttpConnectionInfo*) override; \ virtual nsresult PruneDeadConnections() override; \ virtual void AbortAndCloseAllConnections(int32_t, ARefBase*) override; \ virtual nsresult UpdateParam(nsParamName name, uint16_t value) override; \ virtual void PrintDiagnostics() override; \ virtual nsresult UpdateCurrentBrowserId(uint64_t aId) override; \ virtual nsresult AddTransaction(HttpTransactionShell*, int32_t priority) \ override; \ virtual nsresult AddTransactionWithStickyConn( \ HttpTransactionShell* trans, int32_t priority, \ HttpTransactionShell* transWithStickyConn) override; \ virtual nsresult RescheduleTransaction(HttpTransactionShell*, \ int32_t priority) override; \ void virtual UpdateClassOfServiceOnTransaction( \ HttpTransactionShell*, const ClassOfService& classOfService) override; \ virtual nsresult CancelTransaction(HttpTransactionShell*, nsresult reason) \ override; \ virtual nsresult ReclaimConnection(HttpConnectionBase* conn) override; \ virtual nsresult ProcessPendingQ(nsHttpConnectionInfo*) override; \ virtual nsresult ProcessPendingQ() override; \ virtual nsresult GetSocketThreadTarget(nsIEventTarget**) override; \ virtual nsresult SpeculativeConnect( \ nsHttpConnectionInfo*, nsIInterfaceRequestor*, uint32_t caps = 0, \ SpeculativeTransaction* = nullptr, bool aFetchHTTPSRR = false) override; \ virtual nsresult VerifyTraffic() override; \ virtual void ExcludeHttp2(const nsHttpConnectionInfo* ci) override; \ virtual void ExcludeHttp3(const nsHttpConnectionInfo* ci) override; \ virtual nsresult ClearConnectionHistory() override; \ virtual nsresult CompleteUpgrade(HttpTransactionShell* aTrans, \ nsIHttpUpgradeListener* aUpgradeListener) \ override; \ nsHttpConnectionMgr* AsHttpConnectionMgr() override; \ HttpConnectionMgrParent* AsHttpConnectionMgrParent() override; } // namespace mozilla::net #endif // HttpConnectionMgrShell_h__