diff --git a/Sources/AsyncHTTPClient/HTTPClient.swift b/Sources/AsyncHTTPClient/HTTPClient.swift index 1abfa9728..331b5bc98 100644 --- a/Sources/AsyncHTTPClient/HTTPClient.swift +++ b/Sources/AsyncHTTPClient/HTTPClient.swift @@ -290,7 +290,6 @@ public class HTTPClient { channel.writeAndFlush(request) } .cascadeFailure(to: task.promise) - return task } @@ -501,7 +500,7 @@ private extension ChannelPipeline { do { let tlsConfiguration = tlsConfiguration ?? TLSConfiguration.forClient() let context = try NIOSSLContext(configuration: tlsConfiguration) - return self.addHandler(try NIOSSLClientHandler(context: context, serverHostname: request.host), + return self.addHandler(try NIOSSLClientHandler(context: context, serverHostname: request.host.isIPAddress ? nil : request.host), position: .first) } catch { return self.eventLoop.makeFailedFuture(error) diff --git a/Sources/AsyncHTTPClient/Utils.swift b/Sources/AsyncHTTPClient/Utils.swift index 7fbea9c38..398720b43 100644 --- a/Sources/AsyncHTTPClient/Utils.swift +++ b/Sources/AsyncHTTPClient/Utils.swift @@ -15,6 +15,32 @@ import NIO import NIOHTTP1 +#if canImport(Network) + import Network + + internal extension String { + var isIPAddress: Bool { + if IPv4Address(self) != nil || IPv6Address(self) != nil { + return true + } + return false + } + } + +#else + internal extension String { + var isIPAddress: Bool { + var ipv4Addr = in_addr() + var ipv6Addr = in6_addr() + + return self.withCString { ptr in + inet_pton(AF_INET, ptr, &ipv4Addr) == 1 || + inet_pton(AF_INET6, ptr, &ipv6Addr) == 1 + } + } + } +#endif + public final class HTTPClientCopyingDelegate: HTTPClientResponseDelegate { public typealias Response = Void diff --git a/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift b/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift index bfd3fc69d..378d206e0 100644 --- a/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift +++ b/Tests/AsyncHTTPClientTests/HTTPClientTests+XCTest.swift @@ -32,6 +32,7 @@ extension HTTPClientTests { ("testGetWithDifferentEventLoopBackpressure", testGetWithDifferentEventLoopBackpressure), ("testPost", testPost), ("testGetHttps", testGetHttps), + ("testGetHttpsWithIP", testGetHttpsWithIP), ("testPostHttps", testPostHttps), ("testHttpRedirect", testHttpRedirect), ("testHttpHostRedirect", testHttpHostRedirect), diff --git a/Tests/AsyncHTTPClientTests/HTTPClientTests.swift b/Tests/AsyncHTTPClientTests/HTTPClientTests.swift index 241112f16..33c529330 100644 --- a/Tests/AsyncHTTPClientTests/HTTPClientTests.swift +++ b/Tests/AsyncHTTPClientTests/HTTPClientTests.swift @@ -122,6 +122,19 @@ class HTTPClientTests: XCTestCase { XCTAssertEqual(.ok, response.status) } + func testGetHttpsWithIP() throws { + let httpBin = HTTPBin(ssl: true) + let httpClient = HTTPClient(eventLoopGroupProvider: .createNew, + configuration: HTTPClient.Configuration(certificateVerification: .none)) + defer { + XCTAssertNoThrow(try httpClient.syncShutdown()) + XCTAssertNoThrow(try httpBin.shutdown()) + } + + let response = try httpClient.get(url: "https://127.0.0.1:\(httpBin.port)/get").wait() + XCTAssertEqual(.ok, response.status) + } + func testPostHttps() throws { let httpBin = HTTPBin(ssl: true) let httpClient = HTTPClient(eventLoopGroupProvider: .createNew,