Skip to content

Commit f5b686d

Browse files
committed
Fix Host header (#650)
1 parent e91ceb8 commit f5b686d

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

Sources/AsyncHTTPClient/ConnectionPool/ChannelHandler/HTTP1ProxyConnectHandler.swift

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ final class HTTP1ProxyConnectHandler: ChannelDuplexHandler, RemovableChannelHand
3535

3636
private var state: State = .initialized
3737

38+
private let scheme: Scheme
3839
private let targetHost: String
3940
private let targetPort: Int
4041
private let proxyAuthorization: HTTPClient.Authorization?
@@ -46,6 +47,7 @@ final class HTTP1ProxyConnectHandler: ChannelDuplexHandler, RemovableChannelHand
4647
}
4748

4849
convenience init(
50+
scheme: Scheme,
4951
target: ConnectionTarget,
5052
proxyAuthorization: HTTPClient.Authorization?,
5153
deadline: NIODeadline
@@ -63,17 +65,20 @@ final class HTTP1ProxyConnectHandler: ChannelDuplexHandler, RemovableChannelHand
6365
fatalError("Unix Domain Sockets do not support proxies")
6466
}
6567
self.init(
68+
scheme: scheme,
6669
targetHost: targetHost,
6770
targetPort: targetPort,
6871
proxyAuthorization: proxyAuthorization,
6972
deadline: deadline
7073
)
7174
}
7275

73-
init(targetHost: String,
76+
init(scheme: Scheme,
77+
targetHost: String,
7478
targetPort: Int,
7579
proxyAuthorization: HTTPClient.Authorization?,
7680
deadline: NIODeadline) {
81+
self.scheme = scheme
7782
self.targetHost = targetHost
7883
self.targetPort = targetPort
7984
self.proxyAuthorization = proxyAuthorization
@@ -155,7 +160,13 @@ final class HTTP1ProxyConnectHandler: ChannelDuplexHandler, RemovableChannelHand
155160
method: .CONNECT,
156161
uri: "\(self.targetHost):\(self.targetPort)"
157162
)
158-
head.headers.replaceOrAdd(name: "host", value: "\(self.targetHost)")
163+
if !head.headers.contains(name: "host") {
164+
var host = self.targetHost
165+
if (self.targetPort != self.scheme.defaultPort) {
166+
host += ":\(self.targetPort)"
167+
}
168+
head.headers.replaceOrAdd(name: "host", value: host)
169+
}
159170
if let authorization = self.proxyAuthorization {
160171
head.headers.replaceOrAdd(name: "proxy-authorization", value: authorization.headerValue)
161172
}

Sources/AsyncHTTPClient/ConnectionPool/HTTPConnectionPool+Factory.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ extension HTTPConnectionPool.ConnectionFactory {
195195
let encoder = HTTPRequestEncoder()
196196
let decoder = ByteToMessageHandler(HTTPResponseDecoder(leftOverBytesStrategy: .dropBytes))
197197
let proxyHandler = HTTP1ProxyConnectHandler(
198+
scheme: self.key.scheme,
198199
target: self.key.connectionTarget,
199200
proxyAuthorization: proxy.authorization,
200201
deadline: deadline

Tests/AsyncHTTPClientTests/HTTP1ProxyConnectHandlerTests.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class HTTP1ProxyConnectHandlerTests: XCTestCase {
2727
XCTAssertNoThrow(try embedded.connect(to: socketAddress).wait())
2828

2929
let proxyConnectHandler = HTTP1ProxyConnectHandler(
30+
scheme: .https,
3031
targetHost: "swift.org",
3132
targetPort: 443,
3233
proxyAuthorization: .none,
@@ -61,6 +62,7 @@ class HTTP1ProxyConnectHandlerTests: XCTestCase {
6162
XCTAssertNoThrow(try embedded.connect(to: socketAddress).wait())
6263

6364
let proxyConnectHandler = HTTP1ProxyConnectHandler(
65+
scheme: .https,
6466
targetHost: "swift.org",
6567
targetPort: 443,
6668
proxyAuthorization: .basic(credentials: "abc123"),
@@ -95,6 +97,7 @@ class HTTP1ProxyConnectHandlerTests: XCTestCase {
9597
XCTAssertNoThrow(try embedded.connect(to: socketAddress).wait())
9698

9799
let proxyConnectHandler = HTTP1ProxyConnectHandler(
100+
scheme: .https,
98101
targetHost: "swift.org",
99102
targetPort: 443,
100103
proxyAuthorization: .none,
@@ -135,6 +138,7 @@ class HTTP1ProxyConnectHandlerTests: XCTestCase {
135138
XCTAssertNoThrow(try embedded.connect(to: socketAddress).wait())
136139

137140
let proxyConnectHandler = HTTP1ProxyConnectHandler(
141+
scheme: .https,
138142
targetHost: "swift.org",
139143
targetPort: 443,
140144
proxyAuthorization: .none,
@@ -175,6 +179,7 @@ class HTTP1ProxyConnectHandlerTests: XCTestCase {
175179
XCTAssertNoThrow(try embedded.connect(to: socketAddress).wait())
176180

177181
let proxyConnectHandler = HTTP1ProxyConnectHandler(
182+
scheme: .https,
178183
targetHost: "swift.org",
179184
targetPort: 443,
180185
proxyAuthorization: .none,

0 commit comments

Comments
 (0)