@@ -58,64 +58,63 @@ public class HTTPClient {
58
58
}
59
59
}
60
60
61
- public func get( url: String , timeout : Timeout ? = nil ) -> EventLoopFuture < Response > {
61
+ public func get( url: String , deadline : NIODeadline ? = nil ) -> EventLoopFuture < Response > {
62
62
do {
63
63
let request = try Request ( url: url, method: . GET)
64
- return self . execute ( request: request, timeout : timeout )
64
+ return self . execute ( request: request, deadline : deadline )
65
65
} catch {
66
66
return self . eventLoopGroup. next ( ) . makeFailedFuture ( error)
67
67
}
68
68
}
69
69
70
- public func post( url: String , body: Body ? = nil , timeout : Timeout ? = nil ) -> EventLoopFuture < Response > {
70
+ public func post( url: String , body: Body ? = nil , deadline : NIODeadline ? = nil ) -> EventLoopFuture < Response > {
71
71
do {
72
72
let request = try HTTPClient . Request ( url: url, method: . POST, body: body)
73
- return self . execute ( request: request, timeout : timeout )
73
+ return self . execute ( request: request, deadline : deadline )
74
74
} catch {
75
75
return self . eventLoopGroup. next ( ) . makeFailedFuture ( error)
76
76
}
77
77
}
78
78
79
- public func patch( url: String , body: Body ? = nil , timeout : Timeout ? = nil ) -> EventLoopFuture < Response > {
79
+ public func patch( url: String , body: Body ? = nil , deadline : NIODeadline ? = nil ) -> EventLoopFuture < Response > {
80
80
do {
81
81
let request = try HTTPClient . Request ( url: url, method: . PATCH, body: body)
82
- return self . execute ( request: request, timeout : timeout )
82
+ return self . execute ( request: request, deadline : deadline )
83
83
} catch {
84
84
return self . eventLoopGroup. next ( ) . makeFailedFuture ( error)
85
85
}
86
86
}
87
87
88
- public func put( url: String , body: Body ? = nil , timeout : Timeout ? = nil ) -> EventLoopFuture < Response > {
88
+ public func put( url: String , body: Body ? = nil , deadline : NIODeadline ? = nil ) -> EventLoopFuture < Response > {
89
89
do {
90
90
let request = try HTTPClient . Request ( url: url, method: . PUT, body: body)
91
- return self . execute ( request: request, timeout : timeout )
91
+ return self . execute ( request: request, deadline : deadline )
92
92
} catch {
93
93
return self . eventLoopGroup. next ( ) . makeFailedFuture ( error)
94
94
}
95
95
}
96
96
97
- public func delete( url: String , timeout : Timeout ? = nil ) -> EventLoopFuture < Response > {
97
+ public func delete( url: String , deadline : NIODeadline ? = nil ) -> EventLoopFuture < Response > {
98
98
do {
99
99
let request = try Request ( url: url, method: . DELETE)
100
- return self . execute ( request: request, timeout : timeout )
100
+ return self . execute ( request: request, deadline : deadline )
101
101
} catch {
102
102
return self . eventLoopGroup. next ( ) . makeFailedFuture ( error)
103
103
}
104
104
}
105
105
106
- public func execute( request: Request , timeout : Timeout ? = nil ) -> EventLoopFuture < Response > {
106
+ public func execute( request: Request , deadline : NIODeadline ? = nil ) -> EventLoopFuture < Response > {
107
107
let accumulator = ResponseAccumulator ( request: request)
108
- return self . execute ( request: request, delegate: accumulator, timeout : timeout ) . futureResult
108
+ return self . execute ( request: request, delegate: accumulator, deadline : deadline ) . futureResult
109
109
}
110
110
111
- public func execute< T: HTTPClientResponseDelegate > ( request: Request , delegate: T , timeout: Timeout ? = nil ) -> Task < T . Response > {
112
- let timeout = timeout ?? configuration. timeout
111
+ public func execute< T: HTTPClientResponseDelegate > ( request: Request , delegate: T , deadline: NIODeadline ? = nil ) -> Task < T . Response > {
113
112
let eventLoop = self . eventLoopGroup. next ( )
114
113
115
114
let redirectHandler : RedirectHandler < T . Response > ?
116
115
if self . configuration. followRedirects {
117
116
redirectHandler = RedirectHandler < T . Response > ( request: request) { newRequest in
118
- self . execute ( request: newRequest, delegate: delegate, timeout : timeout )
117
+ self . execute ( request: newRequest, delegate: delegate, deadline : deadline )
119
118
}
120
119
} else {
121
120
redirectHandler = nil
@@ -136,8 +135,8 @@ public class HTTPClient {
136
135
return channel. pipeline. addProxyHandler ( for: request, decoder: decoder, encoder: encoder, tlsConfiguration: self . configuration. tlsConfiguration)
137
136
}
138
137
} . flatMap {
139
- if let readTimeout = timeout. read {
140
- return channel. pipeline. addHandler ( IdleStateHandler ( readTimeout: readTimeout ) )
138
+ if let timeout = self . resolve ( timeout: self . configuration . timeout . read, deadline : deadline ) {
139
+ return channel. pipeline. addHandler ( IdleStateHandler ( readTimeout: timeout ) )
141
140
} else {
142
141
return channel. eventLoop. makeSucceededFuture ( ( ) )
143
142
}
@@ -147,8 +146,8 @@ public class HTTPClient {
147
146
}
148
147
}
149
148
150
- if let connectTimeout = timeout. connect {
151
- bootstrap = bootstrap. connectTimeout ( connectTimeout )
149
+ if let timeout = self . resolve ( timeout: self . configuration . timeout . connect, deadline : deadline ) {
150
+ bootstrap = bootstrap. connectTimeout ( timeout )
152
151
}
153
152
154
153
let address = self . resolveAddress ( request: request, proxy: self . configuration. proxy)
@@ -166,6 +165,19 @@ public class HTTPClient {
166
165
return task
167
166
}
168
167
168
+ private func resolve( timeout: TimeAmount ? , deadline: NIODeadline ? ) -> TimeAmount ? {
169
+ switch ( timeout, deadline) {
170
+ case ( . some( let timeout) , . some( let deadline) ) :
171
+ return min ( timeout, deadline - . now( ) )
172
+ case ( . some( let timeout) , . none) :
173
+ return timeout
174
+ case ( . none, . some( let deadline) ) :
175
+ return deadline - . now( )
176
+ case ( . none, . none) :
177
+ return nil
178
+ }
179
+ }
180
+
169
181
private func resolveAddress( request: Request , proxy: Proxy ? ) -> ( host: String , port: Int ) {
170
182
switch self . configuration. proxy {
171
183
case . none:
0 commit comments