Skip to content

Commit 12513df

Browse files
committed
fix: share URLSessionConfiguration and fixes updatating the referer for api calls
- some changes to URLSessionConfiguration flags
1 parent 715cdf5 commit 12513df

6 files changed

Lines changed: 71 additions & 57 deletions

File tree

CommonsAPI/Sources/CommonsAPI/API.swift

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,29 @@ public actor API {
2828
let createAccountRedirectURL = URL(string: "https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Main_Page&welcome=yes")!
2929

3030
private(set) var userAgent: String
31-
var referer: String
32-
31+
private(set) var referer: String
3332
#if DEBUG
34-
let urlSession = URLSessionProxy(configuration: URLSessionConfiguration.default)
33+
let urlSession: URLSessionProxy
3534
#else
36-
let urlSession = URLSession(configuration: URLSessionConfiguration.default)
35+
let urlSession: URLSession
3736
#endif
38-
37+
3938
private lazy var jsonDecoder: JSONDecoder = {
4039
let decoder = JSONDecoder()
4140
decoder.dateDecodingStrategy = .iso8601
4241
return decoder
4342
}()
4443

4544

46-
public init(userAgent: String, referer: String) {
45+
public init(config: URLSessionConfiguration, userAgent: String, referer: String) {
4746
self.userAgent = userAgent
4847
self.referer = referer
48+
#if DEBUG
49+
urlSession = URLSessionProxy(configuration: config)
50+
#else
51+
urlSession = URLSession(configuration: config)
52+
#endif
53+
4954

5055
// Un-Comment the following code block to test EmailAuth via email-code (https://www.mediawiki.org/wiki/Help:Extension:EmailAuth)
5156
//#if DEBUG
@@ -76,7 +81,11 @@ public actor API {
7681

7782
// var eventMonitors: [any EventMonitor] = [AlamofireNotifications()]
7883

79-
}
84+
}
85+
86+
public func setReferer(_ newReferer: String) {
87+
referer = newReferer
88+
}
8089

8190
private func parse<T: Decodable>(_ type: T.Type, from data: Data, response: URLResponse) throws -> T {
8291
guard let http = response as? HTTPURLResponse else {
@@ -175,9 +184,7 @@ public actor API {
175184
"password": password,
176185
"rememberMe": "1"
177186
]
178-
var request = try POST(url: commonsEndpoint, form: form)
179-
// Optional: Referer can help in some CSRF contexts; generally not required for clientlogin.
180-
request.setValue("https://commons.wikimedia.org/wiki/Special:UserLogin", forHTTPHeaderField: "Referer")
187+
let request = try POST(url: commonsEndpoint, form: form)
181188

182189
let (data, response) = try await urlSession.data(for: request)
183190
let wrapped = try parse(LoginResponseWrapped.self, from: data, response: response)
@@ -205,8 +212,7 @@ public actor API {
205212
"captchaId": captchaID,
206213
"email": email
207214
]
208-
var request = try POST(url: commonsEndpoint, form: form)
209-
request.setValue("https://commons.wikimedia.org/wiki/Special:CreateAccount", forHTTPHeaderField: "Referer")
215+
let request = try POST(url: commonsEndpoint, form: form)
210216

211217
let (data, response) = try await urlSession.data(for: request)
212218
let wrapped = try parse(CreateAccountResponseWrapped.self, from: data, response: response)
@@ -237,8 +243,7 @@ public actor API {
237243
"token": emailCode,
238244
"logincontinue": "1"
239245
]
240-
var request = try POST(url: commonsEndpoint, form: form)
241-
request.setValue("https://commons.wikimedia.org/wiki/Special:UserLogin", forHTTPHeaderField: "Referer")
246+
let request = try POST(url: commonsEndpoint, form: form)
242247

243248
let (data, response) = try await urlSession.data(for: request)
244249
let wrapped = try parse(LoginResponseWrapped.self, from: data, response: response)
@@ -258,8 +263,7 @@ public actor API {
258263
"OATHToken": twoFactorCode,
259264
"logincontinue": "1"
260265
]
261-
var request = try POST(url: commonsEndpoint, form: form)
262-
request.setValue("https://commons.wikimedia.org/wiki/Special:UserLogin", forHTTPHeaderField: "Referer")
266+
let request = try POST(url: commonsEndpoint, form: form)
263267

264268
let (data, response) = try await urlSession.data(for: request)
265269
let wrapped = try parse(LoginResponseWrapped.self, from: data, response: response)

CommonsFinder.xcodeproj/project.pbxproj

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
E2035C452D52544D0079235B /* CommonsAPI in Frameworks */ = {isa = PBXBuildFile; productRef = E2035C442D52544D0079235B /* CommonsAPI */; };
1111
E206777A2EBE52FF00981A79 /* H3kit in Frameworks */ = {isa = PBXBuildFile; productRef = E20677792EBE52FF00981A79 /* H3kit */; };
1212
E213C6B92EA29F570085C60E /* SwiftSoup in Frameworks */ = {isa = PBXBuildFile; productRef = E213C6B82EA29F570085C60E /* SwiftSoup */; };
13-
E22A913C2CF8B1AA00D3B8F9 /* Nuke in Frameworks */ = {isa = PBXBuildFile; productRef = E22A913B2CF8B1AA00D3B8F9 /* Nuke */; };
14-
E22A913E2CF8B1AA00D3B8F9 /* NukeUI in Frameworks */ = {isa = PBXBuildFile; productRef = E22A913D2CF8B1AA00D3B8F9 /* NukeUI */; };
1513
E2390F962EBCC64C0013F0FC /* ObservableLRUCache in Frameworks */ = {isa = PBXBuildFile; productRef = E2390F952EBCC64C0013F0FC /* ObservableLRUCache */; };
1614
E2390F982EBCC7250013F0FC /* ObservableLRUCache in Frameworks */ = {isa = PBXBuildFile; productRef = E2390F972EBCC7250013F0FC /* ObservableLRUCache */; };
1715
E24D3BFD2CF3ACDC003484CC /* FrameUp in Frameworks */ = {isa = PBXBuildFile; productRef = E24D3BFC2CF3ACDC003484CC /* FrameUp */; };
@@ -33,6 +31,8 @@
3331
E2E2BFD52D8718AE00751949 /* Algorithms in Frameworks */ = {isa = PBXBuildFile; productRef = E2E2BFD42D8718AE00751949 /* Algorithms */; };
3432
E2F19BC62CA43C6400E19DCD /* SwiftSecurity in Frameworks */ = {isa = PBXBuildFile; productRef = E2F19BC52CA43C6400E19DCD /* SwiftSecurity */; };
3533
E2F1B9D52CD006C700410991 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = E2F1B9D42CD006C700410991 /* GRDB */; };
34+
E2F400592F3A46CE00792DEE /* Nuke in Frameworks */ = {isa = PBXBuildFile; productRef = E2F400582F3A46CE00792DEE /* Nuke */; };
35+
E2F4005B2F3A46CE00792DEE /* NukeUI in Frameworks */ = {isa = PBXBuildFile; productRef = E2F4005A2F3A46CE00792DEE /* NukeUI */; };
3636
E2FF0A2E2D9EAA29008F915C /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = E25278722CB03FAF00D00640 /* GRDB */; };
3737
E2FF0A2F2D9EAA29008F915C /* GRDBQuery in Frameworks */ = {isa = PBXBuildFile; productRef = E25278752CB03FBB00D00640 /* GRDBQuery */; };
3838
/* End PBXBuildFile section */
@@ -378,12 +378,12 @@
378378
E2390F962EBCC64C0013F0FC /* ObservableLRUCache in Frameworks */,
379379
E26D503C2DA5A75F00621D1C /* CommonsAPI in Frameworks */,
380380
E2549B262CBD68B9005DFE14 /* Algorithms in Frameworks */,
381-
E22A913E2CF8B1AA00D3B8F9 /* NukeUI in Frameworks */,
382381
E290323F2D9EA84700A0CD8F /* GRDBQuery in Frameworks */,
383-
E22A913C2CF8B1AA00D3B8F9 /* Nuke in Frameworks */,
384382
E206777A2EBE52FF00981A79 /* H3kit in Frameworks */,
385383
E2F19BC62CA43C6400E19DCD /* SwiftSecurity in Frameworks */,
384+
E2F4005B2F3A46CE00792DEE /* NukeUI in Frameworks */,
386385
E257E6BF2D2038F90049FFE8 /* Lock in Frameworks */,
386+
E2F400592F3A46CE00792DEE /* Nuke in Frameworks */,
387387
E2C92DD32ED60D4000EAA248 /* ObservableLRUCache in Frameworks */,
388388
E28B17662CB03CBB00D6FEA0 /* GRDBQuery in Frameworks */,
389389
E24D3BFD2CF3ACDC003484CC /* FrameUp in Frameworks */,
@@ -497,8 +497,6 @@
497497
E2549B2C2CBD69C7005DFE14 /* OrderedCollections */,
498498
E2F1B9D42CD006C700410991 /* GRDB */,
499499
E24D3BFC2CF3ACDC003484CC /* FrameUp */,
500-
E22A913B2CF8B1AA00D3B8F9 /* Nuke */,
501-
E22A913D2CF8B1AA00D3B8F9 /* NukeUI */,
502500
E257E6BE2D2038F90049FFE8 /* Lock */,
503501
E20A8A5D2D75F1D200EA79C5 /* H3kit */,
504502
E29032392D9EA52000A0CD8F /* Pulse */,
@@ -511,6 +509,8 @@
511509
E20677792EBE52FF00981A79 /* H3kit */,
512510
E2D8C6692ECF5B8200CEBB37 /* GEOSwiftMapKit */,
513511
E2C92DD22ED60D4000EAA248 /* ObservableLRUCache */,
512+
E2F400582F3A46CE00792DEE /* Nuke */,
513+
E2F4005A2F3A46CE00792DEE /* NukeUI */,
514514
);
515515
productName = CommonsFinder;
516516
productReference = E2839FE72CA2DD900053C312 /* CommonsFinder.app */;
@@ -577,7 +577,6 @@
577577
E2549B272CBD69C7005DFE14 /* XCRemoteSwiftPackageReference "swift-collections" */,
578578
E2F1B9D32CD006C700410991 /* XCRemoteSwiftPackageReference "GRDB.swift" */,
579579
E24D3BFB2CF3ACDC003484CC /* XCRemoteSwiftPackageReference "FrameUp" */,
580-
E22A913A2CF8B1AA00D3B8F9 /* XCRemoteSwiftPackageReference "Nuke" */,
581580
E257E6BD2D2038F90049FFE8 /* XCRemoteSwiftPackageReference "Lock" */,
582581
E29032382D9EA52000A0CD8F /* XCRemoteSwiftPackageReference "Pulse" */,
583582
E290323D2D9EA84700A0CD8F /* XCRemoteSwiftPackageReference "GRDBQuery" */,
@@ -586,6 +585,7 @@
586585
E20677782EBE52FF00981A79 /* XCRemoteSwiftPackageReference "h3kit-ios" */,
587586
E2D8C6682ECF5B8200CEBB37 /* XCRemoteSwiftPackageReference "GEOSwiftMapKit" */,
588587
E2C92DD12ED60D4000EAA248 /* XCRemoteSwiftPackageReference "ObservableLRUCache" */,
588+
E2F400572F3A46CE00792DEE /* XCRemoteSwiftPackageReference "Nuke" */,
589589
);
590590
preferredProjectObjectVersion = 77;
591591
productRefGroup = E2839FE82CA2DD900053C312 /* Products */;
@@ -1089,14 +1089,6 @@
10891089
minimumVersion = 2.11.1;
10901090
};
10911091
};
1092-
E22A913A2CF8B1AA00D3B8F9 /* XCRemoteSwiftPackageReference "Nuke" */ = {
1093-
isa = XCRemoteSwiftPackageReference;
1094-
repositoryURL = "https://github.com/kean/Nuke";
1095-
requirement = {
1096-
kind = exactVersion;
1097-
version = 12.8.0;
1098-
};
1099-
};
11001092
E24D3BFB2CF3ACDC003484CC /* XCRemoteSwiftPackageReference "FrameUp" */ = {
11011093
isa = XCRemoteSwiftPackageReference;
11021094
repositoryURL = "https://github.com/ryanlintott/FrameUp";
@@ -1185,6 +1177,14 @@
11851177
version = 7.9.0;
11861178
};
11871179
};
1180+
E2F400572F3A46CE00792DEE /* XCRemoteSwiftPackageReference "Nuke" */ = {
1181+
isa = XCRemoteSwiftPackageReference;
1182+
repositoryURL = "https://github.com/kean/Nuke";
1183+
requirement = {
1184+
kind = upToNextMajorVersion;
1185+
minimumVersion = 12.8.0;
1186+
};
1187+
};
11881188
/* End XCRemoteSwiftPackageReference section */
11891189

11901190
/* Begin XCSwiftPackageProductDependency section */
@@ -1206,16 +1206,6 @@
12061206
package = E213C6B72EA29F570085C60E /* XCRemoteSwiftPackageReference "SwiftSoup" */;
12071207
productName = SwiftSoup;
12081208
};
1209-
E22A913B2CF8B1AA00D3B8F9 /* Nuke */ = {
1210-
isa = XCSwiftPackageProductDependency;
1211-
package = E22A913A2CF8B1AA00D3B8F9 /* XCRemoteSwiftPackageReference "Nuke" */;
1212-
productName = Nuke;
1213-
};
1214-
E22A913D2CF8B1AA00D3B8F9 /* NukeUI */ = {
1215-
isa = XCSwiftPackageProductDependency;
1216-
package = E22A913A2CF8B1AA00D3B8F9 /* XCRemoteSwiftPackageReference "Nuke" */;
1217-
productName = NukeUI;
1218-
};
12191209
E2390F952EBCC64C0013F0FC /* ObservableLRUCache */ = {
12201210
isa = XCSwiftPackageProductDependency;
12211211
productName = ObservableLRUCache;
@@ -1305,6 +1295,16 @@
13051295
package = E2F1B9D32CD006C700410991 /* XCRemoteSwiftPackageReference "GRDB.swift" */;
13061296
productName = GRDB;
13071297
};
1298+
E2F400582F3A46CE00792DEE /* Nuke */ = {
1299+
isa = XCSwiftPackageProductDependency;
1300+
package = E2F400572F3A46CE00792DEE /* XCRemoteSwiftPackageReference "Nuke" */;
1301+
productName = Nuke;
1302+
};
1303+
E2F4005A2F3A46CE00792DEE /* NukeUI */ = {
1304+
isa = XCSwiftPackageProductDependency;
1305+
package = E2F400572F3A46CE00792DEE /* XCRemoteSwiftPackageReference "Nuke" */;
1306+
productName = NukeUI;
1307+
};
13081308
/* End XCSwiftPackageProductDependency section */
13091309
};
13101310
rootObject = E2839FDF2CA2DD900053C312 /* Project object */;

CommonsFinder.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CommonsFinder/CommonsFinderApp.swift

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,7 @@ private func configureNukeAndPulse() {
127127
DataLoader.sharedUrlCache.memoryCapacity = 0
128128

129129
var pipelineConfig = ImagePipeline.Configuration()
130-
let urlSessionConfig = URLSessionConfiguration.default
131-
132-
urlSessionConfig.httpAdditionalHeaders = [
133-
"User-Agent": Networking.shared.userAgent,
134-
"Referer": Networking.shared.referer,
135-
]
136-
137-
let dataLoader = DataLoader(configuration: urlSessionConfig)
130+
let dataLoader = DataLoader(configuration: Networking.shared.config)
138131

139132
/// TESTING NOTE: If tests fail in Pulse package, comment out the following block and try again.
140133
#if DEBUG

CommonsFinder/Observable Models/Navigation.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ import os.log
6565

6666
private func updateReferer() {
6767
if let currentPath = currentPath.last {
68-
Networking.shared.referer = "CommonsFinder://\(currentPath.refererPath)"
68+
Networking.shared.setReferer("CommonsFinder://\(currentPath.refererPath)")
6969
} else {
70-
Networking.shared.referer = "CommonsFinder://\(selectedTab.refererPath)"
70+
Networking.shared.setReferer("CommonsFinder://\(selectedTab.refererPath)")
7171
}
7272
logger.debug("Referer: \(Networking.shared.referer)")
7373
}

CommonsFinder/Utilities/Networking.swift

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,45 @@
88
import CommonsAPI
99
import Foundation
1010

11-
struct Networking {
11+
final class Networking {
1212
static var shared: Networking = .init()
1313

14-
var referer: String
14+
private(set) var referer: String
1515
let userAgent: String
1616
let uploadComment: String
17+
let config: URLSessionConfiguration
1718
let api: API
1819

1920
init() {
2021
self.referer = "CommonsFinder://Home"
2122

2223
let info = Bundle.main.infoDictionary
2324
let executable = (info?["CFBundleExecutable"] as? String) ?? (ProcessInfo.processInfo.arguments.first?.split(separator: "/").last.map(String.init)) ?? "Unknown"
24-
let bundle = info?["CFBundleIdentifier"] as? String ?? "Unknown"
25-
let appVersion = info?["CFBundleShortVersionString"] as? String ?? "Unknown"
25+
// let bundle = info?["CFBundleIdentifier"] as? String ?? "Unknown"
26+
// let appVersion = info?["CFBundleShortVersionString"] as? String ?? "Unknown"
2627
let appBuild = info?["CFBundleVersion"] as? String ?? "Unknown"
2728

2829
let contactInfo = "https://github.com/nylki/CommonsFinder"
2930

3031
userAgent = "\(executable)/\(appBuild) (\(contactInfo)) \(osNameVersion)"
3132
uploadComment = "uploaded from \(executable)/\(appBuild) \(osNameVersion)"
32-
api = API(userAgent: userAgent, referer: referer)
33+
let urlSessionConfig = URLSessionConfiguration.default
34+
urlSessionConfig.httpShouldSetCookies = true
35+
urlSessionConfig.httpCookieAcceptPolicy = .always
36+
urlSessionConfig.httpAdditionalHeaders = [
37+
"User-Agent": userAgent,
38+
// NOTE: this is just the initial referer, will be updated via setReferer().
39+
"Referer": referer,
40+
]
41+
config = urlSessionConfig
42+
api = API(config: urlSessionConfig, userAgent: userAgent, referer: referer)
43+
}
44+
45+
func setReferer(_ newReferer: String) {
46+
referer = newReferer
47+
Task<Void, Never> {
48+
await api.setReferer(newReferer)
49+
}
3350
}
3451

3552
// Preferred format for User-Agent headers for wikimedia prohects (see: https://www.mediawiki.org/wiki/API:Etiquette#The_User-Agent_header)

0 commit comments

Comments
 (0)