Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /