LCOV - code coverage report
Current view: top level - source/common/network - resolver_impl.cc (source / functions) Hit Total Coverage
Test: coverage.dat Lines: 40 49 81.6 %
Date: 2024-01-05 06:35:25 Functions: 4 4 100.0 %

          Line data    Source code
       1             : #include "source/common/network/resolver_impl.h"
       2             : 
       3             : #include "envoy/common/exception.h"
       4             : #include "envoy/config/core/v3/address.pb.h"
       5             : #include "envoy/network/address.h"
       6             : #include "envoy/network/resolver.h"
       7             : #include "envoy/registry/registry.h"
       8             : 
       9             : #include "source/common/config/well_known_names.h"
      10             : #include "source/common/network/address_impl.h"
      11             : #include "source/common/network/utility.h"
      12             : 
      13             : namespace Envoy {
      14             : namespace Network {
      15             : namespace Address {
      16             : 
      17             : /**
      18             :  * Implementation of a resolver for IP addresses.
      19             :  */
      20             : class IpResolver : public Resolver {
      21             : 
      22             : public:
      23             :   InstanceConstSharedPtr
      24         504 :   resolve(const envoy::config::core::v3::SocketAddress& socket_address) override {
      25         504 :     switch (socket_address.port_specifier_case()) {
      26         504 :     case envoy::config::core::v3::SocketAddress::PortSpecifierCase::kPortValue:
      27             :     // Default to port 0 if no port value is specified.
      28         504 :     case envoy::config::core::v3::SocketAddress::PortSpecifierCase::PORT_SPECIFIER_NOT_SET:
      29         504 :       return Network::Utility::parseInternetAddress(
      30         504 :           socket_address.address(), socket_address.port_value(), !socket_address.ipv4_compat());
      31           0 :     case envoy::config::core::v3::SocketAddress::PortSpecifierCase::kNamedPort:
      32           0 :       break;
      33         504 :     }
      34         504 :     throwEnvoyExceptionOrPanic(fmt::format("IP resolver can't handle port specifier type {}",
      35         504 :                                            socket_address.port_specifier_case()));
      36         504 :   }
      37             : 
      38          56 :   std::string name() const override { return Config::AddressResolverNames::get().IP; }
      39             : };
      40             : 
      41             : /**
      42             :  * Static registration for the IP resolver. @see RegisterFactory.
      43             :  */
      44             : REGISTER_FACTORY(IpResolver, Resolver);
      45             : 
      46         578 : InstanceConstSharedPtr resolveProtoAddress(const envoy::config::core::v3::Address& address) {
      47         578 :   switch (address.address_case()) {
      48           1 :   case envoy::config::core::v3::Address::AddressCase::ADDRESS_NOT_SET:
      49           1 :     throwEnvoyExceptionOrPanic("Address must be set: " + address.DebugString());
      50         504 :   case envoy::config::core::v3::Address::AddressCase::kSocketAddress:
      51         504 :     return resolveProtoSocketAddress(address.socket_address());
      52          72 :   case envoy::config::core::v3::Address::AddressCase::kPipe:
      53          72 :     return std::make_shared<PipeInstance>(address.pipe().path(), address.pipe().mode());
      54           1 :   case envoy::config::core::v3::Address::AddressCase::kEnvoyInternalAddress:
      55           1 :     switch (address.envoy_internal_address().address_name_specifier_case()) {
      56           1 :     case envoy::config::core::v3::EnvoyInternalAddress::AddressNameSpecifierCase::
      57           1 :         kServerListenerName:
      58           1 :       return std::make_shared<EnvoyInternalInstance>(
      59           1 :           address.envoy_internal_address().server_listener_name(),
      60           1 :           address.envoy_internal_address().endpoint_id());
      61           0 :     case envoy::config::core::v3::EnvoyInternalAddress::AddressNameSpecifierCase::
      62           0 :         ADDRESS_NAME_SPECIFIER_NOT_SET:
      63           0 :       break;
      64           1 :     }
      65         578 :   }
      66         578 :   throwEnvoyExceptionOrPanic("Failed to resolve address:" + address.DebugString());
      67         578 : }
      68             : 
      69             : InstanceConstSharedPtr
      70         504 : resolveProtoSocketAddress(const envoy::config::core::v3::SocketAddress& socket_address) {
      71         504 :   Resolver* resolver = nullptr;
      72         504 :   const std::string& resolver_name = socket_address.resolver_name();
      73         504 :   if (resolver_name.empty()) {
      74         504 :     resolver =
      75         504 :         Registry::FactoryRegistry<Resolver>::getFactory(Config::AddressResolverNames::get().IP);
      76         504 :   } else {
      77           0 :     resolver = Registry::FactoryRegistry<Resolver>::getFactory(resolver_name);
      78           0 :   }
      79         504 :   if (resolver == nullptr) {
      80           0 :     throwEnvoyExceptionOrPanic(fmt::format("Unknown address resolver: {}", resolver_name));
      81           0 :   }
      82         504 :   return resolver->resolve(socket_address);
      83         504 : }
      84             : 
      85             : } // namespace Address
      86             : } // namespace Network
      87             : } // namespace Envoy

Generated by: LCOV version 1.15