|
@@ -10429,6 +10429,13 @@ inline void ClientImpl::set_error_logger(ErrorLogger error_logger) {
|
|
|
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
|
|
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
|
|
|
namespace detail {
|
|
namespace detail {
|
|
|
|
|
|
|
|
|
|
+inline bool is_ip_address(const std::string &host) {
|
|
|
|
|
+ struct in_addr addr4;
|
|
|
|
|
+ struct in6_addr addr6;
|
|
|
|
|
+ return inet_pton(AF_INET, host.c_str(), &addr4) == 1 ||
|
|
|
|
|
+ inet_pton(AF_INET6, host.c_str(), &addr6) == 1;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
template <typename U, typename V>
|
|
template <typename U, typename V>
|
|
|
inline SSL *ssl_new(socket_t sock, SSL_CTX *ctx, std::mutex &ctx_mutex,
|
|
inline SSL *ssl_new(socket_t sock, SSL_CTX *ctx, std::mutex &ctx_mutex,
|
|
|
U SSL_connect_or_accept, V setup) {
|
|
U SSL_connect_or_accept, V setup) {
|
|
@@ -11087,14 +11094,18 @@ inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) {
|
|
|
return true;
|
|
return true;
|
|
|
},
|
|
},
|
|
|
[&](SSL *ssl2) {
|
|
[&](SSL *ssl2) {
|
|
|
|
|
+ // Set SNI only if host is not IP address
|
|
|
|
|
+ if (!detail::is_ip_address(host_)) {
|
|
|
#if defined(OPENSSL_IS_BORINGSSL)
|
|
#if defined(OPENSSL_IS_BORINGSSL)
|
|
|
- SSL_set_tlsext_host_name(ssl2, host_.c_str());
|
|
|
|
|
|
|
+ SSL_set_tlsext_host_name(ssl2, host_.c_str());
|
|
|
#else
|
|
#else
|
|
|
- // NOTE: Direct call instead of using the OpenSSL macro to suppress
|
|
|
|
|
- // -Wold-style-cast warning
|
|
|
|
|
- SSL_ctrl(ssl2, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name,
|
|
|
|
|
- static_cast<void *>(const_cast<char *>(host_.c_str())));
|
|
|
|
|
|
|
+ // NOTE: Direct call instead of using the OpenSSL macro to suppress
|
|
|
|
|
+ // -Wold-style-cast warning
|
|
|
|
|
+ SSL_ctrl(ssl2, SSL_CTRL_SET_TLSEXT_HOSTNAME,
|
|
|
|
|
+ TLSEXT_NAMETYPE_host_name,
|
|
|
|
|
+ static_cast<void *>(const_cast<char *>(host_.c_str())));
|
|
|
#endif
|
|
#endif
|
|
|
|
|
+ }
|
|
|
return true;
|
|
return true;
|
|
|
});
|
|
});
|
|
|
|
|
|