Skip to content

Commit 93314b0

Browse files
alanjcharlesbsneed
andauthored
feat: add requestFactory to Configuration (#165)
* feat: add requestFactoryto Configuration * Some minor changes to ensure max flexibility. * Fixed linux import differences. Co-authored-by: Alan Charles <[email protected]> Co-authored-by: Brandon Sneed <[email protected]>
1 parent b1ed208 commit 93314b0

File tree

3 files changed

+55
-14
lines changed

3 files changed

+55
-14
lines changed

Sources/Segment/Configuration.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
//
77

88
import Foundation
9+
#if os(Linux)
10+
import FoundationNetworking
11+
#endif
912

1013
public typealias AdvertisingIdCallback = () -> String?
1114

@@ -30,8 +33,10 @@ public class Configuration {
3033
var autoAddSegmentDestination: Bool = true
3134
var apiHost: String = HTTPClient.getDefaultAPIHost()
3235
var cdnHost: String = HTTPClient.getDefaultCDNHost()
33-
var errorHandler: ((Error) -> Void)?
36+
var requestFactory: ((URLRequest) -> URLRequest)? = nil
37+
var errorHandler: ((Error) -> Void)? = nil
3438
}
39+
3540
internal var values: Values
3641

3742
public init(writeKey: String) {
@@ -97,6 +102,12 @@ public extension Configuration {
97102
return self
98103
}
99104

105+
@discardableResult
106+
func requestFactory(_ value: @escaping (URLRequest) -> URLRequest) -> Configuration {
107+
values.requestFactory = value
108+
return self
109+
}
110+
100111
@discardableResult
101112
func errorHandler(_ value: @escaping (Error) -> Void) -> Configuration {
102113
values.errorHandler = value

Sources/Segment/Utilities/HTTPClient.swift

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,9 @@ public class HTTPClient {
7070
completion(.failure(HTTPClientErrors.failedToOpenBatch))
7171
return nil
7272
}
73-
74-
var urlRequest = URLRequest(url: uploadURL)
75-
urlRequest.httpMethod = "POST"
76-
73+
74+
let urlRequest = configuredRequest(for: uploadURL, method: "POST")
75+
7776
let dataTask = session.uploadTask(with: urlRequest, fromFile: batch) { [weak self] (data, response, error) in
7877
if let error = error {
7978
self?.analytics?.log(message: "Error uploading request \(error.localizedDescription).")
@@ -106,9 +105,8 @@ public class HTTPClient {
106105
return
107106
}
108107

109-
var urlRequest = URLRequest(url: settingsURL)
110-
urlRequest.httpMethod = "GET"
111-
108+
let urlRequest = configuredRequest(for: settingsURL, method: "GET")
109+
112110
let dataTask = session.dataTask(with: urlRequest) { [weak self] (data, response, error) in
113111
if let error = error {
114112
self?.analytics?.reportInternalError(AnalyticsError.networkUnknown(error))
@@ -169,15 +167,24 @@ extension HTTPClient {
169167
return Self.defaultCDNHost
170168
}
171169

170+
internal func configuredRequest(for url: URL, method: String) -> URLRequest {
171+
var request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 60)
172+
request.httpMethod = method
173+
request.addValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
174+
request.addValue("Basic \(apiKey)", forHTTPHeaderField: "Authorization")
175+
request.addValue("analytics-ios/\(Analytics.version())", forHTTPHeaderField: "User-Agent")
176+
request.addValue("gzip", forHTTPHeaderField: "Accept-Encoding")
177+
178+
if let requestFactory = analytics?.configuration.values.requestFactory {
179+
request = requestFactory(request)
180+
}
181+
182+
return request
183+
}
184+
172185
internal static func configuredSession(for writeKey: String) -> URLSession {
173186
let configuration = URLSessionConfiguration.ephemeral
174-
configuration.allowsCellularAccess = true
175-
configuration.timeoutIntervalForResource = 30
176-
configuration.timeoutIntervalForRequest = 60
177187
configuration.httpMaximumConnectionsPerHost = 2
178-
configuration.httpAdditionalHeaders = ["Content-Type": "application/json; charset=utf-8",
179-
"Authorization": "Basic \(Self.authorizationHeaderForWriteKey(writeKey))",
180-
"User-Agent": "analytics-ios/\(Analytics.version())"]
181188
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: nil)
182189
return session
183190
}

Tests/Segment-Tests/Analytics_Tests.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,4 +531,27 @@ final class Analytics_Tests: XCTestCase {
531531
XCTAssertEqual(metadata?.bundled, ["Mixpanel"])
532532
XCTAssertEqual(metadata?.unbundled.sorted(), ["Amplitude", "Customer.io", "dest1"])
533533
}
534+
535+
func testRequestFactory() {
536+
let config = Configuration(writeKey: "test").requestFactory { request in
537+
XCTAssertEqual(request.value(forHTTPHeaderField: "Accept-Encoding"), "gzip")
538+
XCTAssertEqual(request.value(forHTTPHeaderField: "Content-Type"), "application/json; charset=utf-8")
539+
XCTAssertEqual(request.value(forHTTPHeaderField: "Authorization"), "Basic test")
540+
XCTAssertTrue(request.value(forHTTPHeaderField: "User-Agent")!.contains("analytics-ios/"))
541+
return request
542+
}.errorHandler { error in
543+
XCTFail("\(error)")
544+
}
545+
let analytics = Analytics(configuration: config)
546+
let outputReader = OutputReaderPlugin()
547+
analytics.add(plugin: outputReader)
548+
549+
waitUntilStarted(analytics: analytics)
550+
551+
analytics.track(name: "something")
552+
553+
analytics.flush()
554+
555+
RunLoop.main.run(until: Date(timeIntervalSinceNow: 5))
556+
}
534557
}

0 commit comments

Comments
 (0)