Skip to content

Commit e7a0f90

Browse files
committed
Testing refactor; add tests to ensure percent-encoded URLs (those with reserved characters) are processed correctly
1 parent 3e8fcb3 commit e7a0f90

File tree

2 files changed

+58
-16
lines changed

2 files changed

+58
-16
lines changed

BunnyNetMiddleware/BunnyNetMiddleware.swift

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,29 @@ func generateToken(key: String, path: String, expires: Int, filteredIP: String =
4747
.replacingOccurrences(of: "+", with: "-")
4848
.replacingOccurrences(of: "/", with: "_")
4949
.replacingOccurrences(of: "=", with: "")
50+
print("'\(path)' generates '\(tokenFormatted)'")
5051
return tokenFormatted
5152
}
5253

54+
/// Generates a bunny.net URL
55+
func generateBunnyNetURL(url: String, key: String, expires: Int) -> String? {
56+
guard var components = URLComponents(string: url) else {
57+
print("ERROR: Can't parse \(url) as a valid URL")
58+
return nil
59+
}
60+
let token = generateToken(key: key, path: components.path, expires: expires)
61+
let queryItems: [URLQueryItem] = [
62+
URLQueryItem(name: "token", value: token),
63+
URLQueryItem(name: "expires", value: String(expires)),
64+
]
65+
components.queryItems = queryItems
66+
guard let modifiedURL = components.string else {
67+
print("ERROR: Can't construct modified URL")
68+
return nil
69+
}
70+
return modifiedURL
71+
}
72+
5373
class BunnyNetMiddleware: MunkiMiddleware {
5474
/// process the request
5575
func processRequest(_ request: MunkiMiddlewareRequest) -> MunkiMiddlewareRequest {
@@ -58,23 +78,14 @@ class BunnyNetMiddleware: MunkiMiddleware {
5878
print("ERROR: BunnyNetKey preference not set")
5979
return request
6080
}
61-
guard var components = URLComponents(string: request.url) else {
62-
print("ERROR: Can't parse \(request.url) as a valid URL")
63-
return request
64-
}
6581
let expires = Int(Date().timeIntervalSince1970 + 3600)
66-
let token = generateToken(
82+
guard let modifiedURL = generateBunnyNetURL(
83+
url: request.url,
6784
key: securityKey,
68-
path: components.path,
6985
expires: expires
70-
)
71-
let queryItems: [URLQueryItem] = [
72-
URLQueryItem(name: "token", value: token),
73-
URLQueryItem(name: "expires", value: String(expires)),
74-
]
75-
components.queryItems = queryItems
76-
guard let modifiedURL = components.string else {
77-
print("ERROR: Can't construct modified URL")
86+
) else {
87+
// error message was printed by generateBunnyNetURL
88+
// return unmodifed request
7889
return request
7990
}
8091
var modifiedRequest = request

BunnyNetMiddlewareTests/BunnyNetMiddlewareTests.swift

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,46 @@ import Testing
1010
struct BunnyNetMiddlewareTests {
1111
/// This simply tests that the generateToken function produces the same output
1212
/// as the Python version
13-
@Test func generateTokenGeneratesExpected() {
13+
@Test func generateTokenWithNoPercentEncodingInPathGeneratesExpected() {
1414
let token = generateToken(
1515
key: "FOOBARBAZ",
1616
path: "/someinstaller.dmg",
1717
expires: 1_747_270_308
1818
)
1919
#expect(token == "CNje5yxtqEdjkrN4RvhSlg")
2020
}
21-
21+
22+
@Test func generateTokenWithPercentEncodedPathGeneratesExpected() {
23+
let token = generateToken(
24+
key: "FOOBARBAZ",
25+
path: "/some%20installer.dmg",
26+
expires: 1_747_270_308
27+
)
28+
#expect(token == "IGdIFRU7caWJqfLIRmbwxw")
29+
}
30+
31+
@Test func urlWithNoPercentEncodingGeneratesExpectedBunnyNetURL() {
32+
let testURL = "https://test.b-cdn.net/someinstaller.dmg"
33+
let expectedURL = "https://test.b-cdn.net/someinstaller.dmg?token=CNje5yxtqEdjkrN4RvhSlg&expires=1747270308"
34+
let modifiedURL = generateBunnyNetURL(
35+
url: testURL,
36+
key: "FOOBARBAZ",
37+
expires: 1_747_270_308
38+
)
39+
#expect(modifiedURL == expectedURL)
40+
}
41+
42+
@Test func urlWithPercentEncodingGeneratesExpectedBunnyNetURL2() {
43+
let testURL = "https://test.b-cdn.net/some%20installer.dmg"
44+
let expectedURL = "https://test.b-cdn.net/some%20installer.dmg?token=krv82IZ0s4Nhg2zfVtRlfA&expires=1747270308"
45+
let modifiedURL = generateBunnyNetURL(
46+
url: testURL,
47+
key: "FOOBARBAZ",
48+
expires: 1_747_270_308
49+
)
50+
#expect(modifiedURL == expectedURL)
51+
}
52+
2253
/// Test that a non-BunnyNet request is returned unmodified
2354
@Test func nonBunnyNetRequestShouldNotBeModified() async throws {
2455
let request = MunkiMiddlewareRequest(

0 commit comments

Comments
 (0)