Skip to content

Commit 785ced5

Browse files
authoredJun 15, 2020
The host header should also include the port (#237)
See https://tools.ietf.org/html/rfc7230#section-5.4 If port is not 80 or 443 then add to host header. Fixed up tests
1 parent a61b31c commit 785ced5

File tree

4 files changed

+53
-11
lines changed

4 files changed

+53
-11
lines changed
 

‎Sources/AsyncHTTPClient/HTTPHandler.swift

+7-2
Original file line numberDiff line numberDiff line change
@@ -771,8 +771,13 @@ extension TaskHandler: ChannelDuplexHandler {
771771
uri: request.uri)
772772
var headers = request.headers
773773

774-
if !request.headers.contains(name: "Host") {
775-
headers.add(name: "Host", value: request.host)
774+
if !request.headers.contains(name: "host") {
775+
let port = request.port
776+
var host = request.host
777+
if !(port == 80 && request.scheme == "http"), !(port == 443 && request.scheme == "https") {
778+
host += ":\(port)"
779+
}
780+
headers.add(name: "host", value: host)
776781
}
777782

778783
do {

‎Tests/AsyncHTTPClientTests/HTTPClientInternalTests+XCTest.swift

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ extension HTTPClientInternalTests {
2727
return [
2828
("testHTTPPartsHandler", testHTTPPartsHandler),
2929
("testBadHTTPRequest", testBadHTTPRequest),
30+
("testHostPort", testHostPort),
3031
("testHTTPPartsHandlerMultiBody", testHTTPPartsHandlerMultiBody),
3132
("testProxyStreaming", testProxyStreaming),
3233
("testProxyStreamingFailure", testProxyStreamingFailure),

‎Tests/AsyncHTTPClientTests/HTTPClientInternalTests.swift

+38-2
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ class HTTPClientInternalTests: XCTestCase {
4949
ignoreUncleanSSLShutdown: false,
5050
logger: HTTPClient.loggingDisabled)).wait()
5151

52-
var request = try Request(url: "http://localhost/get")
52+
var request = try Request(url: "http://localhost:8080/get")
5353
request.headers.add(name: "X-Test-Header", value: "X-Test-Value")
5454
request.body = .string("1234")
5555

5656
XCTAssertNoThrow(try channel.writeOutbound(request))
5757
XCTAssertEqual(3, recorder.writes.count)
5858
var head = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get")
5959
head.headers.add(name: "X-Test-Header", value: "X-Test-Value")
60-
head.headers.add(name: "Host", value: "localhost")
60+
head.headers.add(name: "Host", value: "localhost:8080")
6161
head.headers.add(name: "Content-Length", value: "4")
6262
XCTAssertEqual(HTTPClientRequestPart.head(head), recorder.writes[0])
6363
let buffer = ByteBuffer.of(string: "1234")
@@ -90,6 +90,42 @@ class HTTPClientInternalTests: XCTestCase {
9090
}
9191
}
9292

93+
func testHostPort() throws {
94+
let channel = EmbeddedChannel()
95+
let recorder = RecordingHandler<HTTPClientResponsePart, HTTPClientRequestPart>()
96+
let task = Task<Void>(eventLoop: channel.eventLoop, logger: HTTPClient.loggingDisabled)
97+
98+
try channel.pipeline.addHandler(recorder).wait()
99+
try channel.pipeline.addHandler(TaskHandler(task: task,
100+
kind: .host,
101+
delegate: TestHTTPDelegate(),
102+
redirectHandler: nil,
103+
ignoreUncleanSSLShutdown: false,
104+
logger: HTTPClient.loggingDisabled)).wait()
105+
106+
let request1 = try Request(url: "http://localhost:80/get")
107+
XCTAssertNoThrow(try channel.writeOutbound(request1))
108+
let request2 = try Request(url: "https://localhost/get")
109+
XCTAssertNoThrow(try channel.writeOutbound(request2))
110+
let request3 = try Request(url: "http://localhost:8080/get")
111+
XCTAssertNoThrow(try channel.writeOutbound(request3))
112+
let request4 = try Request(url: "http://localhost:443/get")
113+
XCTAssertNoThrow(try channel.writeOutbound(request4))
114+
let request5 = try Request(url: "https://localhost:80/get")
115+
XCTAssertNoThrow(try channel.writeOutbound(request5))
116+
117+
let head1 = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get", headers: ["host": "localhost"])
118+
XCTAssertEqual(HTTPClientRequestPart.head(head1), recorder.writes[0])
119+
let head2 = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get", headers: ["host": "localhost"])
120+
XCTAssertEqual(HTTPClientRequestPart.head(head2), recorder.writes[2])
121+
let head3 = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get", headers: ["host": "localhost:8080"])
122+
XCTAssertEqual(HTTPClientRequestPart.head(head3), recorder.writes[4])
123+
let head4 = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get", headers: ["host": "localhost:443"])
124+
XCTAssertEqual(HTTPClientRequestPart.head(head4), recorder.writes[6])
125+
let head5 = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get", headers: ["host": "localhost:80"])
126+
XCTAssertEqual(HTTPClientRequestPart.head(head5), recorder.writes[8])
127+
}
128+
93129
func testHTTPPartsHandlerMultiBody() throws {
94130
let channel = EmbeddedChannel()
95131
let delegate = TestHTTPDelegate()

‎Tests/AsyncHTTPClientTests/HTTPClientTests.swift

+7-7
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ class HTTPClientTests: XCTestCase {
216216
return
217217
}
218218
let hostName = try? JSONDecoder().decode(RequestInfo.self, from: body).data
219-
XCTAssertEqual("127.0.0.1", hostName)
219+
XCTAssertEqual("127.0.0.1:\(self.defaultHTTPBin.port)", hostName)
220220
}
221221

222222
func testPercentEncoded() throws {
@@ -763,7 +763,7 @@ class HTTPClientTests: XCTestCase {
763763
XCTAssertNoThrow(XCTAssertEqual(.head(.init(version: .init(major: 1, minor: 1),
764764
method: .GET,
765765
uri: "/foo",
766-
headers: HTTPHeaders([("Host", "localhost")]))),
766+
headers: HTTPHeaders([("Host", "localhost:\(web.serverPort)")]))),
767767
try web.readInbound()))
768768
XCTAssertNoThrow(XCTAssertEqual(.end(nil),
769769
try web.readInbound()))
@@ -787,7 +787,7 @@ class HTTPClientTests: XCTestCase {
787787
XCTAssertNoThrow(XCTAssertEqual(.head(.init(version: .init(major: 1, minor: 1),
788788
method: .GET,
789789
uri: "/foo",
790-
headers: HTTPHeaders([("Host", "localhost")]))),
790+
headers: HTTPHeaders([("Host", "localhost:\(web.serverPort)")]))),
791791
try web.readInbound()))
792792
XCTAssertNoThrow(XCTAssertEqual(.end(nil),
793793
try web.readInbound()))
@@ -808,7 +808,7 @@ class HTTPClientTests: XCTestCase {
808808
XCTAssertNoThrow(XCTAssertEqual(.head(.init(version: .init(major: 1, minor: 1),
809809
method: .GET,
810810
uri: "/foo",
811-
headers: HTTPHeaders([("Host", "localhost")]))),
811+
headers: HTTPHeaders([("Host", "localhost:\(web.serverPort)")]))),
812812
try web.readInbound()))
813813
XCTAssertNoThrow(XCTAssertEqual(.end(nil),
814814
try web.readInbound()))
@@ -831,7 +831,7 @@ class HTTPClientTests: XCTestCase {
831831
XCTAssertNoThrow(XCTAssertEqual(.head(.init(version: .init(major: 1, minor: 1),
832832
method: .GET,
833833
uri: "/foo",
834-
headers: HTTPHeaders([("Host", "localhost")]))),
834+
headers: HTTPHeaders([("Host", "localhost:\(web.serverPort)")]))),
835835
try web.readInbound()))
836836
XCTAssertNoThrow(XCTAssertEqual(.end(nil),
837837
try web.readInbound()))
@@ -859,7 +859,7 @@ class HTTPClientTests: XCTestCase {
859859
XCTAssertNoThrow(XCTAssertEqual(.head(.init(version: .init(major: 1, minor: 1),
860860
method: .GET,
861861
uri: "/foo",
862-
headers: HTTPHeaders([("Host", "localhost")]))),
862+
headers: HTTPHeaders([("Host", "localhost:\(web.serverPort)")]))),
863863
try web.readInbound()))
864864
XCTAssertNoThrow(XCTAssertEqual(.end(nil),
865865
try web.readInbound()))
@@ -1036,7 +1036,7 @@ class HTTPClientTests: XCTestCase {
10361036
XCTAssertNoThrow(XCTAssertEqual(.head(.init(version: .init(major: 1, minor: 1),
10371037
method: .GET,
10381038
uri: "/foo",
1039-
headers: HTTPHeaders([("Host", "localhost")]))),
1039+
headers: HTTPHeaders([("Host", "localhost:\(web.serverPort)")]))),
10401040
try web.readInbound()))
10411041
XCTAssertNoThrow(XCTAssertEqual(.end(nil),
10421042
try web.readInbound()))

0 commit comments

Comments
 (0)
Please sign in to comment.