Line data Source code
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 0 : EnvoyQuicClientStream* quicStreamToEnvoyClientStream(quic::QuicStream* stream) { 12 0 : return dynamic_cast<EnvoyQuicClientStream*>(stream); 13 0 : } 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 0 : : QuicHttpConnectionImplBase(session, stats), quic_client_session_(session) { 21 0 : session.setCodecStats(stats); 22 0 : session.setHttp3Options(http3_options); 23 0 : session.setHttpConnectionCallbacks(callbacks); 24 0 : session.setMaxIncomingHeadersCount(max_response_headers_count); 25 0 : session.set_max_inbound_header_list_size(max_request_headers_kb * 1024); 26 0 : } 27 : 28 0 : void QuicHttpClientConnectionImpl::goAway() { 29 0 : quic_client_session_.SendHttp3GoAway(quic::QUIC_PEER_GOING_AWAY, "client goaway"); 30 0 : } 31 : 32 : Http::RequestEncoder& 33 0 : QuicHttpClientConnectionImpl::newStream(Http::ResponseDecoder& response_decoder) { 34 0 : EnvoyQuicClientStream* stream = 35 0 : quicStreamToEnvoyClientStream(quic_client_session_.CreateOutgoingBidirectionalStream()); 36 0 : ASSERT(stream != nullptr, "Fail to create QUIC stream."); 37 0 : stream->setResponseDecoder(response_decoder); 38 0 : if (quic_client_session_.aboveHighWatermark()) { 39 0 : stream->runHighWatermarkCallbacks(); 40 0 : } 41 0 : return *stream; 42 0 : } 43 : 44 0 : void QuicHttpClientConnectionImpl::onUnderlyingConnectionAboveWriteBufferHighWatermark() { 45 0 : quic_client_session_.PerformActionOnActiveStreams([](quic::QuicStream* quic_stream) { 46 0 : ENVOY_LOG(debug, "runHighWatermarkCallbacks on stream {}", quic_stream->id()); 47 0 : quicStreamToEnvoyClientStream(quic_stream)->runHighWatermarkCallbacks(); 48 0 : return true; 49 0 : }); 50 0 : } 51 : 52 0 : void QuicHttpClientConnectionImpl::onUnderlyingConnectionBelowWriteBufferLowWatermark() { 53 0 : quic_client_session_.PerformActionOnActiveStreams([](quic::QuicStream* quic_stream) { 54 0 : ENVOY_LOG(debug, "runLowWatermarkCallbacks on stream {}", quic_stream->id()); 55 0 : quicStreamToEnvoyClientStream(quic_stream)->runLowWatermarkCallbacks(); 56 0 : return true; 57 0 : }); 58 0 : } 59 : 60 : } // namespace Quic 61 : } // namespace Envoy