Http3StreamTunnel.h (4099B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef mozilla_net_Http3StreamTunnel_h 7 #define mozilla_net_Http3StreamTunnel_h 8 9 #include "Http3Stream.h" 10 #include "nsHttpConnection.h" 11 #include "SimpleBuffer.h" 12 13 namespace mozilla::net { 14 15 class Http3StreamTunnel; 16 17 class Http3TransportLayer final : public nsISocketTransport, 18 public nsIInputStreamCallback, 19 public nsIOutputStreamCallback { 20 public: 21 NS_DECL_THREADSAFE_ISUPPORTS 22 NS_DECL_NSITRANSPORT 23 NS_DECL_NSISOCKETTRANSPORT 24 NS_DECL_NSIINPUTSTREAMCALLBACK 25 NS_DECL_NSIOUTPUTSTREAMCALLBACK 26 27 explicit Http3TransportLayer(Http3StreamTunnel* aStream); 28 29 already_AddRefed<Http3StreamTunnel> GetStream(); 30 nsresult Condition() const { return mCondition; } 31 nsIAsyncInputStream* GetInput(); 32 nsIAsyncOutputStream* GetOutput(); 33 nsresult CallToReadData(); 34 nsresult CallToWriteData(); 35 void OnStreamClosed(nsresult aReason); 36 37 private: 38 class InputStreamTunnel : public nsIAsyncInputStream { 39 public: 40 NS_DECL_THREADSAFE_ISUPPORTS 41 NS_DECL_NSIINPUTSTREAM 42 NS_DECL_NSIASYNCINPUTSTREAM 43 44 explicit InputStreamTunnel(Http3TransportLayer* aTransport); 45 46 nsresult OnSocketReady(nsresult condition); 47 bool HasCallback() { return !!mCallback; } 48 49 private: 50 friend class Http3TransportLayer; 51 virtual ~InputStreamTunnel() = default; 52 53 // The lifetime of InputStreamTunnel and OutputStreamTunnel are bound to 54 // Http3TransportLayer, so using |mTransport| as a raw pointer should be 55 // safe. 56 Http3TransportLayer* MOZ_OWNING_REF mTransport; 57 nsCOMPtr<nsIInputStreamCallback> mCallback; 58 nsresult mCondition{NS_OK}; 59 }; 60 class OutputStreamTunnel : public nsIAsyncOutputStream { 61 public: 62 NS_DECL_THREADSAFE_ISUPPORTS 63 NS_DECL_NSIOUTPUTSTREAM 64 NS_DECL_NSIASYNCOUTPUTSTREAM 65 66 explicit OutputStreamTunnel(Http3TransportLayer* aTransport); 67 68 nsresult OnSocketReady(nsresult condition); 69 void MaybeSetRequestDone(nsIOutputStreamCallback* aCallback); 70 71 private: 72 friend class Http3TransportLayer; 73 virtual ~OutputStreamTunnel() = default; 74 75 Http3TransportLayer* MOZ_OWNING_REF mTransport; 76 nsCOMPtr<nsIOutputStreamCallback> mCallback; 77 nsresult mCondition{NS_OK}; 78 }; 79 virtual ~Http3TransportLayer(); 80 81 RefPtr<Http3StreamTunnel> mStream; 82 InputStreamTunnel mInput; 83 OutputStreamTunnel mOutput; 84 nsresult mCondition{NS_OK}; 85 }; 86 87 class Http3StreamTunnel final : public Http3Stream { 88 public: 89 explicit Http3StreamTunnel(nsAHttpTransaction* aTrans, Http3Session* aSession, 90 uint64_t aCurrentBrowserId); 91 92 Http3WebTransportSession* GetHttp3WebTransportSession() override { 93 return nullptr; 94 } 95 Http3WebTransportStream* GetHttp3WebTransportStream() override { 96 return nullptr; 97 } 98 Http3Stream* GetHttp3Stream() override { return this; } 99 Http3ConnectUDPStream* GetHttp3ConnectUDPStream() override { return nullptr; } 100 Http3StreamTunnel* GetHttp3StreamTunnel() override { return this; } 101 102 nsresult TryActivating() override; 103 104 void Close(nsresult aResult) override; 105 106 already_AddRefed<nsHttpConnection> CreateHttpConnection( 107 nsIInterfaceRequestor* aCallbacks, PRIntervalTime aRtt, 108 bool aIsExtendedCONNECT); 109 110 void CleanupStream(nsresult aReason); 111 void SetRequestDone(); 112 void HasDataToWrite(); 113 void HasDataToRead(); 114 115 [[nodiscard]] nsresult ReadSegments() override; 116 [[nodiscard]] nsresult WriteSegments() override; 117 118 [[nodiscard]] nsresult OnWriteSegment(char* buf, uint32_t count, 119 uint32_t* countWritten) override; 120 121 private: 122 virtual ~Http3StreamTunnel(); 123 nsresult BufferInput(); 124 125 RefPtr<Http3TransportLayer> mTransport; 126 bool mClosed = false; 127 SimpleBuffer mSimpleBuffer; 128 }; 129 130 } // namespace mozilla::net 131 132 #endif // mozilla_net_Http3StreamTunnel_h