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