diff --git a/APIKit/Request.swift b/APIKit/Request.swift index 08bebf5e..56ed1359 100644 --- a/APIKit/Request.swift +++ b/APIKit/Request.swift @@ -71,7 +71,8 @@ public extension Request { // Use Result here because `throws` loses type info of an error (in Swift 2 beta 2) internal func createTaskInURLSession(URLSession: NSURLSession) -> Result { - guard let components = NSURLComponents(URL: baseURL, resolvingAgainstBaseURL: true) else { + let URL = path.isEmpty ? baseURL : baseURL.URLByAppendingPathComponent(path) + guard let components = NSURLComponents(URL: URL, resolvingAgainstBaseURL: true) else { return .Failure(.InvalidBaseURL(baseURL)) } @@ -90,10 +91,6 @@ public extension Request { } } - if (!path.isEmpty) { - components.path = path.hasPrefix("/") ? path : "/" + path - } - URLRequest.URL = components.URL URLRequest.HTTPMethod = method.rawValue URLRequest.setValue(requestBodyBuilder.contentTypeHeader, forHTTPHeaderField: "Content-Type") diff --git a/APIKitTests/RequestCreateTaskInURLSessionTests.swift b/APIKitTests/RequestCreateTaskInURLSessionTests.swift index 71bf6bce..fc0cb045 100644 --- a/APIKitTests/RequestCreateTaskInURLSessionTests.swift +++ b/APIKitTests/RequestCreateTaskInURLSessionTests.swift @@ -10,11 +10,12 @@ class RequestCreateTaskInURLSessionTest: XCTestCase { struct SampleRequest: Request { typealias Response = [String: AnyObject] + var b: String = "" var p: String = "" var m: HTTPMethod = .GET var params: [String: AnyObject] = [:] - var baseURL: NSURL { return NSURL(string: "https://example.com")! } + var baseURL: NSURL { return NSURL(string: b)! } var method: HTTPMethod { return m } var path: String { return p } var parameters: [String: AnyObject] { return params } @@ -55,83 +56,502 @@ class RequestCreateTaskInURLSessionTest: XCTestCase { } - var sampleRequest = SampleRequest() + var sampleRequest: SampleRequest + + // MARK: - baseURL = https://example.com + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "" sampleRequest.m = .GET sampleRequest.params = [:] assertRequest(sampleRequest, pattern: "https://example.com") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "/" sampleRequest.m = .GET sampleRequest.params = [:] assertRequest(sampleRequest, pattern: "https://example.com/") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "/" sampleRequest.m = .GET sampleRequest.params = ["p": 1] assertRequest(sampleRequest, pattern: "https://example.com/?p=1") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "foo" sampleRequest.m = .GET sampleRequest.params = [:] assertRequest(sampleRequest, pattern: "https://example.com/foo") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "/foo" sampleRequest.m = .GET sampleRequest.params = [:] assertRequest(sampleRequest, pattern: "https://example.com/foo") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "/foo" sampleRequest.m = .GET sampleRequest.params = ["p": 1] assertRequest(sampleRequest, pattern: "https://example.com/foo?p=1") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "/foo/" sampleRequest.m = .GET sampleRequest.params = [:] assertRequest(sampleRequest, pattern: "https://example.com/foo/") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "/foo/" sampleRequest.m = .GET sampleRequest.params = ["p": 1] assertRequest(sampleRequest, pattern: "https://example.com/foo/?p=1") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "foo/bar" sampleRequest.m = .GET sampleRequest.params = [:] assertRequest(sampleRequest, pattern: "https://example.com/foo/bar") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "/foo/bar" sampleRequest.m = .GET sampleRequest.params = [:] assertRequest(sampleRequest, pattern: "https://example.com/foo/bar") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "/foo/bar" sampleRequest.m = .GET sampleRequest.params = ["p": 1] assertRequest(sampleRequest, pattern: "https://example.com/foo/bar?p=1") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "/foo/bar/" sampleRequest.m = .GET sampleRequest.params = [:] assertRequest(sampleRequest, pattern: "https://example.com/foo/bar/") sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" sampleRequest.p = "/foo/bar/" sampleRequest.m = .GET sampleRequest.params = ["p": 1] assertRequest(sampleRequest, pattern: "https://example.com/foo/bar/?p=1") + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com" + sampleRequest.p = "foo//bar//" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/foo//bar//") + + // MARK: - baseURL = https://example.com/ + + sampleRequest.b = "https://example.com/" + sampleRequest.p = "" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com//") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com//?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "foo" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/foo") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "/foo" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com//foo") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "/foo" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com//foo?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "/foo/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com//foo/") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "/foo/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com//foo/?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "foo/bar" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/foo/bar") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "/foo/bar" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com//foo/bar") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "/foo/bar" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com//foo/bar?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "/foo/bar/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com//foo/bar/") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "/foo/bar/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com//foo/bar/?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/" + sampleRequest.p = "foo//bar//" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/foo//bar//") + + // MARK: - baseURL = https://example.com/api + + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com/api/?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "foo" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "/foo" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "/foo" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "/foo/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo/") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "/foo/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo/?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "foo/bar" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo/bar") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "/foo/bar" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo/bar") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "/foo/bar" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo/bar?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "/foo/bar/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo/bar/") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "/foo/bar/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo/bar/?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api" + sampleRequest.p = "foo//bar//" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo//bar//") + + // MARK: - baseURL = https://example.com/api/ + + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api//") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com/api//?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "foo" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "/foo" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api//foo") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "/foo" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com/api//foo?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "/foo/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api//foo/") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "/foo/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com/api//foo/?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "foo/bar" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo/bar") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "/foo/bar" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api//foo/bar") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "/foo/bar" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com/api//foo/bar?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "/foo/bar/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api//foo/bar/") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "/foo/bar/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com/api//foo/bar/?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com/api/" + sampleRequest.p = "foo//bar//" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com/api/foo//bar//") + + // MARK: - baseURL = https://example.com/// + + sampleRequest.b = "https://example.com///" + sampleRequest.p = "" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com///") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com////") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com////?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "foo" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com///foo") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "/foo" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com////foo") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "/foo" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com////foo?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "/foo/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com////foo/") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "/foo/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com////foo/?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "foo/bar" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com///foo/bar") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "/foo/bar" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com////foo/bar") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "/foo/bar" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com////foo/bar?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "/foo/bar/" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com////foo/bar/") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "/foo/bar/" + sampleRequest.m = .GET + sampleRequest.params = ["p": 1] + assertRequest(sampleRequest, pattern: "https://example.com////foo/bar/?p=1") + + sampleRequest = SampleRequest() + sampleRequest.b = "https://example.com///" + sampleRequest.p = "foo//bar//" + sampleRequest.m = .GET + sampleRequest.params = [:] + assertRequest(sampleRequest, pattern: "https://example.com///foo//bar//") } }