1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef SERVICES_NETWORK_QUIC_TRANSPORT_H_
6 #define SERVICES_NETWORK_QUIC_TRANSPORT_H_
7 
8 #include <memory>
9 
10 #include "base/containers/queue.h"
11 #include "base/macros.h"
12 #include "base/memory/weak_ptr.h"
13 #include "mojo/public/cpp/bindings/receiver.h"
14 #include "mojo/public/cpp/bindings/remote.h"
15 #include "net/quic/quic_transport_client.h"
16 #include "services/network/public/mojom/quic_transport.mojom.h"
17 
18 class GURL;
19 
20 namespace url {
21 class Origin;
22 }  // namespace url
23 
24 namespace net {
25 class NetworkIsolationKey;
26 }  // namespace net
27 
28 namespace network {
29 
30 class NetworkContext;
31 
32 // The implementation for QuicTransport
33 // (https://wicg.github.io/web-transport/#quic-transport) in the NetworkService.
34 // Implements mojom::QuicTransport with the net/ implementation.
COMPONENT_EXPORT(NETWORK_SERVICE)35 class COMPONENT_EXPORT(NETWORK_SERVICE) QuicTransport final
36     : public mojom::QuicTransport,
37       public net::QuicTransportClient::Visitor {
38  public:
39   class Stream;
40   using BidirectionalStreamAcceptanceCallback =
41       base::OnceCallback<void(uint32_t,
42                               mojo::ScopedDataPipeConsumerHandle,
43                               mojo::ScopedDataPipeProducerHandle)>;
44   using UnidirectionalStreamAcceptanceCallback =
45       base::OnceCallback<void(uint32_t, mojo::ScopedDataPipeConsumerHandle)>;
46   QuicTransport(const GURL& url,
47                 const url::Origin& origin,
48                 const net::NetworkIsolationKey& key,
49                 NetworkContext* context,
50                 mojo::PendingRemote<mojom::QuicTransportHandshakeClient>
51                     handshake_client);
52   ~QuicTransport() override;
53 
54   // mojom::QuicTransport implementation:
55   void SendDatagram(base::span<const uint8_t> data,
56                     base::OnceCallback<void(bool)> callback) override;
57   void CreateStream(mojo::ScopedDataPipeConsumerHandle readable,
58                     mojo::ScopedDataPipeProducerHandle writable,
59                     base::OnceCallback<void(bool, uint32_t)> callback) override;
60   void AcceptBidirectionalStream(
61       BidirectionalStreamAcceptanceCallback callback) override;
62   void AcceptUnidirectionalStream(
63       UnidirectionalStreamAcceptanceCallback callback) override;
64   void SendFin(uint32_t stream_id) override;
65 
66   // net::QuicTransportClient::Visitor implementation:
67   void OnConnected() override;
68   void OnConnectionFailed() override;
69   void OnClosed() override;
70   void OnError() override;
71   void OnIncomingBidirectionalStreamAvailable() override;
72   void OnIncomingUnidirectionalStreamAvailable() override;
73   void OnDatagramReceived(base::StringPiece datagram) override;
74   void OnCanCreateNewOutgoingBidirectionalStream() override;
75   void OnCanCreateNewOutgoingUnidirectionalStream() override;
76 
77   bool torn_down() const { return torn_down_; }
78 
79  private:
80   void TearDown();
81   void Dispose();
82 
83   const std::unique_ptr<net::QuicTransportClient> transport_;
84   NetworkContext* const context_;  // outlives |this|.
85 
86   std::map<uint32_t, std::unique_ptr<Stream>> streams_;
87 
88   // These callbacks must be destroyed after |client_| because of mojo callback
89   // destruction checks, so they are declared first.
90   base::queue<BidirectionalStreamAcceptanceCallback>
91       bidirectional_stream_acceptances_;
92   base::queue<UnidirectionalStreamAcceptanceCallback>
93       unidirectional_stream_acceptances_;
94 
95   mojo::Receiver<mojom::QuicTransport> receiver_;
96   mojo::Remote<mojom::QuicTransportHandshakeClient> handshake_client_;
97   mojo::Remote<mojom::QuicTransportClient> client_;
98 
99   bool torn_down_ = false;
100 
101   // This must be the last member.
102   base::WeakPtrFactory<QuicTransport> weak_factory_{this};
103 };
104 
105 }  // namespace network
106 
107 #endif  // SERVICES_NETWORK_QUIC_TRANSPORT_H_
108