Skip to content

Commit 3e08a60

Browse files
authored
Merge branch 'main' into dn-async-await-public
2 parents 451f98e + 19e83a3 commit 3e08a60

File tree

4 files changed

+44
-6
lines changed

4 files changed

+44
-6
lines changed

Sources/AsyncHTTPClient/AsyncAwait/HTTPClient+execute.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,11 @@ extension HTTPClient {
7575
try redirectState.redirect(to: redirectURL.absoluteString)
7676
currentRedirectState = redirectState
7777

78-
let newRequest = preparedRequest.followingRedirect(to: redirectURL, status: response.status)
78+
let newRequest = currentRequest.followingRedirect(
79+
from: preparedRequest.url,
80+
to: redirectURL,
81+
status: response.status
82+
)
7983

8084
guard newRequest.body.canBeConsumedMultipleTimes else {
8185
// we already send the request body and it cannot be send again

Sources/AsyncHTTPClient/AsyncAwait/HTTPClientRequest+Prepared.swift

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,16 @@ extension RequestBodyLength {
7373
}
7474

7575
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
76-
extension HTTPClientRequest.Prepared {
77-
func followingRedirect(to redirectURL: URL, status: HTTPResponseStatus) -> HTTPClientRequest {
76+
extension HTTPClientRequest {
77+
func followingRedirect(
78+
from originalURL: URL,
79+
to redirectURL: URL,
80+
status: HTTPResponseStatus
81+
) -> HTTPClientRequest {
7882
let (method, headers, body) = transformRequestForRedirect(
79-
from: self.url,
80-
method: self.head.method,
81-
headers: self.head.headers,
83+
from: originalURL,
84+
method: self.method,
85+
headers: self.headers,
8286
body: self.body,
8387
to: redirectURL,
8488
status: status

Tests/AsyncHTTPClientTests/AsyncAwaitEndToEndTests+XCTest.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ extension AsyncAwaitEndToEndTests {
3939
("testDeadline", testDeadline),
4040
("testImmediateDeadline", testImmediateDeadline),
4141
("testInvalidURL", testInvalidURL),
42+
("testRedirectChangesHostHeader", testRedirectChangesHostHeader),
4243
]
4344
}
4445
}

Tests/AsyncHTTPClientTests/AsyncAwaitEndToEndTests.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,35 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
408408
}
409409
#endif
410410
}
411+
412+
func testRedirectChangesHostHeader() {
413+
#if compiler(>=5.5) && canImport(_Concurrency)
414+
guard #available(macOS 12.0, iOS 15.0, watchOS 8.0, tvOS 15.0, *) else { return }
415+
XCTAsyncTest {
416+
let bin = HTTPBin(.http2(compress: false))
417+
defer { XCTAssertNoThrow(try bin.shutdown()) }
418+
let client = makeDefaultHTTPClient()
419+
defer { XCTAssertNoThrow(try client.syncShutdown()) }
420+
let logger = Logger(label: "HTTPClient", factory: StreamLogHandler.standardOutput(label:))
421+
var request = HTTPClientRequest(url: "https://127.0.0.1:\(bin.port)/redirect/target")
422+
request.headers.replaceOrAdd(name: "X-Target-Redirect-URL", value: "https://localhost:\(bin.port)/echohostheader")
423+
424+
guard let response = await XCTAssertNoThrowWithResult(
425+
try await client.execute(request, deadline: .now() + .seconds(10), logger: logger)
426+
) else {
427+
return
428+
}
429+
guard let body = await XCTAssertNoThrowWithResult(try await response.body.collect()) else { return }
430+
var maybeRequestInfo: RequestInfo?
431+
XCTAssertNoThrow(maybeRequestInfo = try JSONDecoder().decode(RequestInfo.self, from: body))
432+
guard let requestInfo = maybeRequestInfo else { return }
433+
434+
XCTAssertEqual(response.status, .ok)
435+
XCTAssertEqual(response.version, .http2)
436+
XCTAssertEqual(requestInfo.data, "localhost:\(bin.port)")
437+
}
438+
#endif
439+
}
411440
}
412441

413442
#if compiler(>=5.5.2) && canImport(_Concurrency)

0 commit comments

Comments
 (0)