CONNECT method should not have request body (#637)
* CONNECT method has no request body ### Motivation: [rfc7231](https://tools.ietf.org/html/rfc7231#section-4.3.6) said: > A payload within a `CONNECT` request message has no defined semantics; sending a payload body on a `CONNECT` request might cause some existing implementations to reject the request. ### Modifications: Change `HTTPMethod.CONNECT.hasRequestBody` to returns `.no`. ### Result: `HTTPRequestEncoder` does not generate chunked body for `CONNECT` method. * Change `HTTPMethod.CONNECT.hasRequestBody` to returns `.unlikely`
This commit is contained in:
parent
6e6c68c1b2
commit
287d50c373
|
@ -959,9 +959,9 @@ public enum HTTPMethod: Equatable {
|
||||||
switch self {
|
switch self {
|
||||||
case .HEAD, .DELETE, .TRACE:
|
case .HEAD, .DELETE, .TRACE:
|
||||||
return .no
|
return .no
|
||||||
case .POST, .PUT, .CONNECT, .PATCH:
|
case .POST, .PUT, .PATCH:
|
||||||
return .yes
|
return .yes
|
||||||
case .GET, .OPTIONS:
|
case .GET, .CONNECT, .OPTIONS:
|
||||||
fallthrough
|
fallthrough
|
||||||
default:
|
default:
|
||||||
return .unlikely
|
return .unlikely
|
||||||
|
|
|
@ -33,6 +33,7 @@ extension HTTPRequestEncoderTests {
|
||||||
("testNoTransferEncodingHeadersForHEAD", testNoTransferEncodingHeadersForHEAD),
|
("testNoTransferEncodingHeadersForHEAD", testNoTransferEncodingHeadersForHEAD),
|
||||||
("testNoChunkedEncodingForHTTP10", testNoChunkedEncodingForHTTP10),
|
("testNoChunkedEncodingForHTTP10", testNoChunkedEncodingForHTTP10),
|
||||||
("testBody", testBody),
|
("testBody", testBody),
|
||||||
|
("testCONNECT", testCONNECT),
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,6 +116,24 @@ class HTTPRequestEncoderTests: XCTestCase {
|
||||||
assertOutboundContainsOnly(channel, "")
|
assertOutboundContainsOnly(channel, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testCONNECT() throws {
|
||||||
|
let channel = EmbeddedChannel()
|
||||||
|
defer {
|
||||||
|
XCTAssertEqual(.some(false), try? channel.finish())
|
||||||
|
}
|
||||||
|
|
||||||
|
let uri = "server.example.com:80"
|
||||||
|
try channel.pipeline.add(handler: HTTPRequestEncoder()).wait()
|
||||||
|
var request = HTTPRequestHead(version: HTTPVersion(major: 1, minor:1), method: .CONNECT, uri: uri)
|
||||||
|
request.headers.add(name: "Host", value: uri)
|
||||||
|
|
||||||
|
XCTAssertNoThrow(try channel.writeOutbound(HTTPClientRequestPart.head(request)))
|
||||||
|
XCTAssertNoThrow(try channel.writeOutbound(HTTPClientRequestPart.end(nil)))
|
||||||
|
|
||||||
|
assertOutboundContainsOnly(channel, "CONNECT \(uri) HTTP/1.1\r\nHost: \(uri)\r\n\r\n")
|
||||||
|
assertOutboundContainsOnly(channel, "")
|
||||||
|
}
|
||||||
|
|
||||||
private func assertOutboundContainsOnly(_ channel: EmbeddedChannel, _ expected: String) {
|
private func assertOutboundContainsOnly(_ channel: EmbeddedChannel, _ expected: String) {
|
||||||
if case .some(.byteBuffer(let buffer)) = channel.readOutbound() {
|
if case .some(.byteBuffer(let buffer)) = channel.readOutbound() {
|
||||||
buffer.assertContainsOnly(expected)
|
buffer.assertContainsOnly(expected)
|
||||||
|
|
Loading…
Reference in New Issue