From 390f2c41f62bf10f41deff1722374826a1b011d8 Mon Sep 17 00:00:00 2001 From: yhirose Date: Thu, 8 Aug 2024 22:07:46 -0400 Subject: [PATCH] Fix #1878 (#1893) * Fix #1878 --- httplib.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/httplib.h b/httplib.h index 117e498..4af592a 100644 --- a/httplib.h +++ b/httplib.h @@ -3278,7 +3278,8 @@ socket_t create_socket(const std::string &host, const std::string &ip, int port, if (socket_options) { socket_options(sock); } - if (!bind_or_connect(sock, hints)) { + bool dummy; + if (!bind_or_connect(sock, hints, dummy)) { close_socket(sock); sock = INVALID_SOCKET; } @@ -3363,12 +3364,15 @@ socket_t create_socket(const std::string &host, const std::string &ip, int port, } // bind or connect - if (bind_or_connect(sock, *rp)) { + auto quit = false; + if (bind_or_connect(sock, *rp, quit)) { freeaddrinfo(result); return sock; } close_socket(sock); + + if (quit) { break; } } freeaddrinfo(result); @@ -3469,7 +3473,7 @@ inline socket_t create_client_socket( time_t write_timeout_usec, const std::string &intf, Error &error) { auto sock = create_socket( host, ip, port, address_family, 0, tcp_nodelay, std::move(socket_options), - [&](socket_t sock2, struct addrinfo &ai) -> bool { + [&](socket_t sock2, struct addrinfo &ai, bool &quit) -> bool { if (!intf.empty()) { #ifdef USE_IF2IP auto ip_from_if = if2ip(address_family, intf); @@ -3493,7 +3497,10 @@ inline socket_t create_client_socket( } error = wait_until_socket_is_ready(sock2, connection_timeout_sec, connection_timeout_usec); - if (error != Error::Success) { return false; } + if (error != Error::Success) { + if (error == Error::ConnectionTimeout) { quit = true; } + return false; + } } set_nonblocking(sock2, false); @@ -6470,7 +6477,7 @@ Server::create_server_socket(const std::string &host, int port, return detail::create_socket( host, std::string(), port, address_family_, socket_flags, tcp_nodelay_, std::move(socket_options), - [](socket_t sock, struct addrinfo &ai) -> bool { + [](socket_t sock, struct addrinfo &ai, bool & /*quit*/) -> bool { if (::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { return false; }