Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove URL defaults #485

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,5 @@ Carthage/
## Swift Package Manager
.build/
Split.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/
release_type
release_type
.swiftpm/
6 changes: 5 additions & 1 deletion Split.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 52;
objectVersion = 54;
objects = {

/* Begin PBXBuildFile section */
Expand Down Expand Up @@ -1242,6 +1242,7 @@
95F3F07325ACE53600084AF8 /* HttpMySegmentsFetcherStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F3F07225ACE53600084AF8 /* HttpMySegmentsFetcherStub.swift */; };
95F3F09525AE1F3800084AF8 /* ServiceConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F3F09425AE1F3700084AF8 /* ServiceConstants.swift */; };
95F8F06828170473009E09B1 /* multi_client_test.json in Resources */ = {isa = PBXBuildFile; fileRef = 95F8F06728170473009E09B1 /* multi_client_test.json */; };
C5B748CC2B337EEA00DEDEEB /* InvalidServiceEndpointTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5B748CB2B337EEA00DEDEEB /* InvalidServiceEndpointTest.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -1968,6 +1969,7 @@
95F3F09425AE1F3700084AF8 /* ServiceConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceConstants.swift; sourceTree = "<group>"; };
95F3F45F29842EE6005A4844 /* modules.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = modules.modulemap; sourceTree = "<group>"; };
95F8F06728170473009E09B1 /* multi_client_test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = multi_client_test.json; sourceTree = "<group>"; };
C5B748CB2B337EEA00DEDEEB /* InvalidServiceEndpointTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvalidServiceEndpointTest.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -3121,6 +3123,7 @@
95737E0D2AD474A9007FD15C /* FlagSetsIntegrationTest.swift */,
596A7B722358E142004F6139 /* SplitSdkTimeoutTest.swift */,
596A7B70235729B5004F6139 /* DestroyTest.swift */,
C5B748CB2B337EEA00DEDEEB /* InvalidServiceEndpointTest.swift */,
);
path = Api;
sourceTree = "<group>";
Expand Down Expand Up @@ -4066,6 +4069,7 @@
59C492FB216695D500F5F774 /* Murmur3HashingTest.swift in Sources */,
59B2043B24F568660092F2E9 /* SynchronizerStub.swift in Sources */,
95F3EFEC258D26ED00084AF8 /* RecorderFlusherCheckerTests.swift in Sources */,
C5B748CC2B337EEA00DEDEEB /* InvalidServiceEndpointTest.swift in Sources */,
59F65F012562FF71005FE8C9 /* EventDaoTest.swift in Sources */,
95715A9529DB0ED800A1B2F9 /* InitDbCipherTest.swift in Sources */,
9519A93A27DE318000278AEC /* ByKeyFacadeTest.swift in Sources */,
Expand Down
48 changes: 26 additions & 22 deletions Split/Network/Endpoints/Endpoint.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,49 +10,53 @@ import Foundation

class Endpoint {

private (set) var url: URL
private (set) var url: URL?
private (set) var method: HttpMethod
private (set) var headers = [String: String]()

private init(baseUrl: URL, path: String?, isPathEncoded: Bool = false, defaultQueryString: String? = nil) {
private init(baseUrl: URL?, path: String?, isPathEncoded: Bool = false, defaultQueryString: String? = nil) {

var comp = URLComponents()
comp.host = baseUrl.host
comp.scheme = baseUrl.scheme
comp.port = baseUrl.port
if let path = path {
let newPath = "\(baseUrl.path)/\(path)"
if isPathEncoded {
comp.percentEncodedPath = newPath
if let baseUrl = baseUrl {
comp.host = baseUrl.host
comp.scheme = baseUrl.scheme
comp.port = baseUrl.port

if let path = path {
let newPath = "\(baseUrl.path)/\(path)"
if isPathEncoded {
comp.percentEncodedPath = newPath
} else {
comp.path = newPath
}
} else {
comp.path = newPath
comp.path = baseUrl.path
}
} else {
comp.path = baseUrl.path
}

if var queryString = defaultQueryString, let from = queryString.firstIndex(of: "&") {
let upperLimit = queryString.index(from, offsetBy: 1)
queryString = queryString.replacingOccurrences(of: "&", with: "",
options: .caseInsensitive, range: from..<upperLimit)
comp.query = queryString
if var queryString = defaultQueryString, let from = queryString.firstIndex(of: "&") {
let upperLimit = queryString.index(from, offsetBy: 1)
queryString = queryString.replacingOccurrences(of: "&", with: "",
options: .caseInsensitive, range: from..<upperLimit)
comp.query = queryString
}
self.url = comp.url ?? baseUrl
}
self.url = comp.url ?? baseUrl

self.method = .get
}

static func builder(baseUrl: URL, path: String? = nil, defaultQueryString: String? = nil) -> Builder {
static func builder(baseUrl: URL?, path: String? = nil, defaultQueryString: String? = nil) -> Builder {
return Builder(baseUrl: baseUrl, path: path, isPathEncoded: false, defaultQueryString: defaultQueryString)
}

static func builder(baseUrl: URL, encodedPath: String, defaultQueryString: String? = nil) -> Builder {
static func builder(baseUrl: URL?, encodedPath: String, defaultQueryString: String? = nil) -> Builder {
return Builder(baseUrl: baseUrl, path: encodedPath, isPathEncoded: true, defaultQueryString: defaultQueryString)
}

struct Builder {
private var endpoint: Endpoint

init(baseUrl: URL, path: String?, isPathEncoded: Bool, defaultQueryString: String? = nil) {
init(baseUrl: URL?, path: String?, isPathEncoded: Bool, defaultQueryString: String? = nil) {
endpoint = Endpoint(baseUrl: baseUrl, path: path,
isPathEncoded: isPathEncoded, defaultQueryString: defaultQueryString)
}
Expand Down
61 changes: 32 additions & 29 deletions Split/Network/Endpoints/ServiceEndpoints.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,34 +16,34 @@ import Foundation
static let kStreamingEndpoint = "https://streaming.split.io/sse"
static let kTelemetryEndpoint = "https://telemetry.split.io/api/v1"

private (set) var sdkEndpoint: URL
private (set) var eventsEndpoint: URL
private (set) var authServiceEndpoint: URL
private (set) var streamingServiceEndpoint: URL
private (set) var telemetryServiceEndpoint: URL
private (set) var sdkEndpoint: URL?
private (set) var eventsEndpoint: URL?
private (set) var authServiceEndpoint: URL?
private (set) var streamingServiceEndpoint: URL?
private (set) var telemetryServiceEndpoint: URL?

var isCustomSdkEndpoint: Bool {
return sdkEndpoint.absoluteString != ServiceEndpoints.kSdkEndpoint
return sdkEndpoint?.absoluteString != ServiceEndpoints.kSdkEndpoint
}

var isCustomEventsEndpoint: Bool {
return eventsEndpoint.absoluteString != ServiceEndpoints.kEventsEndpoint
return eventsEndpoint?.absoluteString != ServiceEndpoints.kEventsEndpoint
}

var isCustomAuthServiceEndpoint: Bool {
return authServiceEndpoint.absoluteString != ServiceEndpoints.kAuthServiceEndpoint
return authServiceEndpoint?.absoluteString != ServiceEndpoints.kAuthServiceEndpoint
}

var isCustomStreamingEndpoint: Bool {
return streamingServiceEndpoint.absoluteString != ServiceEndpoints.kStreamingEndpoint
return streamingServiceEndpoint?.absoluteString != ServiceEndpoints.kStreamingEndpoint
}

var isCustomTelemetryEndpoint: Bool {
return telemetryServiceEndpoint.absoluteString != ServiceEndpoints.kTelemetryEndpoint
return telemetryServiceEndpoint?.absoluteString != ServiceEndpoints.kTelemetryEndpoint
}

private init(sdkEndpoint: URL, eventsEndpoint: URL, authServiceEndpoint: URL,
streamingServiceEndpoint: URL, telemetryServiceEndpoint: URL) {
private init(sdkEndpoint: URL?, eventsEndpoint: URL?, authServiceEndpoint: URL?,
streamingServiceEndpoint: URL?, telemetryServiceEndpoint: URL?) {
self.sdkEndpoint = sdkEndpoint
self.eventsEndpoint = eventsEndpoint
self.authServiceEndpoint = authServiceEndpoint
Expand Down Expand Up @@ -131,46 +131,49 @@ import Foundation
telemetryServiceEndpoint: telemetryServiceUrl())
}

private func sdkUrl() -> URL {
private func sdkUrl() -> URL? {
if let url = URL(string: sdkEndpoint) {
return url
} else {
Logger.w("SDK URL is not valid")
return nil
}
Logger.w("SDK URL is not valid, using default")
return URL(string: ServiceEndpoints.kSdkEndpoint)!
}

private func eventsUrl() -> URL {
private func eventsUrl() -> URL? {
if let url = URL(string: eventsEndpoint) {
return url
} else {
Logger.w("Events URL is not valid")
return nil
}
Logger.w("Events URL is not valid, using default")
return URL(string: ServiceEndpoints.kEventsEndpoint)!
}

private func authServiceUrl() -> URL {
private func authServiceUrl() -> URL? {
if let url = URL(string: authServiceEndpoint) {
return url
} else {
Logger.w("Authentication service URL is not valid")
return nil
}
Logger.w("Authentication service URL is not valid, using default")
return URL(string: ServiceEndpoints.kAuthServiceEndpoint)!
}

private func streamingServiceUrl() -> URL {

private func streamingServiceUrl() -> URL? {
if let url = URL(string: streamingServiceEndpoint) {
return url
} else {
Logger.w("Streaming URL is not valid")
return nil
}
Logger.w("Streaming URL is not valid, using default")
return URL(string: ServiceEndpoints.kStreamingEndpoint)!
}

private func telemetryServiceUrl() -> URL {

private func telemetryServiceUrl() -> URL? {
if let url = URL(string: telemetryServiceEndpoint) {
return url
} else {
Logger.w("Telemetry URL is not valid")
return nil
}
Logger.w("Telemetry URL is not valid, using default")
return URL(string: ServiceEndpoints.kTelemetryEndpoint)!
}
}
}
4 changes: 2 additions & 2 deletions Split/Network/HttpClient/HttpClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -138,14 +138,14 @@ class DefaultHttpClient {
// MARK: DefaultHttpClient - Private
extension DefaultHttpClient {

private func createRequest(_ url: URL, method: HttpMethod = .get, parameters: HttpParameters? = nil,
private func createRequest(_ url: URL?, method: HttpMethod = .get, parameters: HttpParameters? = nil,
headers: HttpHeaders? = nil, body: Data? = nil) throws -> HttpDataRequest {
let request = try DefaultHttpDataRequest(session: httpSession, url: url, method: method,
parameters: parameters, headers: headers, body: body)
return request
}

private func createStreamRequest(_ url: URL, parameters: HttpParameters? = nil,
private func createStreamRequest(_ url: URL?, parameters: HttpParameters? = nil,
headers: HttpHeaders? = nil) throws -> HttpStreamRequest {
let request = try DefaultHttpStreamRequest(session: httpSession, url: url,
parameters: parameters, headers: headers)
Expand Down
27 changes: 15 additions & 12 deletions Split/Network/HttpClient/HttpRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -51,23 +51,26 @@ class BaseHttpRequest: HttpRequest {
return task?.identifier ?? -1
}

init(session: HttpSession, url: URL, method: HttpMethod,
init(session: HttpSession, url: URL?, method: HttpMethod,
parameters: HttpParameters? = nil, headers: HttpHeaders?, body: Data? = nil) throws {

var components = URLComponents(url: url, resolvingAgainstBaseURL: true)
let initialQueryItems = components?.queryItems
if let parameters = parameters {
components?.queryItems = parameters.map { key, value in
var parsedValue = "\(value)"
if let array = value as? [Any] {
parsedValue = array.compactMap { "\($0)" }.joined(separator: ",")
var components: URLComponents?
if let url = url {
components = URLComponents(url: url, resolvingAgainstBaseURL: true)
let initialQueryItems = components?.queryItems
if let parameters = parameters {
components?.queryItems = parameters.map { key, value in
var parsedValue = "\(value)"
if let array = value as? [Any] {
parsedValue = array.compactMap { "\($0)" }.joined(separator: ",")
}
return URLQueryItem(name: key, value: parsedValue)
}
return URLQueryItem(name: key, value: parsedValue)
}
}

if let initialQueryItems = initialQueryItems {
components?.queryItems?.append(contentsOf: initialQueryItems)
if let initialQueryItems = initialQueryItems {
components?.queryItems?.append(contentsOf: initialQueryItems)
}
}

guard let finalUrl = components?.url else {
Expand Down
2 changes: 1 addition & 1 deletion Split/Network/HttpClient/HttpStreamRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class DefaultHttpStreamRequest: BaseHttpRequest, HttpStreamRequest {
var incomingDataHandler: IncomingDataHandler?
var closeHandler: CloseHandler?

init(session: HttpSession, url: URL, parameters: HttpParameters?, headers: HttpHeaders?) throws {
init(session: HttpSession, url: URL?, parameters: HttpParameters?, headers: HttpHeaders?) throws {
try super.init(session: session, url: url, method: .get, parameters: parameters, headers: headers)
}

Expand Down
18 changes: 12 additions & 6 deletions Split/Network/RestClient/RestClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import Foundation

protocol RestClient {
func isServerAvailable(_ url: URL) -> Bool
func isServerAvailable(path url: String) -> Bool
func isServerAvailable(_ url: URL?) -> Bool
func isServerAvailable(path url: String?) -> Bool
func isEventsServerAvailable() -> Bool
func isSdkServerAvailable() -> Bool
}
Expand Down Expand Up @@ -101,12 +101,18 @@ class DefaultRestClient: SplitApiRestClient {
}

extension DefaultRestClient: RestClient {
func isServerAvailable(_ url: URL) -> Bool {
return self.isServerAvailable(path: url.absoluteString)
func isServerAvailable(_ url: URL?) -> Bool {
guard let urlString = url?.absoluteString else {
return false
}
return self.isServerAvailable(path: urlString)
}

func isServerAvailable(path url: String) -> Bool {
return reachabilityChecker.isReachable(path: url)
func isServerAvailable(path url: String?) -> Bool {
guard let urlString = url else {
return false
}
return reachabilityChecker.isReachable(path: urlString)
}

func isEventsServerAvailable() -> Bool {
Expand Down
4 changes: 2 additions & 2 deletions SplitTests/Fake/Network/RestClientStub.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ class RestClientStub: SplitApiRestClient {
}

extension RestClientStub: RestClient {
func isServerAvailable(_ url: URL) -> Bool { return isServerAvailable }
func isServerAvailable(path url: String) -> Bool { return isServerAvailable }
func isServerAvailable(_ url: URL?) -> Bool { return isServerAvailable }
func isServerAvailable(path url: String?) -> Bool { return isServerAvailable }
func isEventsServerAvailable() -> Bool { return isServerAvailable }
func isSdkServerAvailable() -> Bool { return isServerAvailable }
}
Expand Down
Loading
Loading