1
#pragma once
2

            
3
#include "envoy/event/timer.h"
4
#include "envoy/http/codec.h"
5
#include "envoy/server/overload/overload_manager.h"
6
#include "envoy/upstream/upstream.h"
7

            
8
#include "source/common/http/codec_wrappers.h"
9
#include "source/common/http/conn_pool_base.h"
10

            
11
namespace Envoy {
12
namespace Http {
13
namespace Http1 {
14

            
15
/**
16
 * An active client for HTTP/1.1 connections.
17
 */
18
class ActiveClient : public Envoy::Http::ActiveClient {
19
public:
20
  ActiveClient(HttpConnPoolImplBase& parent, OptRef<Upstream::Host::CreateConnectionData> data);
21
  ~ActiveClient() override;
22

            
23
  // ConnPoolImplBase::ActiveClient
24
  bool closingWithIncompleteStream() const override;
25
  RequestEncoder& newStreamEncoder(ResponseDecoder& response_decoder) override;
26
  RequestEncoder& newStreamEncoder(ResponseDecoderHandlePtr response_decoder_handle) override;
27

            
28
248147
  uint32_t numActiveStreams() const override {
29
    // Override the parent class using the codec for numActiveStreams.
30
    // Unfortunately for the HTTP/1 codec, the stream is destroyed before decode
31
    // is complete, and we must make sure the connection pool does not observe available
32
    // capacity and assign a new stream before decode is complete.
33
248147
    return stream_wrapper_.get() ? 1 : 0;
34
248147
  }
35
21906
  void releaseResources() override {
36
21906
    parent_.dispatcher().deferredDelete(std::move(stream_wrapper_));
37
21906
    Envoy::Http::ActiveClient::releaseResources();
38
21906
  }
39

            
40
  struct StreamWrapper : public ResponseDecoderWrapper,
41
                         public RequestEncoderWrapper,
42
                         public StreamCallbacks,
43
                         public Event::DeferredDeletable,
44
                         protected Logger::Loggable<Logger::Id::pool> {
45
  public:
46
    StreamWrapper(ResponseDecoder& response_decoder, ActiveClient& parent);
47
    StreamWrapper(ResponseDecoderHandlePtr response_decoder_handle, ActiveClient& parent);
48

            
49
    ~StreamWrapper() override;
50

            
51
    // StreamEncoderWrapper
52
    void onEncodeComplete() override;
53

            
54
    // StreamDecoderWrapper
55
    void decodeHeaders(ResponseHeaderMapPtr&& headers, bool end_stream) override;
56
24367
    void onPreDecodeComplete() override {}
57
    void onDecodeComplete() override;
58

            
59
    // Http::StreamCallbacks
60
    void onResetStream(StreamResetReason, absl::string_view) override;
61
70072
    void onAboveWriteBufferHighWatermark() override {}
62
70072
    void onBelowWriteBufferLowWatermark() override {}
63

            
64
    ActiveClient& parent_;
65
    bool stream_incomplete_{};
66
    bool encode_complete_{};
67
    bool decode_complete_{};
68
    bool close_connection_{};
69
  };
70
  using StreamWrapperPtr = std::unique_ptr<StreamWrapper>;
71

            
72
  StreamWrapperPtr stream_wrapper_;
73
};
74

            
75
ConnectionPool::InstancePtr
76
allocateConnPool(Event::Dispatcher& dispatcher, Random::RandomGenerator& random_generator,
77
                 Upstream::HostConstSharedPtr host, Upstream::ResourcePriority priority,
78
                 const Network::ConnectionSocket::OptionsSharedPtr& options,
79
                 const Network::TransportSocketOptionsConstSharedPtr& transport_socket_options,
80
                 Upstream::ClusterConnectivityState& state,
81
                 Server::OverloadManager& overload_manager);
82

            
83
} // namespace Http1
84
} // namespace Http
85
} // namespace Envoy