tor-browser

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

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