File: Http3StreamTunnel.h

package info (click to toggle)
firefox 147.0.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,683,320 kB
  • sloc: cpp: 7,607,359; javascript: 6,533,295; ansic: 3,775,223; python: 1,415,500; xml: 634,561; asm: 438,949; java: 186,241; sh: 62,752; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (132 lines) | stat: -rw-r--r-- 4,099 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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_Http3StreamTunnel_h
#define mozilla_net_Http3StreamTunnel_h

#include "Http3Stream.h"
#include "nsHttpConnection.h"
#include "SimpleBuffer.h"

namespace mozilla::net {

class Http3StreamTunnel;

class Http3TransportLayer final : public nsISocketTransport,
                                  public nsIInputStreamCallback,
                                  public nsIOutputStreamCallback {
 public:
  NS_DECL_THREADSAFE_ISUPPORTS
  NS_DECL_NSITRANSPORT
  NS_DECL_NSISOCKETTRANSPORT
  NS_DECL_NSIINPUTSTREAMCALLBACK
  NS_DECL_NSIOUTPUTSTREAMCALLBACK

  explicit Http3TransportLayer(Http3StreamTunnel* aStream);

  already_AddRefed<Http3StreamTunnel> GetStream();
  nsresult Condition() const { return mCondition; }
  nsIAsyncInputStream* GetInput();
  nsIAsyncOutputStream* GetOutput();
  nsresult CallToReadData();
  nsresult CallToWriteData();
  void OnStreamClosed(nsresult aReason);

 private:
  class InputStreamTunnel : public nsIAsyncInputStream {
   public:
    NS_DECL_THREADSAFE_ISUPPORTS
    NS_DECL_NSIINPUTSTREAM
    NS_DECL_NSIASYNCINPUTSTREAM

    explicit InputStreamTunnel(Http3TransportLayer* aTransport);

    nsresult OnSocketReady(nsresult condition);
    bool HasCallback() { return !!mCallback; }

   private:
    friend class Http3TransportLayer;
    virtual ~InputStreamTunnel() = default;

    // The lifetime of InputStreamTunnel and OutputStreamTunnel are bound to
    // Http3TransportLayer, so using |mTransport| as a raw pointer should be
    // safe.
    Http3TransportLayer* MOZ_OWNING_REF mTransport;
    nsCOMPtr<nsIInputStreamCallback> mCallback;
    nsresult mCondition{NS_OK};
  };
  class OutputStreamTunnel : public nsIAsyncOutputStream {
   public:
    NS_DECL_THREADSAFE_ISUPPORTS
    NS_DECL_NSIOUTPUTSTREAM
    NS_DECL_NSIASYNCOUTPUTSTREAM

    explicit OutputStreamTunnel(Http3TransportLayer* aTransport);

    nsresult OnSocketReady(nsresult condition);
    void MaybeSetRequestDone(nsIOutputStreamCallback* aCallback);

   private:
    friend class Http3TransportLayer;
    virtual ~OutputStreamTunnel() = default;

    Http3TransportLayer* MOZ_OWNING_REF mTransport;
    nsCOMPtr<nsIOutputStreamCallback> mCallback;
    nsresult mCondition{NS_OK};
  };
  virtual ~Http3TransportLayer();

  RefPtr<Http3StreamTunnel> mStream;
  InputStreamTunnel mInput;
  OutputStreamTunnel mOutput;
  nsresult mCondition{NS_OK};
};

class Http3StreamTunnel final : public Http3Stream {
 public:
  explicit Http3StreamTunnel(nsAHttpTransaction* aTrans, Http3Session* aSession,
                             uint64_t aCurrentBrowserId);

  Http3WebTransportSession* GetHttp3WebTransportSession() override {
    return nullptr;
  }
  Http3WebTransportStream* GetHttp3WebTransportStream() override {
    return nullptr;
  }
  Http3Stream* GetHttp3Stream() override { return this; }
  Http3ConnectUDPStream* GetHttp3ConnectUDPStream() override { return nullptr; }
  Http3StreamTunnel* GetHttp3StreamTunnel() override { return this; }

  nsresult TryActivating() override;

  void Close(nsresult aResult) override;

  already_AddRefed<nsHttpConnection> CreateHttpConnection(
      nsIInterfaceRequestor* aCallbacks, PRIntervalTime aRtt,
      bool aIsExtendedCONNECT);

  void CleanupStream(nsresult aReason);
  void SetRequestDone();
  void HasDataToWrite();
  void HasDataToRead();

  [[nodiscard]] nsresult ReadSegments() override;
  [[nodiscard]] nsresult WriteSegments() override;

  [[nodiscard]] nsresult OnWriteSegment(char* buf, uint32_t count,
                                        uint32_t* countWritten) override;

 private:
  virtual ~Http3StreamTunnel();
  nsresult BufferInput();

  RefPtr<Http3TransportLayer> mTransport;
  bool mClosed = false;
  SimpleBuffer mSimpleBuffer;
};

}  // namespace mozilla::net

#endif  // mozilla_net_Http3StreamTunnel_h