Skip to content

Commit fb390e6

Browse files
committed
Add an explicit test to verify we don't loose data if we receive an end.
1 parent 96e4f95 commit fb390e6

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

Diff for: Tests/AsyncHTTPClientTests/HTTPRequestStateMachineTests.swift

+33
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,39 @@ class HTTPRequestStateMachineTests: XCTestCase {
619619
XCTAssertEqual(state.channelReadComplete(), .wait)
620620
XCTAssertEqual(state.channelInactive(), .failRequest(HTTPClientError.remoteConnectionClosed, .none))
621621
}
622+
623+
func testFailHTTPRequestWithContentLengthBecauseOfChannelInactiveWaitingForReadAndDemandMultipleTimes() {
624+
var state = HTTPRequestStateMachine(isChannelWritable: true, ignoreUncleanSSLShutdown: false)
625+
let requestHead = HTTPRequestHead(version: .http1_1, method: .GET, uri: "/")
626+
let metadata = RequestFramingMetadata(connectionClose: false, body: .none)
627+
XCTAssertEqual(state.startRequest(head: requestHead, metadata: metadata), .sendRequestHead(requestHead, startBody: false))
628+
629+
let responseHead = HTTPResponseHead(version: .http1_1, status: .ok, headers: ["Content-Length": "50"])
630+
let body = ByteBuffer(string: "foo bar")
631+
XCTAssertEqual(state.channelRead(.head(responseHead)), .forwardResponseHead(responseHead, pauseRequestBodyStream: false))
632+
XCTAssertEqual(state.demandMoreResponseBodyParts(), .wait)
633+
XCTAssertEqual(state.channelReadComplete(), .wait)
634+
XCTAssertEqual(state.read(), .read)
635+
XCTAssertEqual(state.channelRead(.body(body)), .wait)
636+
XCTAssertEqual(state.channelReadComplete(), .forwardResponseBodyParts([body]))
637+
638+
let part1 = ByteBuffer(string: "baz lightyear")
639+
XCTAssertEqual(state.channelRead(.body(part1)), .wait)
640+
XCTAssertEqual(state.channelReadComplete(), .wait)
641+
642+
let part2 = ByteBuffer(string: "nearly last")
643+
XCTAssertEqual(state.channelRead(.body(part2)), .wait)
644+
XCTAssertEqual(state.channelReadComplete(), .wait)
645+
646+
let part3 = ByteBuffer(string: "final message")
647+
XCTAssertEqual(state.channelRead(.body(part3)), .wait)
648+
XCTAssertEqual(state.channelReadComplete(), .wait)
649+
650+
XCTAssertEqual(state.channelRead(.end(nil)), .succeedRequest(.close, [part1, part2, part3]))
651+
XCTAssertEqual(state.channelReadComplete(), .wait)
652+
653+
XCTAssertEqual(state.channelInactive(), .wait)
654+
}
622655
}
623656

624657
extension HTTPRequestStateMachine.Action: Equatable {

0 commit comments

Comments
 (0)