1
#pragma once
2

            
3
#include "envoy/network/resolver.h"
4
#include "envoy/registry/registry.h"
5

            
6
#include "source/common/common/logger.h"
7
#include "source/extensions/bootstrap/reverse_tunnel/downstream_socket_interface/reverse_connection_address.h"
8

            
9
namespace Envoy {
10
namespace Extensions {
11
namespace Bootstrap {
12
namespace ReverseConnection {
13

            
14
/**
15
 * Custom address resolver that can create ReverseConnectionAddress instances
16
 * when reverse connection metadata is detected in the socket address.
17
 */
18
class ReverseConnectionResolver : public Network::Address::Resolver,
19
                                  public Envoy::Logger::Loggable<Envoy::Logger::Id::connection> {
20
public:
21
18
  ReverseConnectionResolver() = default;
22

            
23
  // Network::Address::Resolver
24
  absl::StatusOr<Network::Address::InstanceConstSharedPtr>
25
  resolve(const envoy::config::core::v3::SocketAddress& socket_address) override;
26

            
27
7
  std::string name() const override { return "envoy.resolvers.reverse_connection"; }
28

            
29
  // Friend class for testing
30
  friend class ReverseConnectionResolverTest;
31

            
32
private:
33
  /**
34
   * Extracts reverse connection config from socket address metadata.
35
   * Expected format: "rc://src_node_id:src_cluster_id:src_tenant_id@cluster1:count1"
36
   */
37
  absl::StatusOr<ReverseConnectionAddress::ReverseConnectionConfig>
38
  extractReverseConnectionConfig(const envoy::config::core::v3::SocketAddress& socket_address);
39
};
40

            
41
DECLARE_FACTORY(ReverseConnectionResolver);
42

            
43
} // namespace ReverseConnection
44
} // namespace Bootstrap
45
} // namespace Extensions
46
} // namespace Envoy