Http3WebTransportSession.h (4600B)
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_Http3WebTransportSession_h 7 #define mozilla_net_Http3WebTransportSession_h 8 9 #include "WebTransportSessionBase.h" 10 #include "Http3StreamBase.h" 11 #include "nsIWebTransport.h" 12 #include "mozilla/net/NeqoHttp3Conn.h" 13 14 namespace mozilla::net { 15 16 class Http3Session; 17 18 class Http3TunnelStreamBase : public Http3StreamBase, 19 public nsAHttpSegmentWriter, 20 public nsAHttpSegmentReader { 21 public: 22 NS_DECL_NSAHTTPSEGMENTWRITER 23 NS_DECL_NSAHTTPSEGMENTREADER 24 25 explicit Http3TunnelStreamBase(nsAHttpTransaction* trans, 26 Http3SessionBase* aHttp3Session); 27 28 [[nodiscard]] nsresult ReadSegments() override; 29 [[nodiscard]] nsresult WriteSegments() override; 30 31 void SetResponseHeaders(nsTArray<uint8_t>& aResponseHeaders, bool fin, 32 bool interim) override; 33 34 virtual nsresult TryActivating(); 35 36 bool Done() const override { return mRecvState == RECV_DONE; } 37 38 virtual void OnDatagramReceived(nsTArray<uint8_t>&& aData) = 0; 39 40 void TransactionIsDone(nsresult aResult); 41 42 virtual bool OnActivated() { return true; } 43 virtual nsresult OnProcessDatagram() { return NS_OK; } 44 45 protected: 46 bool ConsumeHeaders(const char* buf, uint32_t avail, uint32_t* countUsed); 47 virtual void OnClosePending() = 0; 48 49 enum RecvStreamState { 50 BEFORE_HEADERS, 51 READING_HEADERS, 52 READING_INTERIM_HEADERS, 53 ACTIVE, 54 CLOSE_PENDING, 55 RECV_DONE 56 } mRecvState{BEFORE_HEADERS}; 57 58 enum SendStreamState { 59 PREPARING_HEADERS, 60 WAITING_TO_ACTIVATE, 61 PROCESSING_DATAGRAM, 62 SEND_DONE, 63 } mSendState{PREPARING_HEADERS}; 64 65 nsCString mFlatHttpRequestHeaders; 66 nsTArray<uint8_t> mFlatResponseHeaders; 67 68 nsresult mSocketInCondition = NS_ERROR_NOT_INITIALIZED; 69 nsresult mSocketOutCondition = NS_ERROR_NOT_INITIALIZED; 70 }; 71 72 // TODO Http3WebTransportSession is very similar to Http3Stream. It should 73 // be built on top of it with a couple of small changes. The docs will be added 74 // when this is implemented. 75 76 class Http3WebTransportSession final : public WebTransportSessionBase, 77 public Http3TunnelStreamBase { 78 public: 79 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(Http3WebTransportSession, override) 80 81 Http3WebTransportSession(nsAHttpTransaction*, Http3Session*); 82 83 Http3WebTransportSession* GetHttp3WebTransportSession() override { 84 return this; 85 } 86 Http3WebTransportStream* GetHttp3WebTransportStream() override { 87 return nullptr; 88 } 89 Http3Stream* GetHttp3Stream() override { return nullptr; } 90 Http3ConnectUDPStream* GetHttp3ConnectUDPStream() override { return nullptr; } 91 Http3StreamTunnel* GetHttp3StreamTunnel() override { return nullptr; } 92 93 void Close(nsresult aResult) override; 94 95 void CloseSession(uint32_t aStatus, const nsACString& aReason) override; 96 void OnSessionClosed(bool aCleanly, uint32_t aStatus, 97 const nsACString& aReason); 98 99 uint64_t GetStreamId() const override; 100 101 void CreateOutgoingBidirectionalStream( 102 std::function<void(Result<RefPtr<WebTransportStreamBase>, nsresult>&&)>&& 103 aCallback) override; 104 void CreateOutgoingUnidirectionalStream( 105 std::function<void(Result<RefPtr<WebTransportStreamBase>, nsresult>&&)>&& 106 aCallback) override; 107 void RemoveWebTransportStream(Http3WebTransportStream* aStream); 108 109 already_AddRefed<Http3WebTransportStream> OnIncomingWebTransportStream( 110 WebTransportStreamType aType, uint64_t aId); 111 112 void SendDatagram(nsTArray<uint8_t>&& aData, uint64_t aTrackingId) override; 113 114 void OnDatagramReceived(nsTArray<uint8_t>&& aData) override; 115 116 void GetMaxDatagramSize() override; 117 118 void OnOutgoingDatagramOutCome( 119 uint64_t aId, WebTransportSessionEventListener::DatagramOutcome aOutCome); 120 121 void OnStreamStopSending(uint64_t aId, nsresult aError); 122 void OnStreamReset(uint64_t aId, nsresult aError); 123 124 private: 125 virtual ~Http3WebTransportSession(); 126 127 void CreateStreamInternal( 128 bool aBidi, 129 std::function<void(Result<RefPtr<WebTransportStreamBase>, nsresult>&&)>&& 130 aCallback); 131 void OnClosePending() override; 132 133 nsTArray<RefPtr<Http3WebTransportStream>> mStreams; 134 uint32_t mStatus{0}; 135 nsCString mReason; 136 }; 137 138 } // namespace mozilla::net 139 #endif // mozilla_net_Http3WebTransportSession_h