Skip to content

Commit 7aa80df

Browse files
authored
filter empty authorization tokens from headers (#6789)
motiavtion: do not send empty authorization headers, even if authorization provider returns empty strings changes: * do not send authorization header when the authroization provider returns an empty string * adjust tests radar/99133141
1 parent 6f0a64b commit 7aa80df

File tree

4 files changed

+76
-31
lines changed

4 files changed

+76
-31
lines changed

Sources/Basics/HTTPClient/HTTPClient.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ public actor HTTPClient {
8484
}
8585

8686
if let authorization = request.options.authorizationProvider?(request.url),
87+
!authorization.isEmpty,
8788
!request.headers.contains("Authorization")
8889
{
8990
request.headers.add(name: "Authorization", value: authorization)

Sources/Basics/HTTPClient/LegacyHTTPClient.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ public final class LegacyHTTPClient: Cancellable {
107107
}
108108

109109
if let authorization = request.options.authorizationProvider?(request.url),
110+
!authorization.isEmpty,
110111
!request.headers.contains("Authorization")
111112
{
112113
request.headers.add(name: "Authorization", value: authorization)

Tests/BasicsTests/HTTPClientTests.swift

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -173,21 +173,37 @@ final class HTTPClientTests: XCTestCase {
173173

174174
func testAuthorization() async throws {
175175
let url = URL("http://test")
176-
let authorization = UUID().uuidString
177176

178-
let httpClient = HTTPClient { request, _ in
179-
XCTAssertTrue(request.headers.contains("Authorization"), "expecting Authorization")
180-
XCTAssertEqual(request.headers.get("Authorization").first, authorization, "expecting Authorization to match")
181-
return .init(statusCode: 200)
182-
}
177+
do {
178+
let authorization = UUID().uuidString
183179

184-
var request = HTTPClient.Request(method: .get, url: url)
185-
request.options.authorizationProvider = { requestUrl in
186-
requestUrl == url ? authorization : nil
180+
let httpClient = HTTPClient { request, _ in
181+
XCTAssertTrue(request.headers.contains("Authorization"), "expecting Authorization")
182+
XCTAssertEqual(request.headers.get("Authorization").first, authorization, "expecting Authorization to match")
183+
return .init(statusCode: 200)
184+
}
185+
186+
var request = HTTPClient.Request(method: .get, url: url)
187+
request.options.authorizationProvider = { requestUrl in
188+
requestUrl == url ? authorization : nil
189+
}
190+
191+
let response = try await httpClient.execute(request)
192+
XCTAssertEqual(response.statusCode, 200, "statusCode should match")
187193
}
188194

189-
let response = try await httpClient.execute(request)
190-
XCTAssertEqual(response.statusCode, 200, "statusCode should match")
195+
do {
196+
let httpClient = HTTPClient { request, _ in
197+
XCTAssertFalse(request.headers.contains("Authorization"), "not expecting Authorization")
198+
return .init(statusCode: 200)
199+
}
200+
201+
var request = HTTPClient.Request(method: .get, url: url)
202+
request.options.authorizationProvider = { _ in "" }
203+
204+
let response = try await httpClient.execute(request)
205+
XCTAssertEqual(response.statusCode, 200, "statusCode should match")
206+
}
191207
}
192208

193209
func testValidResponseCodes() async throws {

Tests/BasicsTests/LegacyHTTPClientTests.swift

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -269,33 +269,60 @@ final class LegacyHTTPClientTests: XCTestCase {
269269

270270
func testAuthorization() {
271271
let url = URL("http://test")
272-
let authorization = UUID().uuidString
273272

274-
let handler: LegacyHTTPClient.Handler = { request, _, completion in
275-
XCTAssertTrue(request.headers.contains("Authorization"), "expecting Authorization")
276-
XCTAssertEqual(request.headers.get("Authorization").first, authorization, "expecting Authorization to match")
277-
completion(.success(LegacyHTTPClient.Response(statusCode: 200)))
278-
}
273+
do {
274+
let authorization = UUID().uuidString
279275

280-
let httpClient = LegacyHTTPClient(handler: handler)
281-
var request = LegacyHTTPClient.Request(method: .get, url: url)
276+
let handler: LegacyHTTPClient.Handler = { request, _, completion in
277+
XCTAssertTrue(request.headers.contains("Authorization"), "expecting Authorization")
278+
XCTAssertEqual(request.headers.get("Authorization").first, authorization, "expecting Authorization to match")
279+
completion(.success(LegacyHTTPClient.Response(statusCode: 200)))
280+
}
282281

283-
request.options.authorizationProvider = { requestUrl in
284-
requestUrl == url ? authorization : nil
285-
}
282+
let httpClient = LegacyHTTPClient(handler: handler)
283+
var request = LegacyHTTPClient.Request(method: .get, url: url)
286284

287-
let promise = XCTestExpectation(description: "completed")
288-
httpClient.execute(request) { result in
289-
switch result {
290-
case .failure(let error):
291-
XCTFail("unexpected error \(error)")
292-
case .success(let response):
293-
XCTAssertEqual(response.statusCode, 200, "statusCode should match")
285+
request.options.authorizationProvider = { requestUrl in
286+
requestUrl == url ? authorization : nil
294287
}
295-
promise.fulfill()
288+
289+
let promise = XCTestExpectation(description: "completed")
290+
httpClient.execute(request) { result in
291+
switch result {
292+
case .failure(let error):
293+
XCTFail("unexpected error \(error)")
294+
case .success(let response):
295+
XCTAssertEqual(response.statusCode, 200, "statusCode should match")
296+
}
297+
promise.fulfill()
298+
}
299+
300+
wait(for: [promise], timeout: 1)
296301
}
297302

298-
wait(for: [promise], timeout: 1)
303+
do {
304+
let handler: LegacyHTTPClient.Handler = { request, _, completion in
305+
XCTAssertFalse(request.headers.contains("Authorization"), "not expecting Authorization")
306+
completion(.success(LegacyHTTPClient.Response(statusCode: 200)))
307+
}
308+
309+
let httpClient = LegacyHTTPClient(handler: handler)
310+
var request = LegacyHTTPClient.Request(method: .get, url: url)
311+
request.options.authorizationProvider = { _ in "" }
312+
313+
let promise = XCTestExpectation(description: "completed")
314+
httpClient.execute(request) { result in
315+
switch result {
316+
case .failure(let error):
317+
XCTFail("unexpected error \(error)")
318+
case .success(let response):
319+
XCTAssertEqual(response.statusCode, 200, "statusCode should match")
320+
}
321+
promise.fulfill()
322+
}
323+
324+
wait(for: [promise], timeout: 1)
325+
}
299326
}
300327

301328
func testValidResponseCodes() {

0 commit comments

Comments
 (0)