Skip to content

Commit 7954cc6

Browse files
authored
Add configuration for URLSessionConfiguration. (#27)
1 parent 07b2832 commit 7954cc6

File tree

3 files changed

+55
-6
lines changed

3 files changed

+55
-6
lines changed

Source/LDSwiftEventSource.swift

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,32 @@ public class EventSource {
6767
/// The maximum amount of time between receiving any data before considering the connection to have timed out.
6868
public var idleTimeout: TimeInterval = 300.0
6969

70+
private var _urlSessionConfiguration: URLSessionConfiguration = URLSessionConfiguration.default
71+
/**
72+
The `URLSessionConfiguration` used to create the `URLSession`.
73+
74+
- Important:
75+
Note that this copies the given `URLSessionConfiguration` when set, and returns copies (updated with any
76+
overrides specified by other configuration options) when the value is retrieved. This prevents updating the
77+
`URLSessionConfiguration` after initializing `EventSource` with the `Config`, and prevents the `EventSource`
78+
from updating any properties of the given `URLSessionConfiguration`.
79+
80+
- Since: 1.3.0
81+
*/
82+
public var urlSessionConfiguration: URLSessionConfiguration {
83+
get {
84+
// swiftlint:disable:next force_cast
85+
let sessionConfig = _urlSessionConfiguration.copy() as! URLSessionConfiguration
86+
sessionConfig.httpAdditionalHeaders = ["Accept": "text/event-stream", "Cache-Control": "no-cache"]
87+
sessionConfig.timeoutIntervalForRequest = idleTimeout
88+
return sessionConfig
89+
}
90+
set {
91+
// swiftlint:disable:next force_cast
92+
_urlSessionConfiguration = newValue.copy() as! URLSessionConfiguration
93+
}
94+
}
95+
7096
/**
7197
An error handler that is called when an error occurs and can shut down the client in response.
7298

@@ -136,10 +162,7 @@ class EventSourceDelegate: NSObject, URLSessionDataDelegate {
136162
func getLastEventId() -> String? { lastEventId }
137163

138164
func createSession() -> URLSession {
139-
let sessionConfig = URLSessionConfiguration.default
140-
sessionConfig.httpAdditionalHeaders = ["Accept": "text/event-stream", "Cache-Control": "no-cache"]
141-
sessionConfig.timeoutIntervalForRequest = self.config.idleTimeout
142-
return URLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)
165+
URLSession(configuration: config.urlSessionConfiguration, delegate: self, delegateQueue: nil)
143166
}
144167

145168
func createRequest() -> URLRequest {
@@ -148,7 +171,7 @@ class EventSourceDelegate: NSObject, URLSessionDataDelegate {
148171
timeoutInterval: self.config.idleTimeout)
149172
urlRequest.httpMethod = self.config.method
150173
urlRequest.httpBody = self.config.body
151-
urlRequest.setValue(self.lastEventId, forHTTPHeaderField: "Last-Event-ID")
174+
urlRequest.setValue(self.lastEventId, forHTTPHeaderField: "Last-Event-Id")
152175
urlRequest.allHTTPHeaderFields = self.config.headerTransform(
153176
urlRequest.allHTTPHeaderFields?.merging(self.config.headers) { $1 } ?? self.config.headers
154177
)

Tests/LDSwiftEventSourceTests.swift

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,27 @@ final class LDSwiftEventSourceTests: XCTestCase {
4949
XCTAssertEqual(config.connectionErrorHandler(DummyError()), .shutdown)
5050
}
5151

52+
func testConfigUrlSession() {
53+
var config = EventSource.Config(handler: MockHandler(), url: URL(string: "abc")!)
54+
let defaultSessionConfig = config.urlSessionConfiguration
55+
XCTAssertEqual(defaultSessionConfig.timeoutIntervalForRequest, 300.0)
56+
XCTAssertEqual(defaultSessionConfig.httpAdditionalHeaders?["Accept"] as? String, "text/event-stream")
57+
XCTAssertEqual(defaultSessionConfig.httpAdditionalHeaders?["Cache-Control"] as? String, "no-cache")
58+
// Configuration should return a fresh session configuration each retrieval
59+
XCTAssertTrue(defaultSessionConfig !== config.urlSessionConfiguration)
60+
// Updating idleTimeout should effect session config
61+
config.idleTimeout = 600.0
62+
XCTAssertEqual(config.urlSessionConfiguration.timeoutIntervalForRequest, 600.0)
63+
XCTAssertEqual(defaultSessionConfig.timeoutIntervalForRequest, 300.0)
64+
// Updating returned urlSessionConfiguration without setting should not update the Config until set
65+
let sessionConfig = config.urlSessionConfiguration
66+
sessionConfig.allowsCellularAccess = false
67+
XCTAssertTrue(config.urlSessionConfiguration.allowsCellularAccess)
68+
config.urlSessionConfiguration = sessionConfig
69+
XCTAssertFalse(config.urlSessionConfiguration.allowsCellularAccess)
70+
XCTAssertTrue(sessionConfig !== config.urlSessionConfiguration)
71+
}
72+
5273
func testLastEventIdFromConfig() {
5374
var config = EventSource.Config(handler: MockHandler(), url: URL(string: "abc")!)
5475
var es = EventSource(config: config)
@@ -86,7 +107,7 @@ final class LDSwiftEventSourceTests: XCTestCase {
86107
config.headers = testHeaders
87108
config.idleTimeout = 180.0
88109
config.headerTransform = { provided in
89-
XCTAssertEqual(provided, ["removing": "a", "updating": "b", "Last-Event-ID": "eventId"])
110+
XCTAssertEqual(provided, ["removing": "a", "updating": "b", "Last-Event-Id": "eventId"])
90111
return overrideHeaders
91112
}
92113
request = EventSourceDelegate(config: config).createRequest()

Tests/XCTestManifests.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ extension LDSwiftEventSourceTests {
3434
static let __allTests__LDSwiftEventSourceTests = [
3535
("testConfigDefaults", testConfigDefaults),
3636
("testConfigModification", testConfigModification),
37+
("testConfigUrlSession", testConfigUrlSession),
38+
("testCreatedSession", testCreatedSession),
39+
("testCreateRequest", testCreateRequest),
40+
("testDispatchError", testDispatchError),
41+
("testLastEventIdFromConfig", testLastEventIdFromConfig),
3742
]
3843
}
3944

0 commit comments

Comments
 (0)