1
#include "source/common/quic/client_codec_impl.h"
2

            
3
#include "source/common/quic/envoy_quic_client_stream.h"
4

            
5
namespace Envoy {
6
namespace Quic {
7

            
8
// Converts a QuicStream instance to EnvoyQuicStream instance. The current stream implementation
9
// inherits from these two interfaces, with the former one providing Quic interface and the latter
10
// providing Envoy interface.
11
9157
EnvoyQuicClientStream* quicStreamToEnvoyClientStream(quic::QuicStream* stream) {
12
9157
  return dynamic_cast<EnvoyQuicClientStream*>(stream);
13
9157
}
14

            
15
QuicHttpClientConnectionImpl::QuicHttpClientConnectionImpl(
16
    EnvoyQuicClientSession& session, Http::ConnectionCallbacks& callbacks,
17
    Http::Http3::CodecStats& stats,
18
    const envoy::config::core::v3::Http3ProtocolOptions& http3_options,
19
    const uint32_t max_request_headers_kb, const uint32_t max_response_headers_count)
20
3058
    : QuicHttpConnectionImplBase(session, stats), quic_client_session_(session) {
21
3058
  session.setCodecStats(stats);
22
3058
  session.setHttp3Options(http3_options);
23
3058
  session.setHttpConnectionCallbacks(callbacks);
24
3058
  session.setMaxIncomingHeadersCount(max_response_headers_count);
25
3058
  session.set_max_inbound_header_list_size(max_request_headers_kb * 1024);
26
3058
}
27

            
28
3
void QuicHttpClientConnectionImpl::goAway() {
29
3
  quic_client_session_.SendHttp3GoAway(quic::QUIC_PEER_GOING_AWAY, "client goaway");
30
3
}
31

            
32
Http::RequestEncoder&
33
4028
QuicHttpClientConnectionImpl::newStream(Http::ResponseDecoder& response_decoder) {
34
4028
  EnvoyQuicClientStream* stream =
35
4028
      quicStreamToEnvoyClientStream(quic_client_session_.CreateOutgoingBidirectionalStream());
36
4028
  ASSERT(stream != nullptr, "Fail to create QUIC stream.");
37
4028
  stream->setResponseDecoder(response_decoder);
38
4028
  if (quic_client_session_.aboveHighWatermark()) {
39
26
    stream->runHighWatermarkCallbacks();
40
26
  }
41
4028
  return *stream;
42
4028
}
43

            
44
2551
void QuicHttpClientConnectionImpl::onUnderlyingConnectionAboveWriteBufferHighWatermark() {
45
2553
  quic_client_session_.PerformActionOnActiveStreams([](quic::QuicStream* quic_stream) {
46
2553
    ENVOY_LOG(debug, "runHighWatermarkCallbacks on stream {}", quic_stream->id());
47
2553
    quicStreamToEnvoyClientStream(quic_stream)->runHighWatermarkCallbacks();
48
2553
    return true;
49
2553
  });
50
2551
}
51

            
52
2551
void QuicHttpClientConnectionImpl::onUnderlyingConnectionBelowWriteBufferLowWatermark() {
53
2576
  quic_client_session_.PerformActionOnActiveStreams([](quic::QuicStream* quic_stream) {
54
2576
    ENVOY_LOG(debug, "runLowWatermarkCallbacks on stream {}", quic_stream->id());
55
2576
    quicStreamToEnvoyClientStream(quic_stream)->runLowWatermarkCallbacks();
56
2576
    return true;
57
2576
  });
58
2551
}
59

            
60
} // namespace Quic
61
} // namespace Envoy