Skip to content

Commit 1d442b0

Browse files
committed
Changed to only output port when it is not 80 or 443
Also added test
1 parent 618153f commit 1d442b0

File tree

2 files changed

+65
-6
lines changed

2 files changed

+65
-6
lines changed

Sources/AsyncHTTPClient/HTTPHandler.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,6 @@ extension HTTPClient {
253253
return self.scheme == "https" || self.scheme == "https+unix"
254254
}
255255

256-
/// Specified port.
257-
var specifiedPort: Int? {
258-
return self.url.port
259-
}
260-
261256
/// Resolved port.
262257
public var port: Int {
263258
return self.url.port ?? (self.useTLS ? 443 : 80)
@@ -777,7 +772,9 @@ extension TaskHandler: ChannelDuplexHandler {
777772
var headers = request.headers
778773

779774
if !request.headers.contains(name: "Host") {
780-
headers.add(name: "Host", value: "\(request.host)\(request.specifiedPort.map { ":\($0)" } ?? "")")
775+
let port = request.port
776+
let host = (port != 80 && port != 443) ? "\(request.host):\(port)" : request.host
777+
headers.add(name: "Host", value: host)
781778
}
782779

783780
do {

Tests/AsyncHTTPClientTests/HTTPClientInternalTests.swift

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,37 @@ class HTTPClientInternalTests: XCTestCase {
6767
XCTAssertNoThrow(try channel.writeInbound(HTTPClientResponsePart.end(nil)))
6868
}
6969

70+
func testHostPort() throws {
71+
let channel = EmbeddedChannel()
72+
let recorder = RecordingHandler<HTTPClientResponsePart, HTTPClientRequestPart>()
73+
let task = Task<Void>(eventLoop: channel.eventLoop, logger: HTTPClient.loggingDisabled)
74+
75+
try channel.pipeline.addHandler(recorder).wait()
76+
try channel.pipeline.addHandler(TaskHandler(task: task,
77+
kind: .host,
78+
delegate: TestHTTPDelegate(),
79+
redirectHandler: nil,
80+
ignoreUncleanSSLShutdown: false,
81+
logger: HTTPClient.loggingDisabled)).wait()
82+
83+
let request1 = try Request(url: "http://localhost:80/get")
84+
XCTAssertNoThrow(try channel.writeOutbound(request1))
85+
let request2 = try Request(url: "https://localhost/get")
86+
XCTAssertNoThrow(try channel.writeOutbound(request2))
87+
let request3 = try Request(url: "http://localhost:8080/get")
88+
XCTAssertNoThrow(try channel.writeOutbound(request3))
89+
90+
var head1 = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get")
91+
head1.headers.add(name: "Host", value: "localhost")
92+
XCTAssertEqual(HTTPClientRequestPart.head(head1), recorder.writes[0])
93+
var head2 = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get")
94+
head2.headers.add(name: "Host", value: "localhost")
95+
XCTAssertEqual(HTTPClientRequestPart.head(head2), recorder.writes[2])
96+
var head3 = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get")
97+
head3.headers.add(name: "Host", value: "localhost:8080")
98+
XCTAssertEqual(HTTPClientRequestPart.head(head3), recorder.writes[4])
99+
}
100+
70101
func testBadHTTPRequest() throws {
71102
let channel = EmbeddedChannel()
72103
let recorder = RecordingHandler<HTTPClientResponsePart, HTTPClientRequestPart>()
@@ -90,6 +121,37 @@ class HTTPClientInternalTests: XCTestCase {
90121
}
91122
}
92123

124+
func testHostPort() throws {
125+
let channel = EmbeddedChannel()
126+
let recorder = RecordingHandler<HTTPClientResponsePart, HTTPClientRequestPart>()
127+
let task = Task<Void>(eventLoop: channel.eventLoop, logger: HTTPClient.loggingDisabled)
128+
129+
try channel.pipeline.addHandler(recorder).wait()
130+
try channel.pipeline.addHandler(TaskHandler(task: task,
131+
kind: .host,
132+
delegate: TestHTTPDelegate(),
133+
redirectHandler: nil,
134+
ignoreUncleanSSLShutdown: false,
135+
logger: HTTPClient.loggingDisabled)).wait()
136+
137+
let request1 = try Request(url: "http://localhost:80/get")
138+
XCTAssertNoThrow(try channel.writeOutbound(request1))
139+
let request2 = try Request(url: "https://localhost/get")
140+
XCTAssertNoThrow(try channel.writeOutbound(request2))
141+
let request3 = try Request(url: "http://localhost:8080/get")
142+
XCTAssertNoThrow(try channel.writeOutbound(request3))
143+
144+
var head1 = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get")
145+
head1.headers.add(name: "Host", value: "localhost")
146+
XCTAssertEqual(HTTPClientRequestPart.head(head1), recorder.writes[0])
147+
var head2 = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get")
148+
head2.headers.add(name: "Host", value: "localhost")
149+
XCTAssertEqual(HTTPClientRequestPart.head(head2), recorder.writes[2])
150+
var head3 = HTTPRequestHead(version: HTTPVersion(major: 1, minor: 1), method: .GET, uri: "/get")
151+
head3.headers.add(name: "Host", value: "localhost:8080")
152+
XCTAssertEqual(HTTPClientRequestPart.head(head3), recorder.writes[4])
153+
}
154+
93155
func testHTTPPartsHandlerMultiBody() throws {
94156
let channel = EmbeddedChannel()
95157
let delegate = TestHTTPDelegate()

0 commit comments

Comments
 (0)