LCOV - code coverage report
Current view: top level - source/common/network - transport_socket_options_impl.h (source / functions) Hit Total Coverage
Test: coverage.dat Lines: 29 48 60.4 %
Date: 2024-01-05 06:35:25 Functions: 10 16 62.5 %

          Line data    Source code
       1             : #pragma once
       2             : 
       3             : #include "envoy/common/optref.h"
       4             : #include "envoy/network/proxy_protocol.h"
       5             : #include "envoy/network/transport_socket.h"
       6             : #include "envoy/stream_info/filter_state.h"
       7             : 
       8             : namespace Envoy {
       9             : namespace Network {
      10             : 
      11             : // A wrapper around another TransportSocketOptions that overrides the ALPN fallback.
      12             : class AlpnDecoratingTransportSocketOptions : public TransportSocketOptions {
      13             : public:
      14             :   AlpnDecoratingTransportSocketOptions(std::vector<std::string>&& alpn,
      15             :                                        TransportSocketOptionsConstSharedPtr inner_options)
      16         140 :       : alpn_fallback_(std::move(alpn)), inner_options_(std::move(inner_options)) {}
      17             :   // Network::TransportSocketOptions
      18           0 :   const absl::optional<std::string>& serverNameOverride() const override {
      19           0 :     return inner_options_->serverNameOverride();
      20           0 :   }
      21           0 :   const std::vector<std::string>& verifySubjectAltNameListOverride() const override {
      22           0 :     return inner_options_->verifySubjectAltNameListOverride();
      23           0 :   }
      24           0 :   const std::vector<std::string>& applicationProtocolListOverride() const override {
      25           0 :     return inner_options_->applicationProtocolListOverride();
      26           0 :   }
      27           0 :   const std::vector<std::string>& applicationProtocolFallback() const override {
      28           0 :     return alpn_fallback_;
      29           0 :   }
      30           0 :   absl::optional<Network::ProxyProtocolData> proxyProtocolOptions() const override {
      31           0 :     return inner_options_->proxyProtocolOptions();
      32           0 :   }
      33         208 :   OptRef<const Http11ProxyInfo> http11ProxyInfo() const override {
      34         208 :     return inner_options_->http11ProxyInfo();
      35         208 :   }
      36         140 :   const StreamInfo::FilterState::Objects& downstreamSharedFilterStateObjects() const override {
      37         140 :     return inner_options_->downstreamSharedFilterStateObjects();
      38         140 :   }
      39             : 
      40             : private:
      41             :   const std::vector<std::string> alpn_fallback_;
      42             :   const TransportSocketOptionsConstSharedPtr inner_options_;
      43             : };
      44             : 
      45             : class TransportSocketOptionsImpl : public TransportSocketOptions {
      46             : public:
      47             :   TransportSocketOptionsImpl(
      48             :       absl::string_view override_server_name = "",
      49             :       std::vector<std::string>&& override_verify_san_list = {},
      50             :       std::vector<std::string>&& override_alpn = {}, std::vector<std::string>&& fallback_alpn = {},
      51             :       absl::optional<Network::ProxyProtocolData> proxy_proto_options = absl::nullopt,
      52             :       StreamInfo::FilterState::ObjectsPtr filter_state_objects =
      53             :           std::make_unique<StreamInfo::FilterState::Objects>(),
      54             :       std::unique_ptr<const Http11ProxyInfo>&& proxy_info = nullptr)
      55             :       : override_server_name_(override_server_name.empty()
      56             :                                   ? absl::nullopt
      57             :                                   : absl::optional<std::string>(override_server_name)),
      58             :         override_verify_san_list_{std::move(override_verify_san_list)},
      59             :         override_alpn_list_{std::move(override_alpn)}, alpn_fallback_{std::move(fallback_alpn)},
      60             :         proxy_protocol_options_(proxy_proto_options),
      61         264 :         filter_state_objects_(std::move(filter_state_objects)), proxy_info_(std::move(proxy_info)) {
      62         264 :   }
      63             : 
      64             :   // Network::TransportSocketOptions
      65         323 :   const absl::optional<std::string>& serverNameOverride() const override {
      66         323 :     return override_server_name_;
      67         323 :   }
      68         183 :   const std::vector<std::string>& verifySubjectAltNameListOverride() const override {
      69         183 :     return override_verify_san_list_;
      70         183 :   }
      71         183 :   const std::vector<std::string>& applicationProtocolListOverride() const override {
      72         183 :     return override_alpn_list_;
      73         183 :   }
      74         183 :   const std::vector<std::string>& applicationProtocolFallback() const override {
      75         183 :     return alpn_fallback_;
      76         183 :   }
      77           0 :   absl::optional<Network::ProxyProtocolData> proxyProtocolOptions() const override {
      78           0 :     return proxy_protocol_options_;
      79           0 :   }
      80         493 :   OptRef<const Http11ProxyInfo> http11ProxyInfo() const override {
      81         493 :     if (!proxy_info_) {
      82         493 :       return {};
      83         493 :     }
      84           0 :     return {*proxy_info_};
      85         493 :   }
      86         356 :   const StreamInfo::FilterState::Objects& downstreamSharedFilterStateObjects() const override {
      87         356 :     return *filter_state_objects_;
      88         356 :   }
      89             : 
      90             : private:
      91             :   const absl::optional<std::string> override_server_name_;
      92             :   const std::vector<std::string> override_verify_san_list_;
      93             :   const std::vector<std::string> override_alpn_list_;
      94             :   const std::vector<std::string> alpn_fallback_;
      95             :   const absl::optional<Network::ProxyProtocolData> proxy_protocol_options_;
      96             :   const StreamInfo::FilterState::ObjectsPtr filter_state_objects_;
      97             :   const StreamInfo::FilterStateSharedPtr filter_state_;
      98             :   std::unique_ptr<const Http11ProxyInfo> proxy_info_;
      99             : };
     100             : 
     101             : class TransportSocketOptionsUtility {
     102             : public:
     103             :   /**
     104             :    * Construct TransportSocketOptions from StreamInfo::FilterState, using UpstreamServerName
     105             :    * and ApplicationProtocols key in the filter state.
     106             :    * @returns TransportSocketOptionsConstSharedPtr a shared pointer to the transport socket options,
     107             :    * nullptr if nothing is in the filter state.
     108             :    */
     109             :   static TransportSocketOptionsConstSharedPtr
     110             :   fromFilterState(const StreamInfo::FilterState& stream_info);
     111             : };
     112             : 
     113             : class CommonUpstreamTransportSocketFactory : public UpstreamTransportSocketFactory {
     114             : public:
     115             :   /**
     116             :    * Compute the generic hash key from the transport socket options.
     117             :    */
     118             :   void hashKey(std::vector<uint8_t>& key,
     119             :                TransportSocketOptionsConstSharedPtr options) const override;
     120             : };
     121             : 
     122             : } // namespace Network
     123             : } // namespace Envoy

Generated by: LCOV version 1.15