@@ -197,16 +197,8 @@ extension HTTPConnectionPool.ConnectionFactory {
197
197
}
198
198
199
199
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)
210
202
}
211
203
212
204
private func makeHTTPProxyChannel(
@@ -224,8 +216,7 @@ extension HTTPConnectionPool.ConnectionFactory {
224
216
let encoder = HTTPRequestEncoder ( )
225
217
let decoder = ByteToMessageHandler ( HTTPResponseDecoder ( leftOverBytesStrategy: . dropBytes) )
226
218
let proxyHandler = HTTP1ProxyConnectHandler (
227
- targetHost: self . key. host,
228
- targetPort: self . key. port,
219
+ target: self . key. connectionTarget,
229
220
proxyAuthorization: proxy. authorization,
230
221
deadline: deadline
231
222
)
@@ -264,7 +255,7 @@ extension HTTPConnectionPool.ConnectionFactory {
264
255
// upgraded to TLS before we send our first request.
265
256
let bootstrap = self . makePlainBootstrap ( deadline: deadline, eventLoop: eventLoop)
266
257
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 ) )
268
259
let socksEventHandler = SOCKSEventsHandler ( deadline: deadline)
269
260
270
261
do {
@@ -310,6 +301,7 @@ extension HTTPConnectionPool.ConnectionFactory {
310
301
}
311
302
let tlsEventHandler = TLSEventsHandler ( deadline: deadline)
312
303
304
+ let sslServerHostname = self . key. connectionTarget. sslServerHostname
313
305
let sslContextFuture = self . sslContextCache. sslContext (
314
306
tlsConfiguration: tlsConfig,
315
307
eventLoop: channel. eventLoop,
@@ -320,7 +312,7 @@ extension HTTPConnectionPool.ConnectionFactory {
320
312
do {
321
313
let sslHandler = try NIOSSLClientHandler (
322
314
context: sslContext,
323
- serverHostname: self . key . host
315
+ serverHostname: sslServerHostname
324
316
)
325
317
try channel. pipeline. syncOperations. addHandler ( sslHandler)
326
318
try channel. pipeline. syncOperations. addHandler ( tlsEventHandler)
@@ -364,21 +356,15 @@ extension HTTPConnectionPool.ConnectionFactory {
364
356
}
365
357
366
358
private func makeTLSChannel( deadline: NIODeadline , eventLoop: EventLoop , logger: Logger ) -> EventLoopFuture < ( Channel , String ? ) > {
359
+ precondition ( self . key. scheme. requiresTLS, " Unexpected scheme " )
367
360
let bootstrapFuture = self . makeTLSBootstrap (
368
361
deadline: deadline,
369
362
eventLoop: eventLoop,
370
363
logger: logger
371
364
)
372
365
373
366
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)
382
368
} . flatMap { channel -> EventLoopFuture < ( Channel , String ? ) > in
383
369
// It is save to use `try!` here, since we are sure, that a `TLSEventsHandler` exists
384
370
// within the pipeline. It is added in `makeTLSBootstrap`.
@@ -441,9 +427,7 @@ extension HTTPConnectionPool.ConnectionFactory {
441
427
}
442
428
#endif
443
429
444
- let host = self . key. host
445
- let hostname = ( host. isIPAddress || host. isEmpty) ? nil : host
446
-
430
+ let sslServerHostname = self . key. connectionTarget. sslServerHostname
447
431
let sslContextFuture = sslContextCache. sslContext (
448
432
tlsConfiguration: tlsConfig,
449
433
eventLoop: eventLoop,
@@ -458,7 +442,7 @@ extension HTTPConnectionPool.ConnectionFactory {
458
442
let sync = channel. pipeline. syncOperations
459
443
let sslHandler = try NIOSSLClientHandler (
460
444
context: sslContext,
461
- serverHostname: hostname
445
+ serverHostname: sslServerHostname
462
446
)
463
447
let tlsEventHandler = TLSEventsHandler ( deadline: deadline)
464
448
@@ -497,14 +481,34 @@ extension ConnectionPool.Key.Scheme {
497
481
}
498
482
}
499
483
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
+ }
504
502
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)
508
512
}
509
513
}
510
514
}
0 commit comments