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
18
    Server::Configuration::TransportSocketFactoryContext& context) {
21

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

            
26
18
  absl::optional<Network::TransportSocketOptions::Http11ProxyInfo> proxy_info;
27
18
  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
18
  auto& inner_config_factory =
37
18
      outer_config.has_transport_socket()
38
18
          ? Config::Utility::getAndCheckFactory<
39
17
                Server::Configuration::UpstreamTransportSocketConfigFactory>(
40
17
                outer_config.transport_socket())
41
18
          : Config::Utility::getAndCheckFactoryByName<
42
1
                Server::Configuration::UpstreamTransportSocketConfigFactory>(
43
1
                "envoy.transport_sockets.raw_buffer");
44
18
  ProtobufTypes::MessagePtr inner_factory_config =
45
18
      outer_config.has_transport_socket()
46
18
          ? Config::Utility::translateToFactoryConfig(outer_config.transport_socket(),
47
17
                                                      context.messageValidationVisitor(),
48
17
                                                      inner_config_factory)
49
18
          : inner_config_factory.createEmptyConfigProto();
50

            
51
18
  auto factory_or_error =
52
18
      inner_config_factory.createTransportSocketFactory(*inner_factory_config, context);
53
18
  RETURN_IF_NOT_OK_REF(factory_or_error.status());
54
18
  return std::make_unique<UpstreamHttp11ConnectSocketFactory>(std::move(factory_or_error.value()),
55
18
                                                              proxy_info);
56
18
}
57

            
58
21
ProtobufTypes::MessagePtr UpstreamHttp11ConnectSocketConfigFactory::createEmptyConfigProto() {
59
21
  return std::make_unique<
60
21
      envoy::extensions::transport_sockets::http_11_proxy::v3::Http11ProxyUpstreamTransport>();
61
21
}
62

            
63
REGISTER_FACTORY(UpstreamHttp11ConnectSocketConfigFactory,
64
                 Server::Configuration::UpstreamTransportSocketConfigFactory);
65

            
66
} // namespace Http11Connect
67
} // namespace TransportSockets
68
} // namespace Extensions
69
} // namespace Envoy