1
#pragma once
2

            
3
#include "envoy/buffer/buffer.h"
4

            
5
#include "source/common/quic/envoy_quic_stream.h"
6
#include "source/common/runtime/runtime_features.h"
7

            
8
#ifdef ENVOY_ENABLE_HTTP_DATAGRAMS
9
#include "source/common/quic/http_datagram_handler.h"
10
#endif
11
#include "quiche/common/simple_buffer_allocator.h"
12
#include "quiche/quic/core/http/quic_spdy_client_stream.h"
13
#include "quiche/quic/core/qpack/qpack_encoder.h"
14
#include "quiche/quic/core/qpack/qpack_instruction_encoder.h"
15

            
16
namespace Envoy {
17
namespace Quic {
18

            
19
// This class is a quic stream and also a request encoder.
20
class EnvoyQuicClientStream : public quic::QuicSpdyClientStream,
21
                              public EnvoyQuicStream,
22
                              public Http::RequestEncoder,
23
                              public quic::QuicSpdyStream::MetadataVisitor {
24
public:
25
  EnvoyQuicClientStream(quic::QuicStreamId id, quic::QuicSpdyClientSession* client_session,
26
                        quic::StreamType type, Http::Http3::CodecStats& stats,
27
                        const envoy::config::core::v3::Http3ProtocolOptions& http3_options);
28

            
29
  void setResponseDecoder(Http::ResponseDecoder& decoder);
30

            
31
  // Http::StreamEncoder
32
3
  Http::Http1StreamEncoderOptionsOptRef http1StreamEncoderOptions() override {
33
3
    return absl::nullopt;
34
3
  }
35

            
36
  // Http::RequestEncoder
37
  Http::Status encodeHeaders(const Http::RequestHeaderMap& headers, bool end_stream) override;
38
  void encodeTrailers(const Http::RequestTrailerMap& trailers) override;
39
111
  void enableTcpTunneling() override {}
40

            
41
  // Http::Stream
42
  void resetStream(Http::StreamResetReason reason) override;
43
1
  void setFlushTimeout(std::chrono::milliseconds) override {}
44
40
  absl::optional<uint32_t> codecStreamId() const override { return id(); }
45

            
46
  // quic::QuicStream
47
  void OnStreamFrame(const quic::QuicStreamFrame& frame) override;
48
  bool OnStopSending(quic::QuicResetStreamError error) override;
49
  // quic::QuicSpdyStream
50
  void OnBodyAvailable() override;
51
  void OnStreamReset(const quic::QuicRstStreamFrame& frame) override;
52
  void ResetWithError(quic::QuicResetStreamError error) override;
53
  void OnClose() override;
54
  void OnCanWrite() override;
55
  // quic::Stream
56
  void OnConnectionClosed(const quic::QuicConnectionCloseFrame& frame,
57
                          quic::ConnectionCloseSource source) override;
58

            
59
  void clearWatermarkBuffer();
60

            
61
  // quic::QuicSpdyStream::MetadataVisitor
62
  void OnMetadataComplete(size_t frame_len, const quic::QuicHeaderList& header_list) override;
63

            
64
protected:
65
  // EnvoyQuicStream
66
  void switchStreamBlockState() override;
67
  uint32_t streamId() override;
68
  Network::Connection* connection() override;
69

            
70
  // quic::QuicSpdyStream
71
  // Overridden to pass headers to decoder.
72
  void OnInitialHeadersComplete(bool fin, size_t frame_len,
73
                                const quic::QuicHeaderList& header_list) override;
74
  void OnTrailingHeadersComplete(bool fin, size_t frame_len,
75
                                 const quic::QuicHeaderList& header_list) override;
76
  void OnInvalidHeaders() override;
77

            
78
  // Http::MultiplexedStreamImplBase
79
  bool hasPendingData() override;
80

            
81
  void onStreamError(absl::optional<bool> should_close_connection,
82
                     quic::QuicRstStreamErrorCode rst_code) override;
83

            
84
private:
85
  QuicFilterManagerConnectionImpl* filterManagerConnection();
86

            
87
  // Deliver awaiting trailers if body has been delivered.
88
  void maybeDecodeTrailers();
89

            
90
#ifdef ENVOY_ENABLE_HTTP_DATAGRAMS
91
  // Makes the QUIC stream use Capsule Protocol. Once this method is called, any calls to encodeData
92
  // are expected to contain capsules which will be sent along as HTTP Datagrams. Also, the stream
93
  // starts to receive HTTP/3 Datagrams and decode into Capsules.
94
  void useCapsuleProtocol();
95
#endif
96

            
97
  // Returns nullptr if the response decoder has already been destructed.
98
  Http::ResponseDecoder* getResponseDecoder();
99

            
100
  void onResponseDecoderDead() const;
101

            
102
  Http::ResponseDecoderHandlePtr response_decoder_handle_;
103
  Http::ResponseDecoder* response_decoder_{nullptr};
104
  bool decoded_1xx_{false};
105

            
106
  // When an HTTP Upgrade is requested, this contains the protocol upgrade type, e.g. "websocket".
107
  // It will be empty, when no such request is active.
108
  std::string upgrade_protocol_;
109
};
110

            
111
} // namespace Quic
112
} // namespace Envoy