@@ -26,14 +26,14 @@ internal class HTTPClient {
26
26
27
27
func get( url: String ) -> EventLoopFuture < HTTPResponse > {
28
28
guard let request = HTTPRequest ( url: url, method: . GET) else {
29
- return self . eventLoop. newFailedFuture ( error : HTTPClientError . invalidRequest)
29
+ return self . eventLoop. makeFailedFuture ( HTTPClientError . invalidRequest)
30
30
}
31
31
return self . execute ( request)
32
32
}
33
33
34
34
func post( url: String , body: ByteBuffer ? = nil ) -> EventLoopFuture < HTTPResponse > {
35
35
guard let request = HTTPRequest ( url: url, method: . POST, body: body) else {
36
- return self . eventLoop. newFailedFuture ( error : HTTPClientError . invalidRequest)
36
+ return self . eventLoop. makeFailedFuture ( HTTPClientError . invalidRequest)
37
37
}
38
38
return self . execute ( request)
39
39
}
@@ -42,18 +42,16 @@ internal class HTTPClient {
42
42
let bootstrap = ClientBootstrap ( group: eventLoop)
43
43
. channelOption ( ChannelOptions . socket ( SocketOptionLevel ( IPPROTO_TCP) , TCP_NODELAY) , value: 1 )
44
44
. channelInitializer { channel in
45
- channel. pipeline. addHTTPClientHandlers ( ) . then {
46
- channel. pipeline. add ( handler: HTTPPartsHandler ( ) )
47
- } . then {
48
- channel. pipeline. add ( handler: UnaryHTTPHandler ( ) )
45
+ channel. pipeline. addHTTPClientHandlers ( ) . flatMap {
46
+ channel. pipeline. addHandlers ( [ HTTPPartsHandler ( ) , UnaryHTTPHandler ( ) ] )
49
47
}
50
48
}
51
49
52
- return bootstrap. connect ( host: request. host, port: request. port) . then { channel in
53
- let promise : EventLoopPromise < HTTPResponse > = channel. eventLoop. newPromise ( )
50
+ return bootstrap. connect ( host: request. host, port: request. port) . flatMap { channel in
51
+ let promise = channel. eventLoop. makePromise ( of : HTTPResponse . self )
54
52
let requestWrapper = HTTPRequestWrapper ( request: request, promise: promise)
55
53
56
- return channel. writeAndFlush ( requestWrapper) . then { _ in
54
+ return channel. writeAndFlush ( NIOAny ( requestWrapper) ) . flatMap { _ in
57
55
promise. futureResult
58
56
}
59
57
}
@@ -135,12 +133,12 @@ private struct HTTPResponseAccumulator {
135
133
switch self . state {
136
134
case . idle:
137
135
preconditionFailure ( " no head received before body " )
138
- case let . head( head) :
136
+ case . head( let head) :
139
137
self . state = . body( head, part)
140
138
case . body( let head, var body) :
141
139
var part = part
142
- body. write ( buffer : & part)
143
- state = . body( head, body)
140
+ body. writeBuffer ( & part)
141
+ self . state = . body( head, body)
144
142
case . end:
145
143
preconditionFailure ( " request already processed " )
146
144
}
@@ -155,13 +153,13 @@ private class HTTPPartsHandler: ChannelInboundHandler, ChannelOutboundHandler {
155
153
156
154
var accumulator = HTTPResponseAccumulator ( )
157
155
158
- func write( ctx : ChannelHandlerContext , data: NIOAny , promise: EventLoopPromise < Void > ? ) {
156
+ func write( context : ChannelHandlerContext , data: NIOAny , promise: EventLoopPromise < Void > ? ) {
159
157
let request = unwrapOutboundIn ( data)
160
158
161
159
var head = HTTPRequestHead ( version: request. version, method: request. method, uri: request. target)
162
160
var headers = request. headers
163
161
164
- if request. version. major == 1 && request. version. minor == 1 && !request. headers. contains ( name: " Host " ) {
162
+ if request. version. major == 1 , request. version. minor == 1 , !request. headers. contains ( name: " Host " ) {
165
163
headers. add ( name: " Host " , value: request. host)
166
164
}
167
165
@@ -173,43 +171,43 @@ private class HTTPPartsHandler: ChannelInboundHandler, ChannelOutboundHandler {
173
171
174
172
let part = HTTPClientRequestPart . head ( head)
175
173
176
- let headPromise : EventLoopPromise < Void > = ctx . eventLoop. newPromise ( )
177
- let bodyPromise : EventLoopPromise < Void > = ctx . eventLoop. newPromise ( )
174
+ let headPromise = context . eventLoop. makePromise ( of : Void . self )
175
+ let bodyPromise = context . eventLoop. makePromise ( of : Void . self )
178
176
179
- ctx . write ( wrapOutboundOut ( part) , promise: headPromise)
177
+ context . write ( wrapOutboundOut ( part) , promise: headPromise)
180
178
181
179
if let body = request. body {
182
180
let part = HTTPClientRequestPart . body ( . byteBuffer( body) )
183
181
184
- ctx . write ( wrapOutboundOut ( part) , promise: bodyPromise)
182
+ context . write ( wrapOutboundOut ( part) , promise: bodyPromise)
185
183
} else {
186
- bodyPromise. succeed ( result : ( ) )
184
+ bodyPromise. succeed ( ( ) )
187
185
}
188
186
189
187
if let promise = promise {
190
- headPromise. futureResult. then { bodyPromise. futureResult } . cascade ( promise : promise)
188
+ headPromise. futureResult. flatMap { bodyPromise. futureResult } . cascade ( to : promise)
191
189
}
192
190
193
- ctx . flush ( )
191
+ context . flush ( )
194
192
}
195
193
196
- func channelRead( ctx : ChannelHandlerContext , data: NIOAny ) {
194
+ func channelRead( context : ChannelHandlerContext , data: NIOAny ) {
197
195
let response = unwrapInboundIn ( data)
198
196
199
197
switch response {
200
- case let . head( head) :
198
+ case . head( let head) :
201
199
self . accumulator. handle ( head)
202
- case let . body( body) :
200
+ case . body( let body) :
203
201
self . accumulator. handle ( body)
204
202
case . end:
205
203
switch self . accumulator. state {
206
204
case . idle:
207
205
preconditionFailure ( " no head received before end " )
208
- case let . head( head) :
209
- ctx . fireChannelRead ( wrapInboundOut ( HTTPResponse ( status: head. status, headers: head. headers, body: nil ) ) )
206
+ case . head( let head) :
207
+ context . fireChannelRead ( wrapInboundOut ( HTTPResponse ( status: head. status, headers: head. headers, body: nil ) ) )
210
208
self . accumulator. state = . end
211
- case let . body( head, body) :
212
- ctx . fireChannelRead ( wrapInboundOut ( HTTPResponse ( status: head. status, headers: head. headers, body: body) ) )
209
+ case . body( let head, let body) :
210
+ context . fireChannelRead ( wrapInboundOut ( HTTPResponse ( status: head. status, headers: head. headers, body: body) ) )
213
211
self . accumulator. state = . end
214
212
case . end:
215
213
preconditionFailure ( " request already processed " )
@@ -225,36 +223,38 @@ private class UnaryHTTPHandler: ChannelInboundHandler, ChannelOutboundHandler {
225
223
226
224
var buffer = CircularBuffer < EventLoopPromise < HTTPResponse > > ( )
227
225
228
- func write( ctx : ChannelHandlerContext , data: NIOAny , promise: EventLoopPromise < Void > ? ) {
226
+ func write( context : ChannelHandlerContext , data: NIOAny , promise: EventLoopPromise < Void > ? ) {
229
227
let wrapper = unwrapOutboundIn ( data)
230
228
buffer. append ( wrapper. promise)
231
229
var request = wrapper. request
232
230
request. headers. add ( name: " Connection " , value: " close " )
233
- ctx . writeAndFlush ( wrapOutboundOut ( request) , promise: promise)
231
+ context . writeAndFlush ( wrapOutboundOut ( request) , promise: promise)
234
232
}
235
233
236
- func channelRead( ctx : ChannelHandlerContext , data: NIOAny ) {
234
+ func channelRead( context : ChannelHandlerContext , data: NIOAny ) {
237
235
let response = unwrapInboundIn ( data)
238
- let promise = buffer. removeFirst ( )
239
- promise. succeed ( result: response)
240
- ctx. close ( promise: nil )
236
+ let promise = self . buffer. removeFirst ( )
237
+ context. close ( ) . whenComplete { _ in
238
+ promise. succeed ( response)
239
+ }
241
240
}
242
241
243
- func errorCaught( ctx: ChannelHandlerContext , error: Error ) {
244
- // In HTTP we should fail all promises as we close the Channel.
245
- self . failAllPromises ( error: error)
246
- ctx. close ( promise: nil )
242
+ func errorCaught( context: ChannelHandlerContext , error: Error ) {
243
+ context. close ( ) . whenComplete { _ in
244
+ // In HTTP we should fail all promises as we close the Channel.
245
+ self . failAllPromises ( error: error)
246
+ }
247
247
}
248
248
249
- func channelInactive( ctx : ChannelHandlerContext ) {
249
+ func channelInactive( context : ChannelHandlerContext ) {
250
250
// Fail all promises
251
251
self . failAllPromises ( error: HTTPClientError . connectionClosed)
252
- ctx . fireChannelInactive ( )
252
+ context . fireChannelInactive ( )
253
253
}
254
254
255
255
private func failAllPromises( error: Error ) {
256
256
while let promise = buffer. first {
257
- promise. fail ( error: error )
257
+ promise. fail ( error)
258
258
self . buffer. removeFirst ( )
259
259
}
260
260
}
0 commit comments