From 901a942619a5d6c4fb232b76583e0c95fa4117d0 Mon Sep 17 00:00:00 2001 From: Aleksandr Bragin Date: Sun, 9 Oct 2022 22:57:34 +0300 Subject: [PATCH] NSMSIO-119 In 'RequestEntity' the array of 'HTTPCookie' replaced by 'HTTPCookieStorage'. --- .../API/Request/BasicRequestEntity.swift | 19 +++++++---- .../Sources/API/Request/RequestEntity.swift | 6 ++-- .../API/Response/BasicResponseEntity.swift | 2 +- .../Sources/API/Response/ResponseEntity.swift | 6 ++-- .../Rest/Sources/API/RestApiClient.swift | 32 +++++++++---------- .../Interceptor/CallServerInterceptor.swift | 10 +++--- 6 files changed, 41 insertions(+), 34 deletions(-) diff --git a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Request/BasicRequestEntity.swift b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Request/BasicRequestEntity.swift index 8790577..7c9c42c 100644 --- a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Request/BasicRequestEntity.swift +++ b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Request/BasicRequestEntity.swift @@ -17,11 +17,11 @@ open class BasicRequestEntity: RequestEntity { // MARK: - Construction - init(builder: BasicRequestEntityBuilder) { + internal init(builder: BasicRequestEntityBuilder) { super.init( url: builder.url, headers: builder.headers, - cookies: builder.cookies, + cookieStorage: builder.cookieStorage ?? InMemoryCookieStorage(), body: builder.body ) } @@ -40,14 +40,14 @@ open class BasicRequestEntityBuilder { public init(entity: RequestEntity) { self.url = entity.url self.headers = entity.headers - self.cookies = entity.cookies + self.cookieStorage = entity.cookieStorage self.body = entity.body } public init(entity: RequestEntity, body: T?) { self.url = entity.url self.headers = entity.headers - self.cookies = entity.cookies + self.cookieStorage = entity.cookieStorage self.body = body } @@ -57,7 +57,7 @@ open class BasicRequestEntityBuilder { fileprivate(set) var headers: HttpHeaders? - fileprivate(set) var cookies: [HttpCookieProtocol]? + fileprivate(set) var cookieStorage: HTTPCookieStorage? fileprivate(set) var body: T? @@ -73,8 +73,15 @@ open class BasicRequestEntityBuilder { return self } + @discardableResult + open func cookieStorage(_ cookieStorage: HTTPCookieStorage) -> Self { + self.cookieStorage = cookieStorage + return self + } + + @available(*, deprecated, message: "use cookieStorage(_:) instead") @discardableResult open func cookies(_ cookies: [HttpCookieProtocol]?) -> Self { - self.cookies = cookies + self.cookieStorage = InMemoryCookieStorage(cookies: cookies?.compactMap { HTTPCookie($0) } ?? []) return self } diff --git a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Request/RequestEntity.swift b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Request/RequestEntity.swift index d682eda..20bdee0 100644 --- a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Request/RequestEntity.swift +++ b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Request/RequestEntity.swift @@ -18,10 +18,10 @@ open class RequestEntity { // MARK: - Construction - init(url: URL?, headers: HttpHeaders?, cookies: [HttpCookieProtocol]?, body: T?) { + internal init(url: URL?, headers: HttpHeaders?, cookieStorage: HTTPCookieStorage, body: T?) { self.url = url self.headers = headers - self.cookies = cookies + self.cookieStorage = cookieStorage self.body = body } @@ -31,7 +31,7 @@ open class RequestEntity { public let headers: HttpHeaders? - public let cookies: [HttpCookieProtocol]? + public let cookieStorage: HTTPCookieStorage public let body: T? } diff --git a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Response/BasicResponseEntity.swift b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Response/BasicResponseEntity.swift index 98440fb..96b50b1 100644 --- a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Response/BasicResponseEntity.swift +++ b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Response/BasicResponseEntity.swift @@ -20,7 +20,7 @@ open class BasicResponseEntity: ResponseEntity { super.init( url: builder.url, headers: builder.headers, - cookies: builder.cookies, + cookieStorage: builder.cookieStorage ?? InMemoryCookieStorage(), body: builder.body, status: builder.status, mediaType: builder.mediaType diff --git a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Response/ResponseEntity.swift b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Response/ResponseEntity.swift index 3f18336..bf98fde 100644 --- a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Response/ResponseEntity.swift +++ b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/Response/ResponseEntity.swift @@ -18,10 +18,10 @@ open class ResponseEntity: RequestEntity { // MARK: - Construction - init( + internal init( url: URL?, headers: HttpHeaders?, - cookies: [HttpCookieProtocol]?, + cookieStorage: HTTPCookieStorage, body: T?, status: HttpStatus?, mediaType: MediaType? @@ -31,7 +31,7 @@ open class ResponseEntity: RequestEntity { self.mediaType = mediaType // Parent processing - super.init(url: url, headers: headers, cookies: cookies, body: body) + super.init(url: url, headers: headers, cookieStorage: cookieStorage, body: body) } // MARK: - Properties diff --git a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/RestApiClient.swift b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/RestApiClient.swift index d48e9e5..0830455 100644 --- a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/RestApiClient.swift +++ b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/API/RestApiClient.swift @@ -59,26 +59,26 @@ public final class RestApiClient { fileprivate func execute(_ method: HTTPMethod, entity: RequestEntity) -> HttpResult { let result: HttpResult - let cookieStore = BasicHttpCookieStore(cookies: entity.cookies) + let cookieStorage = entity.cookieStorage // Create HTTP request let urlRequest = createRequest(method, entity: entity) do { // Execute HTTP request - var response = try executeWithAllInterceptors(urlRequest, cookieStore: cookieStore) + var response = try executeWithAllInterceptors(urlRequest, cookieStorage: cookieStorage) // Follow up redirects while let redirectRequest = response.redirectRequest { - response = try executeWithNetworkInterceptors(redirectRequest, cookieStore: cookieStore) + response = try executeWithNetworkInterceptors(redirectRequest, cookieStorage: cookieStorage) } // Handle response - result = HttpResult.success(handleHttpResponse(response, cookieStore)) + result = HttpResult.success(handleHttpResponse(response, cookieStorage)) } catch let error as HttpResponseError { // Handle interrupted HTTP requests - result = HttpResult.success(handleHttpResponse(error.httpResponse, cookieStore)) + result = HttpResult.success(handleHttpResponse(error.httpResponse, cookieStorage)) } catch let error { // Handle any other errors @@ -91,35 +91,35 @@ public final class RestApiClient { fileprivate func executeWithAllInterceptors( _ urlRequest: URLRequest, - cookieStore: HttpCookieStore + cookieStorage: HTTPCookieStorage ) throws -> HttpResponse { var interceptors: [Interceptor] = [] interceptors.append(contentsOf: _httpClientConfig.interceptors ?? []) interceptors.append(contentsOf: _httpClientConfig.networkInterceptors ?? []) - interceptors.append(createCallServerInterceptor(cookieStore)) + interceptors.append(createCallServerInterceptor(cookieStorage)) - return try execute(urlRequest, withInterceptors: interceptors, cookieStore: cookieStore) + return try execute(urlRequest, withInterceptors: interceptors, cookieStorage: cookieStorage) } fileprivate func executeWithNetworkInterceptors( _ urlRequest: URLRequest, - cookieStore: HttpCookieStore + cookieStorage: HTTPCookieStorage ) throws -> HttpResponse { var interceptors: [Interceptor] = [] interceptors.append(contentsOf: _httpClientConfig.networkInterceptors ?? []) - interceptors.append(createCallServerInterceptor(cookieStore)) + interceptors.append(createCallServerInterceptor(cookieStorage)) - return try execute(urlRequest, withInterceptors: interceptors, cookieStore: cookieStore) + return try execute(urlRequest, withInterceptors: interceptors, cookieStorage: cookieStorage) } fileprivate func execute( _ urlRequest: URLRequest, withInterceptors interceptors: [Interceptor], - cookieStore: HttpCookieStore + cookieStorage: HTTPCookieStorage ) throws -> HttpResponse { // Create first chain element @@ -129,7 +129,7 @@ public final class RestApiClient { return try chain.proceed(urlRequest) } - fileprivate func createCallServerInterceptor(_ cookieStore: HttpCookieStore) -> CallServerInterceptor { + fileprivate func createCallServerInterceptor(_ cookieStorage: HTTPCookieStorage) -> CallServerInterceptor { let requestTimeoutConfig = _httpClientConfig.requestTimeoutConfig ?? DefaultRequestTimeoutConfig.shared @@ -138,7 +138,7 @@ public final class RestApiClient { .connectionTimeout(requestTimeoutConfig.connectionTimeout) .readTimeout(requestTimeoutConfig.readTimeout) .tlsConfig(_httpClientConfig.tlsConfig) - .cookieStore(cookieStore) + .cookieStorage(cookieStorage) .build() } @@ -160,7 +160,7 @@ public final class RestApiClient { fileprivate func handleHttpResponse( _ httpResponse: HttpResponse, - _ cookieStore: HttpCookieStore + _ cookieStorage: HTTPCookieStorage ) -> ResponseEntity { var statusCode = HttpStatus.InternalServerError @@ -186,7 +186,7 @@ public final class RestApiClient { .status(statusCode) // @see https://tools.ietf.org/html/rfc7231#section-3.1.1.5 .mediaType(MediaType.ApplicationOctetStream) - .cookies(cookieStore.cookies) + .cookieStorage(cookieStorage) if let responseBody = httpResponse.body { entityBuilder.body(responseBody) diff --git a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/Interceptor/CallServerInterceptor.swift b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/Interceptor/CallServerInterceptor.swift index 449439f..0ef6ee3 100644 --- a/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/Interceptor/CallServerInterceptor.swift +++ b/Modules/RoxieMobile.NetworkingApi/Sources/Rest/Sources/Interceptor/CallServerInterceptor.swift @@ -38,12 +38,12 @@ class CallServerInterceptor: Interceptor { var httpError: Error? // Create session configuration - let config = URLSessionConfiguration.ephemeral + let config = URLSessionConfiguration.ephemeral.copy() as! URLSessionConfiguration config.httpAdditionalHeaders = [:] config.timeoutIntervalForResource = _options.connectionTimeout config.timeoutIntervalForRequest = _options.readTimeout - config.httpCookieStorage = (_options.cookieStore as? HTTPCookieStorage) + config.httpCookieStorage = _options.cookieStorage // Send POST request using NSURLSession // @link https://stackoverflow.com/a/19101084 @@ -130,7 +130,7 @@ class CallServerInterceptor: Interceptor { var connectionTimeout = DefaultRequestTimeoutConfig.shared.connectionTimeout var readTimeout = DefaultRequestTimeoutConfig.shared.readTimeout var tlsConfig: TlsConfig? - var cookieStore: HttpCookieStore? + var cookieStorage: HTTPCookieStorage? } // MARK: - Variables @@ -161,8 +161,8 @@ class CallServerInterceptorBuilder { return self } - func cookieStore(_ cookieStore: HttpCookieStore?) -> Self { - self.options.cookieStore = cookieStore + func cookieStorage(_ cookieStorage: HTTPCookieStorage) -> Self { + self.options.cookieStorage = cookieStorage return self }