/proc/self/cwd/source/common/http/http1/conn_pool.h
Line | Count | Source (jump to first uncovered line) |
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 | 445 | 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 | 445 | return stream_wrapper_.get() ? 1 : 0; |
32 | 445 | } |
33 | 53 | void releaseResources() override { |
34 | 53 | parent_.dispatcher().deferredDelete(std::move(stream_wrapper_)); |
35 | 53 | Envoy::Http::ActiveClient::releaseResources(); |
36 | 53 | } |
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 | 4 | 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 |