@@ -619,6 +619,39 @@ class HTTPRequestStateMachineTests: XCTestCase {
619
619
XCTAssertEqual ( state. channelReadComplete ( ) , . wait)
620
620
XCTAssertEqual ( state. channelInactive ( ) , . failRequest( HTTPClientError . remoteConnectionClosed, . none) )
621
621
}
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
+ }
622
655
}
623
656
624
657
extension HTTPRequestStateMachine . Action : Equatable {
0 commit comments