Skip to content

Commit 8bd8605

Browse files
committed
HTTP1Connection: Close on error while in request
1 parent 393ada5 commit 8bd8605

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

Diff for: Sources/AsyncHTTPClient/ConnectionPool/HTTP1.1/HTTP1ConnectionStateMachine.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,10 @@ struct HTTP1ConnectionStateMachine {
117117
self.state = .closed
118118
return .fireChannelError(error, closeConnection: false)
119119

120-
case .inRequest(var requestStateMachine, close: _):
120+
case .inRequest(var requestStateMachine, close: let close):
121121
return self.avoidingStateMachineCoW { state -> Action in
122122
let action = requestStateMachine.errorHappened(error)
123-
state = .closed
123+
state = .inRequest(requestStateMachine, close: close)
124124
return state.modify(with: action)
125125
}
126126

Diff for: Tests/AsyncHTTPClientTests/HTTP1ConnectionStateMachineTests+XCTest.swift

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ extension HTTP1ConnectionStateMachineTests {
3737
("testReadsAreForwardedIfConnectionIsClosing", testReadsAreForwardedIfConnectionIsClosing),
3838
("testChannelReadsAreIgnoredIfConnectionIsClosing", testChannelReadsAreIgnoredIfConnectionIsClosing),
3939
("testRequestIsCancelledWhileWaitingForWritable", testRequestIsCancelledWhileWaitingForWritable),
40+
("testConnectionIsClosedIfErrorHappensWhileInRequest", testConnectionIsClosedIfErrorHappensWhileInRequest),
4041
]
4142
}
4243
}

Diff for: Tests/AsyncHTTPClientTests/HTTP1ConnectionStateMachineTests.swift

+19-4
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@
1515
@testable import AsyncHTTPClient
1616
import NIOCore
1717
import NIOHTTP1
18+
import NIOHTTPCompression
1819
import XCTest
1920

2021
class HTTP1ConnectionStateMachineTests: XCTestCase {
2122
func testPOSTRequestWithWriteAndReadBackpressure() {
2223
var state = HTTP1ConnectionStateMachine()
2324
XCTAssertEqual(state.channelActive(isWritable: false), .fireChannelActive)
2425

25-
let requestHead = HTTPRequestHead(version: .http1_1, method: .POST, uri: "/", headers: HTTPHeaders([("content-length", "4")]))
26+
let requestHead = HTTPRequestHead(version: .http1_1, method: .POST, uri: "/", headers: ["content-length": "4"])
2627
let metadata = RequestFramingMetadata(connectionClose: false, body: .fixedSize(4))
2728
XCTAssertEqual(state.runNewRequest(head: requestHead, metadata: metadata), .wait)
2829
XCTAssertEqual(state.writabilityChanged(writable: true), .sendRequestHead(requestHead, startBody: true))
@@ -64,7 +65,7 @@ class HTTP1ConnectionStateMachineTests: XCTestCase {
6465
let metadata = RequestFramingMetadata(connectionClose: false, body: .none)
6566
XCTAssertEqual(state.runNewRequest(head: requestHead, metadata: metadata), .sendRequestHead(requestHead, startBody: false))
6667

67-
let responseHead = HTTPResponseHead(version: .http1_1, status: .ok, headers: HTTPHeaders([("content-length", "12")]))
68+
let responseHead = HTTPResponseHead(version: .http1_1, status: .ok, headers: ["content-length": "12"])
6869
XCTAssertEqual(state.channelRead(.head(responseHead)), .forwardResponseHead(responseHead, pauseRequestBodyStream: false))
6970
let part0 = ByteBuffer(bytes: 0...3)
7071
let part1 = ByteBuffer(bytes: 4...7)
@@ -141,7 +142,7 @@ class HTTP1ConnectionStateMachineTests: XCTestCase {
141142
var state = HTTP1ConnectionStateMachine()
142143
XCTAssertEqual(state.channelActive(isWritable: false), .fireChannelActive)
143144

144-
let requestHead = HTTPRequestHead(version: .http1_1, method: .POST, uri: "/", headers: HTTPHeaders([("content-length", "4")]))
145+
let requestHead = HTTPRequestHead(version: .http1_1, method: .POST, uri: "/", headers: ["content-length": "4"])
145146
let metadata = RequestFramingMetadata(connectionClose: false, body: .fixedSize(4))
146147
XCTAssertEqual(state.runNewRequest(head: requestHead, metadata: metadata), .wait)
147148
XCTAssertEqual(state.writabilityChanged(writable: true), .sendRequestHead(requestHead, startBody: true))
@@ -185,11 +186,25 @@ class HTTP1ConnectionStateMachineTests: XCTestCase {
185186
func testRequestIsCancelledWhileWaitingForWritable() {
186187
var state = HTTP1ConnectionStateMachine()
187188
XCTAssertEqual(state.channelActive(isWritable: false), .fireChannelActive)
188-
let requestHead = HTTPRequestHead(version: .http1_1, method: .POST, uri: "/", headers: HTTPHeaders([("content-length", "4")]))
189+
let requestHead = HTTPRequestHead(version: .http1_1, method: .POST, uri: "/", headers: ["content-length": "4"])
189190
let metadata = RequestFramingMetadata(connectionClose: false, body: .fixedSize(4))
190191
XCTAssertEqual(state.runNewRequest(head: requestHead, metadata: metadata), .wait)
191192
XCTAssertEqual(state.requestCancelled(closeConnection: false), .failRequest(HTTPClientError.cancelled, .informConnectionIsIdle))
192193
}
194+
195+
func testConnectionIsClosedIfErrorHappensWhileInRequest() {
196+
var state = HTTP1ConnectionStateMachine()
197+
XCTAssertEqual(state.channelActive(isWritable: true), .fireChannelActive)
198+
let requestHead = HTTPRequestHead(version: .http1_1, method: .GET, uri: "/")
199+
let metadata = RequestFramingMetadata(connectionClose: false, body: .none)
200+
XCTAssertEqual(state.runNewRequest(head: requestHead, metadata: metadata), .sendRequestHead(requestHead, startBody: false))
201+
let responseHead = HTTPResponseHead(version: .http1_1, status: .ok)
202+
XCTAssertEqual(state.channelRead(.head(responseHead)), .forwardResponseHead(responseHead, pauseRequestBodyStream: false))
203+
XCTAssertEqual(state.channelRead(.body(ByteBuffer(string: "Hello world!\n"))), .wait)
204+
XCTAssertEqual(state.channelRead(.body(ByteBuffer(string: "Foo Bar!\n"))), .wait)
205+
let decompressionError = NIOHTTPDecompression.DecompressionError.limit
206+
XCTAssertEqual(state.errorHappened(decompressionError), .failRequest(decompressionError, .close))
207+
}
193208
}
194209

195210
extension HTTP1ConnectionStateMachine.Action: Equatable {

0 commit comments

Comments
 (0)