@@ -197,16 +197,8 @@ extension HTTPConnectionPool.ConnectionFactory {
197197 }
198198
199199 private func makePlainChannel( deadline: NIODeadline , eventLoop: EventLoop ) -> EventLoopFuture < Channel > {
200- let bootstrap = self . makePlainBootstrap ( deadline: deadline, eventLoop: eventLoop)
201-
202- switch self . key. scheme {
203- case . http:
204- return bootstrap. connect ( host: self . key. host, port: self . key. port)
205- case . http_unix, . unix:
206- return bootstrap. connect ( unixDomainSocketPath: self . key. unixPath)
207- case . https, . https_unix:
208- preconditionFailure ( " Unexpected scheme " )
209- }
200+ precondition ( !self . key. scheme. requiresTLS, " Unexpected scheme " )
201+ return self . makePlainBootstrap ( deadline: deadline, eventLoop: eventLoop) . connect ( target: self . key. connectionTarget)
210202 }
211203
212204 private func makeHTTPProxyChannel(
@@ -224,8 +216,7 @@ extension HTTPConnectionPool.ConnectionFactory {
224216 let encoder = HTTPRequestEncoder ( )
225217 let decoder = ByteToMessageHandler ( HTTPResponseDecoder ( leftOverBytesStrategy: . dropBytes) )
226218 let proxyHandler = HTTP1ProxyConnectHandler (
227- targetHost: self . key. host,
228- targetPort: self . key. port,
219+ target: self . key. connectionTarget,
229220 proxyAuthorization: proxy. authorization,
230221 deadline: deadline
231222 )
@@ -264,7 +255,7 @@ extension HTTPConnectionPool.ConnectionFactory {
264255 // upgraded to TLS before we send our first request.
265256 let bootstrap = self . makePlainBootstrap ( deadline: deadline, eventLoop: eventLoop)
266257 return bootstrap. connect ( host: proxy. host, port: proxy. port) . flatMap { channel in
267- let socksConnectHandler = SOCKSClientHandler ( targetAddress: . domain ( self . key. host , port : self . key . port ) )
258+ let socksConnectHandler = SOCKSClientHandler ( targetAddress: SOCKSAddress ( self . key. connectionTarget ) )
268259 let socksEventHandler = SOCKSEventsHandler ( deadline: deadline)
269260
270261 do {
@@ -310,6 +301,7 @@ extension HTTPConnectionPool.ConnectionFactory {
310301 }
311302 let tlsEventHandler = TLSEventsHandler ( deadline: deadline)
312303
304+ let sslServerHostname = self . key. connectionTarget. sslServerHostname
313305 let sslContextFuture = self . sslContextCache. sslContext (
314306 tlsConfiguration: tlsConfig,
315307 eventLoop: channel. eventLoop,
@@ -320,7 +312,7 @@ extension HTTPConnectionPool.ConnectionFactory {
320312 do {
321313 let sslHandler = try NIOSSLClientHandler (
322314 context: sslContext,
323- serverHostname: self . key . host
315+ serverHostname: sslServerHostname
324316 )
325317 try channel. pipeline. syncOperations. addHandler ( sslHandler)
326318 try channel. pipeline. syncOperations. addHandler ( tlsEventHandler)
@@ -364,21 +356,15 @@ extension HTTPConnectionPool.ConnectionFactory {
364356 }
365357
366358 private func makeTLSChannel( deadline: NIODeadline , eventLoop: EventLoop , logger: Logger ) -> EventLoopFuture < ( Channel , String ? ) > {
359+ precondition ( self . key. scheme. requiresTLS, " Unexpected scheme " )
367360 let bootstrapFuture = self . makeTLSBootstrap (
368361 deadline: deadline,
369362 eventLoop: eventLoop,
370363 logger: logger
371364 )
372365
373366 var channelFuture = bootstrapFuture. flatMap { bootstrap -> EventLoopFuture < Channel > in
374- switch self . key. scheme {
375- case . https:
376- return bootstrap. connect ( host: self . key. host, port: self . key. port)
377- case . https_unix:
378- return bootstrap. connect ( unixDomainSocketPath: self . key. unixPath)
379- case . http, . http_unix, . unix:
380- preconditionFailure ( " Unexpected scheme " )
381- }
367+ return bootstrap. connect ( target: self . key. connectionTarget)
382368 } . flatMap { channel -> EventLoopFuture < ( Channel , String ? ) > in
383369 // It is save to use `try!` here, since we are sure, that a `TLSEventsHandler` exists
384370 // within the pipeline. It is added in `makeTLSBootstrap`.
@@ -441,9 +427,7 @@ extension HTTPConnectionPool.ConnectionFactory {
441427 }
442428 #endif
443429
444- let host = self . key. host
445- let hostname = ( host. isIPAddress || host. isEmpty) ? nil : host
446-
430+ let sslServerHostname = self . key. connectionTarget. sslServerHostname
447431 let sslContextFuture = sslContextCache. sslContext (
448432 tlsConfiguration: tlsConfig,
449433 eventLoop: eventLoop,
@@ -458,7 +442,7 @@ extension HTTPConnectionPool.ConnectionFactory {
458442 let sync = channel. pipeline. syncOperations
459443 let sslHandler = try NIOSSLClientHandler (
460444 context: sslContext,
461- serverHostname: hostname
445+ serverHostname: sslServerHostname
462446 )
463447 let tlsEventHandler = TLSEventsHandler ( deadline: deadline)
464448
@@ -497,14 +481,34 @@ extension ConnectionPool.Key.Scheme {
497481 }
498482}
499483
500- extension String {
501- fileprivate var isIPAddress : Bool {
502- var ipv4Addr = in_addr ( )
503- var ipv6Addr = in6_addr ( )
484+ extension ConnectionTarget {
485+ fileprivate var sslServerHostname : String ? {
486+ switch self {
487+ case . domain( let domain, _) : return domain
488+ case . ipAddress, . unixSocket: return nil
489+ }
490+ }
491+ }
492+
493+ extension SOCKSAddress {
494+ fileprivate init ( _ host: ConnectionTarget ) {
495+ switch host {
496+ case . ipAddress( _, let address) : self = . address( address)
497+ case . domain( let domain, let port) : self = . domain( domain, port: port)
498+ case . unixSocket: fatalError ( " Unix Domain Sockets are not supported by SOCKSAddress " )
499+ }
500+ }
501+ }
504502
505- return self . withCString { ptr in
506- inet_pton ( AF_INET, ptr, & ipv4Addr) == 1 ||
507- inet_pton ( AF_INET6, ptr, & ipv6Addr) == 1
503+ extension NIOClientTCPBootstrapProtocol {
504+ func connect( target: ConnectionTarget ) -> EventLoopFuture < Channel > {
505+ switch target {
506+ case . ipAddress( _, let socketAddress) :
507+ return self . connect ( to: socketAddress)
508+ case . domain( let domain, let port) :
509+ return self . connect ( host: domain, port: port)
510+ case . unixSocket( let path) :
511+ return self . connect ( unixDomainSocketPath: path)
508512 }
509513 }
510514}
0 commit comments