@@ -80,12 +80,13 @@ final class ConnectionPool {
80
80
if let existing = self . providers [ key] , existing. enqueue ( ) {
81
81
return existing
82
82
} else {
83
- // Connection provider will be created with `pending = 1`
84
83
let provider = HTTP1ConnectionProvider ( key: key,
85
84
eventLoop: taskEventLoop,
86
85
configuration: self . configuration,
87
86
pool: self ,
88
87
backgroundActivityLogger: self . backgroundActivityLogger)
88
+ let enqueued = provider. enqueue ( )
89
+ assert ( enqueued)
89
90
self . providers [ key] = provider
90
91
return provider
91
92
}
@@ -263,8 +264,6 @@ struct ConnectionKey: Hashable {
263
264
/// of concurrent requests as it has built-in politeness regarding the maximum number
264
265
/// of concurrent requests to the server.
265
266
class HTTP1ConnectionProvider {
266
- struct ProviderClosedError : Error { }
267
-
268
267
/// The client configuration used to bootstrap new requests
269
268
private let configuration : HTTPClient . Configuration
270
269
@@ -318,7 +317,7 @@ class HTTP1ConnectionProvider {
318
317
self . state. assertInvariants ( )
319
318
}
320
319
321
- private func execute( _ action: Action , logger: Logger ) {
320
+ func execute( _ action: Action , logger: Logger ) {
322
321
switch action {
323
322
case . lease( let connection, let waiter) :
324
323
// if connection is became inactive, we create a new one.
@@ -494,6 +493,11 @@ class HTTP1ConnectionProvider {
494
493
$0. promise. fail ( HTTPClientError . cancelled)
495
494
}
496
495
496
+ if available. isEmpty, leased. isEmpty {
497
+ self . closePromise. succeed ( ( ) )
498
+ return self . closePromise. futureResult. map { clean }
499
+ }
500
+
497
501
EventLoopFuture . andAllComplete ( leased. map { $0. cancel ( ) } , on: self . eventLoop) . flatMap { _ in
498
502
EventLoopFuture . andAllComplete ( available. map { $0. close ( ) } , on: self . eventLoop)
499
503
} . whenFailure { error in
0 commit comments