Skip to content

Commit a6c9f86

Browse files
ianpartridgeweissi
authored andcommitted
Pass HTTPTask to HTTPResponseDelegate methods (AsyncHttpClient#13)
1 parent db60d3d commit a6c9f86

File tree

5 files changed

+45
-39
lines changed

5 files changed

+45
-39
lines changed

Sources/NIOHTTPClient/HTTPHandler.swift

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -122,25 +122,25 @@ public struct HTTPResponse: Equatable {
122122
public protocol HTTPResponseDelegate: class {
123123
associatedtype Response
124124

125-
func didTransmitRequestBody()
125+
func didTransmitRequestBody(task: HTTPTask<Response>)
126126

127-
func didReceiveHead(_ head: HTTPResponseHead)
127+
func didReceiveHead(task: HTTPTask<Response>, _ head: HTTPResponseHead)
128128

129-
func didReceivePart(_ buffer: ByteBuffer)
129+
func didReceivePart(task: HTTPTask<Response>, _ buffer: ByteBuffer)
130130

131-
func didReceiveError(_ error: Error)
131+
func didReceiveError(task: HTTPTask<Response>, _ error: Error)
132132

133-
func didFinishRequest() throws -> Response
133+
func didFinishRequest(task: HTTPTask<Response>) throws -> Response
134134
}
135135

136136
extension HTTPResponseDelegate {
137-
func didTransmitRequestBody() {}
137+
func didTransmitRequestBody(task: HTTPTask<Response>) {}
138138

139-
func didReceiveHead(_: HTTPResponseHead) {}
139+
func didReceiveHead(task: HTTPTask<Response>, _: HTTPResponseHead) {}
140140

141-
func didReceivePart(_: ByteBuffer) {}
141+
func didReceivePart(task: HTTPTask<Response>, _: ByteBuffer) {}
142142

143-
func didReceiveError(_: Error) {}
143+
func didReceiveError(task: HTTPTask<Response>, _: Error) {}
144144
}
145145

146146
class HTTPResponseAccumulator: HTTPResponseDelegate {
@@ -161,9 +161,9 @@ class HTTPResponseAccumulator: HTTPResponseDelegate {
161161
self.request = request
162162
}
163163

164-
func didTransmitRequestBody() {}
164+
func didTransmitRequestBody(task: HTTPTask<Response>) {}
165165

166-
func didReceiveHead(_ head: HTTPResponseHead) {
166+
func didReceiveHead(task: HTTPTask<Response>, _ head: HTTPResponseHead) {
167167
switch self.state {
168168
case .idle:
169169
self.state = .head(head)
@@ -178,7 +178,7 @@ class HTTPResponseAccumulator: HTTPResponseDelegate {
178178
}
179179
}
180180

181-
func didReceivePart(_ part: ByteBuffer) {
181+
func didReceivePart(task: HTTPTask<Response>, _ part: ByteBuffer) {
182182
switch self.state {
183183
case .idle:
184184
preconditionFailure("no head received before body")
@@ -195,11 +195,11 @@ class HTTPResponseAccumulator: HTTPResponseDelegate {
195195
}
196196
}
197197

198-
func didReceiveError(_ error: Error) {
198+
func didReceiveError(task: HTTPTask<Response>, _ error: Error) {
199199
self.state = .error(error)
200200
}
201201

202-
func didFinishRequest() throws -> HTTPResponse {
202+
func didFinishRequest(task: HTTPTask<Response>) throws -> HTTPResponse {
203203
switch self.state {
204204
case .idle:
205205
preconditionFailure("no head received before end")
@@ -279,13 +279,15 @@ class HTTPTaskHandler<T: HTTPResponseDelegate>: ChannelInboundHandler, ChannelOu
279279
case end
280280
}
281281

282+
let task: HTTPTask<T.Response>
282283
let delegate: T
283284
let promise: EventLoopPromise<T.Response>
284285
let redirectHandler: RedirectHandler<T.Response>?
285286

286287
var state: State = .idle
287288

288-
init(delegate: T, promise: EventLoopPromise<T.Response>, redirectHandler: RedirectHandler<T.Response>?) {
289+
init(task: HTTPTask<T.Response>, delegate: T, promise: EventLoopPromise<T.Response>, redirectHandler: RedirectHandler<T.Response>?) {
290+
self.task = task
289291
self.delegate = delegate
290292
self.promise = promise
291293
self.redirectHandler = redirectHandler
@@ -336,7 +338,7 @@ class HTTPTaskHandler<T: HTTPResponseDelegate>: ChannelInboundHandler, ChannelOu
336338
context.flush()
337339

338340
self.state = .sent
339-
self.delegate.didTransmitRequestBody()
341+
self.delegate.didTransmitRequestBody(task: self.task)
340342
}
341343

342344
func channelRead(context: ChannelHandlerContext, data: NIOAny) {
@@ -347,15 +349,15 @@ class HTTPTaskHandler<T: HTTPResponseDelegate>: ChannelInboundHandler, ChannelOu
347349
self.state = .redirected(head, redirectURL)
348350
} else {
349351
self.state = .head
350-
self.delegate.didReceiveHead(head)
352+
self.delegate.didReceiveHead(task: self.task, head)
351353
}
352354
case .body(let body):
353355
switch self.state {
354356
case .redirected:
355357
break
356358
default:
357359
self.state = .body
358-
self.delegate.didReceivePart(body)
360+
self.delegate.didReceivePart(task: self.task, body)
359361
}
360362
case .end:
361363
switch self.state {
@@ -365,7 +367,7 @@ class HTTPTaskHandler<T: HTTPResponseDelegate>: ChannelInboundHandler, ChannelOu
365367
default:
366368
self.state = .end
367369
do {
368-
self.promise.succeed(try self.delegate.didFinishRequest())
370+
self.promise.succeed(try self.delegate.didFinishRequest(task: self.task))
369371
} catch {
370372
self.promise.fail(error)
371373
}
@@ -377,12 +379,12 @@ class HTTPTaskHandler<T: HTTPResponseDelegate>: ChannelInboundHandler, ChannelOu
377379
if (event as? IdleStateHandler.IdleStateEvent) == .read {
378380
self.state = .end
379381
let error = HTTPClientErrors.ReadTimeoutError()
380-
delegate.didReceiveError(error)
382+
delegate.didReceiveError(task: self.task, error)
381383
promise.fail(error)
382384
} else if (event as? CancelEvent) != nil {
383385
self.state = .end
384386
let error = HTTPClientErrors.CancelledError()
385-
delegate.didReceiveError(error)
387+
delegate.didReceiveError(task: self.task, error)
386388
promise.fail(error)
387389
} else {
388390
context.fireUserInboundEventTriggered(event)
@@ -396,7 +398,7 @@ class HTTPTaskHandler<T: HTTPResponseDelegate>: ChannelInboundHandler, ChannelOu
396398
default:
397399
self.state = .end
398400
let error = HTTPClientErrors.RemoteConnectionClosedError()
399-
delegate.didReceiveError(error)
401+
delegate.didReceiveError(task: self.task, error)
400402
promise.fail(error)
401403
}
402404
}
@@ -411,12 +413,12 @@ class HTTPTaskHandler<T: HTTPResponseDelegate>: ChannelInboundHandler, ChannelOu
411413
break
412414
default:
413415
self.state = .end
414-
self.delegate.didReceiveError(error)
416+
self.delegate.didReceiveError(task: self.task, error)
415417
self.promise.fail(error)
416418
}
417419
default:
418420
self.state = .end
419-
self.delegate.didReceiveError(error)
421+
self.delegate.didReceiveError(task: self.task, error)
420422
self.promise.fail(error)
421423
}
422424
}

Sources/NIOHTTPClient/SwiftNIOHTTP.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ public class HTTPClient {
147147
redirectHandler = nil
148148
}
149149

150+
let task = HTTPTask(future: promise.futureResult)
151+
150152
var bootstrap = ClientBootstrap(group: group)
151153
.channelOption(ChannelOptions.socket(SocketOptionLevel(IPPROTO_TCP), TCP_NODELAY), value: 1)
152154
.channelInitializer { channel in
@@ -159,16 +161,14 @@ public class HTTPClient {
159161
return channel.eventLoop.makeSucceededFuture(())
160162
}
161163
}.flatMap {
162-
channel.pipeline.addHandler(HTTPTaskHandler(delegate: delegate, promise: promise, redirectHandler: redirectHandler))
164+
channel.pipeline.addHandler(HTTPTaskHandler(task: task, delegate: delegate, promise: promise, redirectHandler: redirectHandler))
163165
}
164166
}
165167

166168
if let connectTimeout = timeout.connect {
167169
bootstrap = bootstrap.connectTimeout(connectTimeout)
168170
}
169171

170-
let task = HTTPTask(future: promise.futureResult)
171-
172172
bootstrap.connect(host: request.host, port: request.port)
173173
.map { channel in
174174
task.setChannel(channel)

Sources/NIOHTTPClient/Utils.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,27 @@ public class HandlingHTTPResponseDelegate<T>: HTTPResponseDelegate {
2525
var handleError: ((Error) -> Void)?
2626
var handleEnd: (() throws -> T)?
2727

28-
public func didTransmitRequestBody() {}
28+
public func didTransmitRequestBody(task: HTTPTask<T>) {}
2929

30-
public func didReceiveHead(_ head: HTTPResponseHead) {
30+
public func didReceiveHead(task: HTTPTask<T>, _ head: HTTPResponseHead) {
3131
if let handler = handleHead {
3232
handler(head)
3333
}
3434
}
3535

36-
public func didReceivePart(_ buffer: ByteBuffer) {
36+
public func didReceivePart(task: HTTPTask<T>, _ buffer: ByteBuffer) {
3737
if let handler = handleBody {
3838
handler(buffer)
3939
}
4040
}
4141

42-
public func didReceiveError(_ error: Error) {
42+
public func didReceiveError(task: HTTPTask<T>, _ error: Error) {
4343
if let handler = handleError {
4444
handler(error)
4545
}
4646
}
4747

48-
public func didFinishRequest() throws -> T {
48+
public func didFinishRequest(task: HTTPTask<T>) throws -> T {
4949
if let handler = handleEnd {
5050
return try handler()
5151
}

Tests/NIOHTTPClientTests/HTTPClientTestUtils.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ class TestHTTPDelegate: HTTPResponseDelegate {
2323

2424
var state = HTTPResponseAccumulator.State.idle
2525

26-
func didReceiveHead(_ head: HTTPResponseHead) {
26+
func didReceiveHead(task: HTTPTask<Response>, _ head: HTTPResponseHead) {
2727
self.state = .head(head)
2828
}
2929

30-
func didReceivePart(_ buffer: ByteBuffer) {
30+
func didReceivePart(task: HTTPTask<Response>, _ buffer: ByteBuffer) {
3131
switch self.state {
3232
case .head(let head):
3333
self.state = .body(head, buffer)
@@ -40,23 +40,23 @@ class TestHTTPDelegate: HTTPResponseDelegate {
4040
}
4141
}
4242

43-
func didFinishRequest() throws {}
43+
func didFinishRequest(task: HTTPTask<Response>) throws {}
4444
}
4545

4646
class CountingDelegate: HTTPResponseDelegate {
4747
typealias Response = Int
4848

4949
var count = 0
5050

51-
func didReceivePart(_ buffer: ByteBuffer) {
51+
func didReceivePart(task: HTTPTask<Response>, _ buffer: ByteBuffer) {
5252
var buffer = buffer
5353
let str = buffer.readString(length: buffer.readableBytes)
5454
if str?.starts(with: "id:") ?? false {
5555
self.count += 1
5656
}
5757
}
5858

59-
func didFinishRequest() throws -> Int {
59+
func didFinishRequest(task: HTTPTask<Response>) throws -> Int {
6060
return self.count
6161
}
6262
}

Tests/NIOHTTPClientTests/SwiftNIOHTTPTests.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@ class SwiftHTTPTests: XCTestCase {
3434
func testHTTPPartsHandler() throws {
3535
let channel = EmbeddedChannel()
3636
let recorder = RecordingHandler<HTTPClientResponsePart, HTTPClientRequestPart>()
37+
let promise: EventLoopPromise<Void> = channel.eventLoop.makePromise()
38+
let task = HTTPTask(future: promise.futureResult)
3739

3840
try channel.pipeline.addHandler(recorder).wait()
39-
try channel.pipeline.addHandler(HTTPTaskHandler(delegate: TestHTTPDelegate(), promise: channel.eventLoop.makePromise(), redirectHandler: nil)).wait()
41+
try channel.pipeline.addHandler(HTTPTaskHandler(task: task, delegate: TestHTTPDelegate(), promise: promise, redirectHandler: nil)).wait()
4042

4143
var request = try HTTPRequest(url: "http://localhost/get")
4244
request.headers.add(name: "X-Test-Header", value: "X-Test-Value")
@@ -60,7 +62,9 @@ class SwiftHTTPTests: XCTestCase {
6062
func testHTTPPartsHandlerMultiBody() throws {
6163
let channel = EmbeddedChannel()
6264
let delegate = TestHTTPDelegate()
63-
let handler = HTTPTaskHandler(delegate: delegate, promise: channel.eventLoop.makePromise(), redirectHandler: nil)
65+
let promise: EventLoopPromise<Void> = channel.eventLoop.makePromise()
66+
let task = HTTPTask(future: promise.futureResult)
67+
let handler = HTTPTaskHandler(task: task, delegate: delegate, promise: promise, redirectHandler: nil)
6468

6569
try channel.pipeline.addHandler(handler).wait()
6670

0 commit comments

Comments
 (0)