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