Skip to content

Commit 0189c48

Browse files
committed
Adjust httpAuthorizationHeader to accomodate token authentication
1 parent d5a6d68 commit 0189c48

File tree

2 files changed

+42
-14
lines changed

2 files changed

+42
-14
lines changed

Sources/Basics/AuthorizationProvider.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,20 @@ public protocol AuthorizationProvider {
1313
}
1414

1515
extension AuthorizationProvider {
16+
/// Returns an `Authorization` HTTP header for a given URL
17+
/// using the user and password provided by `authentication(for:)`.
18+
///
19+
/// Returns `nil` if no authentication information exists for the specified URL.
20+
/// Returns a Basic access authentication string if a `user` and `password` is provided
21+
/// or a token authentication string is the `user` is empty.
1622
public func httpAuthorizationHeader(for url: URL) -> String? {
17-
guard let (user, password) = self.authentication(for: url) else {
18-
return nil
19-
}
20-
let authString = "\(user):\(password)"
21-
guard let authData = authString.data(using: .utf8) else {
22-
return nil
23+
guard case let (user, password)? = authentication(for: url) else { return nil }
24+
25+
if user.isEmpty {
26+
return "Token \(password)"
27+
} else {
28+
guard let data = "\(user):\(password)".data(using: .utf8) else { return nil }
29+
return "Basic \(data.base64EncodedString())"
2330
}
24-
return "Basic \(authData.base64EncodedString())"
2531
}
2632
}

Tests/BasicsTests/AuthorizationProviderTests.swift

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,45 @@ import TSCBasic
1313
import XCTest
1414

1515
final class AuthorizationProviderTests: XCTestCase {
16-
func testBasicAPIs() {
17-
struct TestProvider: AuthorizationProvider {
18-
let map: [URL: (user: String, password: String)]
16+
private struct MockProvider: AuthorizationProvider {
17+
let map: [URL: (user: String, password: String)]
1918

20-
func authentication(for url: URL) -> (user: String, password: String)? {
21-
return self.map[url]
22-
}
19+
func authentication(for url: URL) -> (user: String, password: String)? {
20+
return self.map[url]
2321
}
22+
}
2423

24+
func testBasicAuthentication() {
2525
let url = URL(string: "http://\(UUID().uuidString)")!
2626
let user = UUID().uuidString
2727
let password = UUID().uuidString
28-
let provider = TestProvider(map: [url: (user: user, password: password)])
28+
let provider = MockProvider(map: [url: (user: user, password: password)])
2929

3030
let auth = provider.authentication(for: url)
3131
XCTAssertEqual(auth?.user, user)
3232
XCTAssertEqual(auth?.password, password)
3333
XCTAssertEqual(provider.httpAuthorizationHeader(for: url), "Basic " + "\(user):\(password)".data(using: .utf8)!.base64EncodedString())
3434
}
35+
36+
func testTokenAuthentication() {
37+
let url = URL(string: "http://\(UUID().uuidString)")!
38+
let user = ""
39+
let password = UUID().uuidString
40+
let provider = MockProvider(map: [url: (user: user, password: password)])
41+
42+
let auth = provider.authentication(for: url)
43+
XCTAssertEqual(auth?.user, user)
44+
XCTAssertEqual(auth?.password, password)
45+
XCTAssertEqual(provider.httpAuthorizationHeader(for: url), "Token \(password)")
46+
}
47+
48+
func testMissingAuthentication() {
49+
let url = URL(string: "http://\(UUID().uuidString)")!
50+
let provider = MockProvider(map: [:])
51+
52+
let auth = provider.authentication(for: url)
53+
XCTAssertEqual(auth?.user, nil)
54+
XCTAssertEqual(auth?.password, nil)
55+
XCTAssertEqual(provider.httpAuthorizationHeader(for: url), nil)
56+
}
3557
}

0 commit comments

Comments
 (0)