Coverage Report

Created: 2023-11-12 09:30

/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