1
#pragma once
2

            
3
#include <cstdint>
4
#include <string>
5

            
6
#include "envoy/network/connection.h"
7
#include "envoy/network/transport_socket.h"
8
#include "envoy/secret/secret_callbacks.h"
9
#include "envoy/ssl/handshaker.h"
10
#include "envoy/ssl/private_key/private_key_callbacks.h"
11
#include "envoy/ssl/ssl_socket_extended_info.h"
12
#include "envoy/ssl/ssl_socket_state.h"
13
#include "envoy/stats/scope.h"
14
#include "envoy/stats/stats_macros.h"
15

            
16
#include "source/common/common/logger.h"
17
#include "source/common/network/transport_socket_options_impl.h"
18
#include "source/common/tls/context_impl.h"
19
#include "source/common/tls/ssl_handshaker.h"
20
#include "source/common/tls/ssl_socket.h"
21
#include "source/common/tls/utility.h"
22

            
23
#include "absl/container/node_hash_map.h"
24
#include "absl/synchronization/mutex.h"
25
#include "absl/types/optional.h"
26
#include "openssl/ssl.h"
27

            
28
namespace Envoy {
29
namespace Extensions {
30
namespace TransportSockets {
31
namespace Tls {
32

            
33
class ClientSslSocketFactory : public Network::CommonUpstreamTransportSocketFactory,
34
                               public Secret::SecretCallbacks,
35
                               Logger::Loggable<Logger::Id::config> {
36
public:
37
  static absl::StatusOr<std::unique_ptr<ClientSslSocketFactory>>
38
  create(Envoy::Ssl::ClientContextConfigPtr config, Envoy::Ssl::ContextManager& manager,
39
         Stats::Scope& stats_scope);
40

            
41
  ~ClientSslSocketFactory() override;
42

            
43
  Network::TransportSocketPtr
44
  createTransportSocket(Network::TransportSocketOptionsConstSharedPtr options,
45
                        Upstream::HostDescriptionConstSharedPtr) const override;
46
  bool implementsSecureTransport() const override;
47
567
  absl::string_view defaultServerNameIndication() const override {
48
567
    return clientContextConfig()->serverNameIndication();
49
567
  }
50
765
  bool supportsAlpn() const override { return true; }
51

            
52
  // Secret::SecretCallbacks
53
  absl::Status onAddOrUpdateSecret() override;
54

            
55
12297
  OptRef<const Ssl::ClientContextConfig> clientContextConfig() const override { return {*config_}; }
56

            
57
  Envoy::Ssl::ClientContextSharedPtr sslCtx() override;
58

            
59
protected:
60
  ClientSslSocketFactory(Envoy::Ssl::ClientContextConfigPtr config,
61
                         Envoy::Ssl::ContextManager& manager, Stats::Scope& stats_scope,
62
                         absl::Status& creation_status);
63

            
64
private:
65
  Envoy::Ssl::ContextManager& manager_;
66
  Stats::Scope& stats_scope_;
67
  SslSocketFactoryStats stats_;
68
  Envoy::Ssl::ClientContextConfigPtr config_;
69
  mutable absl::Mutex ssl_ctx_mu_;
70
  Envoy::Ssl::ClientContextSharedPtr ssl_ctx_ ABSL_GUARDED_BY(ssl_ctx_mu_);
71
};
72

            
73
} // namespace Tls
74
} // namespace TransportSockets
75
} // namespace Extensions
76
} // namespace Envoy