tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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