1
#include "source/extensions/transport_sockets/http_11_proxy/config.h"
2

            
3
#include "envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.pb.h"
4
#include "envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.pb.validate.h"
5
#include "envoy/registry/registry.h"
6

            
7
#include "source/common/config/utility.h"
8
#include "source/common/network/address_impl.h"
9
#include "source/common/network/resolver_impl.h"
10
#include "source/extensions/transport_sockets/http_11_proxy/connect.h"
11

            
12
namespace Envoy {
13
namespace Extensions {
14
namespace TransportSockets {
15
namespace Http11Connect {
16

            
17
absl::StatusOr<Network::UpstreamTransportSocketFactoryPtr>
18
UpstreamHttp11ConnectSocketConfigFactory::createTransportSocketFactory(
19
    const Protobuf::Message& message,
20
17
    Server::Configuration::TransportSocketFactoryContext& context) {
21

            
22
17
  const auto& outer_config = MessageUtil::downcastAndValidate<
23
17
      const envoy::extensions::transport_sockets::http_11_proxy::v3::Http11ProxyUpstreamTransport&>(
24
17
      message, context.messageValidationVisitor());
25

            
26
17
  absl::optional<Network::TransportSocketOptions::Http11ProxyInfo> proxy_info;
27
17
  if (outer_config.has_default_proxy_address()) {
28
1
    auto address_or_error =
29
1
        Network::Address::resolveProtoAddress(outer_config.default_proxy_address());
30
1
    RETURN_IF_NOT_OK_REF(address_or_error.status());
31
    // Hostname is unknown here, so we leave it empty. It will be filled in
32
    // UpstreamHttp11ConnectSocket constructor from the host.
33
1
    proxy_info.emplace("", address_or_error.value());
34
1
  }
35

            
36
17
  auto& inner_config_factory = Config::Utility::getAndCheckFactory<
37
17
      Server::Configuration::UpstreamTransportSocketConfigFactory>(outer_config.transport_socket());
38
17
  ProtobufTypes::MessagePtr inner_factory_config = Config::Utility::translateToFactoryConfig(
39
17
      outer_config.transport_socket(), context.messageValidationVisitor(), inner_config_factory);
40
17
  auto factory_or_error =
41
17
      inner_config_factory.createTransportSocketFactory(*inner_factory_config, context);
42
17
  RETURN_IF_NOT_OK_REF(factory_or_error.status());
43
17
  return std::make_unique<UpstreamHttp11ConnectSocketFactory>(std::move(factory_or_error.value()),
44
17
                                                              proxy_info);
45
17
}
46

            
47
21
ProtobufTypes::MessagePtr UpstreamHttp11ConnectSocketConfigFactory::createEmptyConfigProto() {
48
21
  return std::make_unique<
49
21
      envoy::extensions::transport_sockets::http_11_proxy::v3::Http11ProxyUpstreamTransport>();
50
21
}
51

            
52
REGISTER_FACTORY(UpstreamHttp11ConnectSocketConfigFactory,
53
                 Server::Configuration::UpstreamTransportSocketConfigFactory);
54

            
55
} // namespace Http11Connect
56
} // namespace TransportSockets
57
} // namespace Extensions
58
} // namespace Envoy