/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set sw=2 ts=8 et tw=80 : */ /* 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 mozilla_net_Http2StreamTunnel_h #define mozilla_net_Http2StreamTunnel_h #include "Http2StreamBase.h" #include "nsHttpConnection.h" #include "nsWeakReference.h" namespace mozilla::net { class OutputStreamTunnel; class InputStreamTunnel; // c881f764-a183-45cb-9dec-d9872b2f47b2 #define NS_HTTP2STREAMTUNNEL_IID \ { \ 0xc881f764, 0xa183, 0x45cb, { \ 0x9d, 0xec, 0xd9, 0x87, 0x2b, 0x2f, 0x47, 0xb2 \ } \ } class Http2StreamTunnel : public Http2StreamBase, public nsISocketTransport, public nsSupportsWeakReference { public: NS_DECLARE_STATIC_IID_ACCESSOR(NS_HTTP2STREAMTUNNEL_IID) NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSITRANSPORT NS_DECL_NSISOCKETTRANSPORT Http2StreamTunnel(Http2Session* session, int32_t priority, uint64_t bcId, nsHttpConnectionInfo* aConnectionInfo); bool IsTunnel() override { return true; } already_AddRefed CreateHttpConnection( nsAHttpTransaction* httpTransaction, nsIInterfaceRequestor* aCallbacks, PRIntervalTime aRtt, bool aIsWebSocket); nsHttpConnectionInfo* ConnectionInfo() override { return mConnectionInfo; } void SetRequestDone() { mSendClosed = true; } nsresult Condition() override { return mCondition; } void CloseStream(nsresult reason) override; void DisableSpdy() override { if (mTransaction) { mTransaction->DisableHttp2ForProxy(); } } void ReuseConnectionOnRestartOK(bool aReuse) override { // Do nothing here. We'll never reuse the connection. } void MakeNonSticky() override {} protected: ~Http2StreamTunnel(); nsresult CallToReadData(uint32_t count, uint32_t* countRead) override; nsresult CallToWriteData(uint32_t count, uint32_t* countWritten) override; void HandleResponseHeaders(nsACString& aHeadersOut, int32_t httpResponseCode) override; nsresult GenerateHeaders(nsCString& aCompressedData, uint8_t& firstFrameFlags) override; bool CloseSendStreamWhenDone() override { return mSendClosed; } RefPtr mTransaction; void ClearTransactionsBlockedOnTunnel(); bool DispatchRelease(); RefPtr mOutput; RefPtr mInput; RefPtr mConnectionInfo; bool mSendClosed{false}; nsresult mCondition{NS_OK}; }; // f9d10060-f5d4-443e-ba59-f84ea975c5f0 #define NS_OUTPUTSTREAMTUNNEL_IID \ { \ 0xf9d10060, 0xf5d4, 0x443e, { \ 0xba, 0x59, 0xf8, 0x4e, 0xa9, 0x75, 0xc5, 0xf0 \ } \ } class OutputStreamTunnel : public nsIAsyncOutputStream { public: NS_DECLARE_STATIC_IID_ACCESSOR(NS_OUTPUTSTREAMTUNNEL_IID) NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIOUTPUTSTREAM NS_DECL_NSIASYNCOUTPUTSTREAM explicit OutputStreamTunnel(Http2StreamTunnel* aStream); nsresult OnSocketReady(nsresult condition); void MaybeSetRequestDone(nsIOutputStreamCallback* aCallback); private: virtual ~OutputStreamTunnel(); nsresult GetStream(Http2StreamTunnel** aStream); nsresult GetSession(Http2Session** aSession); nsWeakPtr mWeakStream; nsCOMPtr mCallback; nsresult mCondition{NS_OK}; }; class InputStreamTunnel : public nsIAsyncInputStream { public: NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIINPUTSTREAM NS_DECL_NSIASYNCINPUTSTREAM explicit InputStreamTunnel(Http2StreamTunnel* aStream); nsresult OnSocketReady(nsresult condition); bool HasCallback() { return !!mCallback; } private: virtual ~InputStreamTunnel(); nsresult GetStream(Http2StreamTunnel** aStream); nsresult GetSession(Http2Session** aSession); nsWeakPtr mWeakStream; nsCOMPtr mCallback; nsresult mCondition{NS_OK}; }; NS_DEFINE_STATIC_IID_ACCESSOR(Http2StreamTunnel, NS_HTTP2STREAMTUNNEL_IID) NS_DEFINE_STATIC_IID_ACCESSOR(OutputStreamTunnel, NS_OUTPUTSTREAMTUNNEL_IID) class Http2StreamWebSocket : public Http2StreamTunnel { public: Http2StreamWebSocket(Http2Session* session, int32_t priority, uint64_t bcId, nsHttpConnectionInfo* aConnectionInfo); void CloseStream(nsresult reason) override; protected: virtual ~Http2StreamWebSocket(); nsresult GenerateHeaders(nsCString& aCompressedData, uint8_t& firstFrameFlags) override; }; } // namespace mozilla::net #endif // mozilla_net_Http2StreamTunnel_h