Skip to content

Commit 8c99c41

Browse files
committed
fail if we get part when state is endOrError
1 parent ffcd1e1 commit 8c99c41

File tree

1 file changed

+22
-13
lines changed

1 file changed

+22
-13
lines changed

Sources/AsyncHTTPClient/HTTPHandler.swift

+22-13
Original file line numberDiff line numberDiff line change
@@ -839,8 +839,8 @@ extension TaskHandler: ChannelDuplexHandler {
839839
}.flatMap {
840840
self.writeBody(request: request, context: context)
841841
}.flatMap {
842-
self.state = .bodySent
843842
context.eventLoop.assertInEventLoop()
843+
self.state = .bodySent
844844
if let expectedBodyLength = self.expectedBodyLength, expectedBodyLength != self.actualBodyLength {
845845
let error = HTTPClientError.bodyLengthMismatch
846846
self.errorCaught(context: context, error: error)
@@ -924,24 +924,31 @@ extension TaskHandler: ChannelDuplexHandler {
924924
let response = self.unwrapInboundIn(data)
925925
switch response {
926926
case .head(let head):
927-
if !head.isKeepAlive {
928-
self.closing = true
929-
}
927+
switch self.state {
928+
case .endOrError:
929+
preconditionFailure("unexpected state on .head")
930+
default:
931+
if !head.isKeepAlive {
932+
self.closing = true
933+
}
930934

931-
if let redirectURL = self.redirectHandler?.redirectTarget(status: head.status, headers: head.headers) {
932-
self.state = .redirected(head, redirectURL)
933-
} else {
934-
self.state = .head
935-
self.mayRead = false
936-
self.callOutToDelegate(value: head, channelEventLoop: context.eventLoop, self.delegate.didReceiveHead)
937-
.whenComplete { result in
938-
self.handleBackpressureResult(context: context, result: result)
939-
}
935+
if let redirectURL = self.redirectHandler?.redirectTarget(status: head.status, headers: head.headers) {
936+
self.state = .redirected(head, redirectURL)
937+
} else {
938+
self.state = .head
939+
self.mayRead = false
940+
self.callOutToDelegate(value: head, channelEventLoop: context.eventLoop, self.delegate.didReceiveHead)
941+
.whenComplete { result in
942+
self.handleBackpressureResult(context: context, result: result)
943+
}
944+
}
940945
}
941946
case .body(let body):
942947
switch self.state {
943948
case .redirected:
944949
break
950+
case .endOrError:
951+
preconditionFailure("unexpected state on .body")
945952
default:
946953
self.state = .body
947954
self.mayRead = false
@@ -952,6 +959,8 @@ extension TaskHandler: ChannelDuplexHandler {
952959
}
953960
case .end:
954961
switch self.state {
962+
case .endOrError:
963+
preconditionFailure("unexpected state on .end")
955964
case .redirected(let head, let redirectURL):
956965
self.state = .endOrError
957966
self.task.releaseAssociatedConnection(delegateType: Delegate.self, closing: self.closing).whenSuccess {

0 commit comments

Comments
 (0)