Line data Source code
1 : #pragma once 2 : 3 : #include "envoy/event/timer.h" 4 : #include "envoy/http/codec.h" 5 : #include "envoy/upstream/upstream.h" 6 : 7 : #include "source/common/http/codec_wrappers.h" 8 : #include "source/common/http/conn_pool_base.h" 9 : 10 : namespace Envoy { 11 : namespace Http { 12 : namespace Http1 { 13 : 14 : /** 15 : * An active client for HTTP/1.1 connections. 16 : */ 17 : class ActiveClient : public Envoy::Http::ActiveClient { 18 : public: 19 : ActiveClient(HttpConnPoolImplBase& parent, OptRef<Upstream::Host::CreateConnectionData> data); 20 : ~ActiveClient() override; 21 : 22 : // ConnPoolImplBase::ActiveClient 23 : bool closingWithIncompleteStream() const override; 24 : RequestEncoder& newStreamEncoder(ResponseDecoder& response_decoder) override; 25 : 26 467 : uint32_t numActiveStreams() const override { 27 : // Override the parent class using the codec for numActiveStreams. 28 : // Unfortunately for the HTTP/1 codec, the stream is destroyed before decode 29 : // is complete, and we must make sure the connection pool does not observe available 30 : // capacity and assign a new stream before decode is complete. 31 467 : return stream_wrapper_.get() ? 1 : 0; 32 467 : } 33 68 : void releaseResources() override { 34 68 : parent_.dispatcher().deferredDelete(std::move(stream_wrapper_)); 35 68 : Envoy::Http::ActiveClient::releaseResources(); 36 68 : } 37 : 38 : struct StreamWrapper : public RequestEncoderWrapper, 39 : public ResponseDecoderWrapper, 40 : public StreamCallbacks, 41 : public Event::DeferredDeletable, 42 : protected Logger::Loggable<Logger::Id::pool> { 43 : public: 44 : StreamWrapper(ResponseDecoder& response_decoder, ActiveClient& parent); 45 : ~StreamWrapper() override; 46 : 47 : // StreamEncoderWrapper 48 : void onEncodeComplete() override; 49 : 50 : // StreamDecoderWrapper 51 : void decodeHeaders(ResponseHeaderMapPtr&& headers, bool end_stream) override; 52 33 : void onPreDecodeComplete() override {} 53 : void onDecodeComplete() override; 54 : 55 : // Http::StreamCallbacks 56 : void onResetStream(StreamResetReason, absl::string_view) override; 57 0 : void onAboveWriteBufferHighWatermark() override {} 58 0 : void onBelowWriteBufferLowWatermark() override {} 59 : 60 : ActiveClient& parent_; 61 : bool stream_incomplete_{}; 62 : bool encode_complete_{}; 63 : bool decode_complete_{}; 64 : bool close_connection_{}; 65 : }; 66 : using StreamWrapperPtr = std::unique_ptr<StreamWrapper>; 67 : 68 : StreamWrapperPtr stream_wrapper_; 69 : }; 70 : 71 : ConnectionPool::InstancePtr 72 : allocateConnPool(Event::Dispatcher& dispatcher, Random::RandomGenerator& random_generator, 73 : Upstream::HostConstSharedPtr host, Upstream::ResourcePriority priority, 74 : const Network::ConnectionSocket::OptionsSharedPtr& options, 75 : const Network::TransportSocketOptionsConstSharedPtr& transport_socket_options, 76 : Upstream::ClusterConnectivityState& state); 77 : 78 : } // namespace Http1 79 : } // namespace Http 80 : } // namespace Envoy