From 8577293c96db986f44a1dcbf3503e08a75b0918c Mon Sep 17 00:00:00 2001 From: lwbvv Date: Sat, 4 Jun 2022 20:56:21 +0900 Subject: [PATCH 1/9] =?UTF-8?q?style:=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20HTTP=20->=20Http=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Network/{HTTPClient.swift => HttpClient.swift} | 14 +++++++------- ...ConnectTarget.swift => HttpConnectTarget.swift} | 10 +++++----- .../Network/{HTTPMethod.swift => HttpMethod.swift} | 4 ++-- .../{HTTPParameter.swift => HttpParameter.swift} | 8 ++++---- 4 files changed, 18 insertions(+), 18 deletions(-) rename Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/{HTTPClient.swift => HttpClient.swift} (85%) rename Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/{HTTPConnectTarget.swift => HttpConnectTarget.swift} (62%) rename Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/{HTTPMethod.swift => HttpMethod.swift} (82%) rename Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/{HTTPParameter.swift => HttpParameter.swift} (88%) diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpClient.swift similarity index 85% rename from Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift rename to Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpClient.swift index b82db11..36df84c 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpClient.swift @@ -1,5 +1,5 @@ // -// HTTPClient.swift +// HttpClient.swift // HelpMeChooseIOS // // Created by CanlabLee on 2022/05/21. @@ -8,11 +8,11 @@ import Foundation -public class HTTPClient { +public class HttpClient { public func jsonRequest( - target: HTTPConnectTarget, + target: HttpConnectTarget, timeoutInterval: TimeInterval = 0, - completionHandler: @escaping (Result<[String: Any], HTTPError>) -> Void + completionHandler: @escaping (Result<[String: Any], HttpError>) -> Void ) { request(target: target) { result in switch result { @@ -25,9 +25,9 @@ public class HTTPClient { } public func request( - target: HTTPConnectTarget, + target: HttpConnectTarget, timeoutInterval: TimeInterval = 0, - completionHandler: @escaping (Result) -> Void + completionHandler: @escaping (Result) -> Void ) { let url = URL(string: @@ -51,7 +51,7 @@ public class HTTPClient { completionHandler(.failure(.undefined(error))) return } - if let response = response as? HTTPURLResponse, + if let response = response as? HttpURLResponse, !(200...299).contains(response.statusCode) { completionHandler(.failure(.failureStatusCode(response.statusCode))) return diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPConnectTarget.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpConnectTarget.swift similarity index 62% rename from Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPConnectTarget.swift rename to Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpConnectTarget.swift index 075952d..3cd3116 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPConnectTarget.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpConnectTarget.swift @@ -1,5 +1,5 @@ // -// HTTPConnectTarget.swift +// HttpConnectTarget.swift // HelpMeChooseIOS // // Created by CanlabLee on 2022/05/21. @@ -8,15 +8,15 @@ import Foundation -public enum HTTPError: Error { +public enum HttpError: Error { case undefined(Error) case failureStatusCode(Int) case emptyData } -public protocol HTTPConnectTarget { +public protocol HttpConnectTarget { var baseURL: String { get } var path: String { get } - var method: HTTPMethod { get } - var parameters: HTTPParameter { get } + var method: HttpMethod { get } + var parameters: HttpParameter { get } } diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPMethod.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpMethod.swift similarity index 82% rename from Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPMethod.swift rename to Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpMethod.swift index c4e6f72..517b15c 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPMethod.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpMethod.swift @@ -1,5 +1,5 @@ // -// HTTPMethod.swift +// HttpMethod.swift // HelpMeChooseIOS // // Created by CanlabLee on 2022/05/21. @@ -8,7 +8,7 @@ import Foundation -public enum HTTPMethod: String { +public enum HttpMethod: String { case get = "GET" case post = "POST" case put = "PUT" diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPParameter.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpParameter.swift similarity index 88% rename from Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPParameter.swift rename to Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpParameter.swift index 968bee0..90a881b 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPParameter.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpParameter.swift @@ -1,5 +1,5 @@ // -// HTTPParameter.swift +// HttpParameter.swift // HelpMeChooseIOS // // Created by CanlabLee on 2022/05/21. @@ -9,7 +9,7 @@ import Foundation -public protocol HTTPParameter { +public protocol HttpParameter { var queryDict: [String: Any]? { get } var queryString: String { get } @@ -17,7 +17,7 @@ public protocol HTTPParameter { var body: [String: Any]? { get } } -extension HTTPParameter { +extension HttpParameter { var queryString: String { var result = "" @@ -33,7 +33,7 @@ extension HTTPParameter { .components(separatedBy: ",") .reduce("") { $0 + toQuery(key: key, value: $1) } } else { - query += toQuery(key: key, value: valueString) + query = toQuery(key: key, value: valueString) } result += query From 6323d85dc8126e747c99a3bef1c2a9a1750ec9e4 Mon Sep 17 00:00:00 2001 From: lwbvv Date: Sun, 5 Jun 2022 00:23:18 +0900 Subject: [PATCH 2/9] style: rollback --- .../Network/{HttpClient.swift => HTTPClient.swift} | 14 +++++++------- ...ConnectTarget.swift => HTTPConnectTarget.swift} | 10 +++++----- .../Network/{HttpMethod.swift => HTTPMethod.swift} | 4 ++-- .../{HttpParameter.swift => HTTPParameter.swift} | 6 +++--- 4 files changed, 17 insertions(+), 17 deletions(-) rename Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/{HttpClient.swift => HTTPClient.swift} (85%) rename Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/{HttpConnectTarget.swift => HTTPConnectTarget.swift} (62%) rename Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/{HttpMethod.swift => HTTPMethod.swift} (82%) rename Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/{HttpParameter.swift => HTTPParameter.swift} (93%) diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpClient.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift similarity index 85% rename from Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpClient.swift rename to Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift index 36df84c..b82db11 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpClient.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift @@ -1,5 +1,5 @@ // -// HttpClient.swift +// HTTPClient.swift // HelpMeChooseIOS // // Created by CanlabLee on 2022/05/21. @@ -8,11 +8,11 @@ import Foundation -public class HttpClient { +public class HTTPClient { public func jsonRequest( - target: HttpConnectTarget, + target: HTTPConnectTarget, timeoutInterval: TimeInterval = 0, - completionHandler: @escaping (Result<[String: Any], HttpError>) -> Void + completionHandler: @escaping (Result<[String: Any], HTTPError>) -> Void ) { request(target: target) { result in switch result { @@ -25,9 +25,9 @@ public class HttpClient { } public func request( - target: HttpConnectTarget, + target: HTTPConnectTarget, timeoutInterval: TimeInterval = 0, - completionHandler: @escaping (Result) -> Void + completionHandler: @escaping (Result) -> Void ) { let url = URL(string: @@ -51,7 +51,7 @@ public class HttpClient { completionHandler(.failure(.undefined(error))) return } - if let response = response as? HttpURLResponse, + if let response = response as? HTTPURLResponse, !(200...299).contains(response.statusCode) { completionHandler(.failure(.failureStatusCode(response.statusCode))) return diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpConnectTarget.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPConnectTarget.swift similarity index 62% rename from Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpConnectTarget.swift rename to Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPConnectTarget.swift index 3cd3116..075952d 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpConnectTarget.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPConnectTarget.swift @@ -1,5 +1,5 @@ // -// HttpConnectTarget.swift +// HTTPConnectTarget.swift // HelpMeChooseIOS // // Created by CanlabLee on 2022/05/21. @@ -8,15 +8,15 @@ import Foundation -public enum HttpError: Error { +public enum HTTPError: Error { case undefined(Error) case failureStatusCode(Int) case emptyData } -public protocol HttpConnectTarget { +public protocol HTTPConnectTarget { var baseURL: String { get } var path: String { get } - var method: HttpMethod { get } - var parameters: HttpParameter { get } + var method: HTTPMethod { get } + var parameters: HTTPParameter { get } } diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpMethod.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPMethod.swift similarity index 82% rename from Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpMethod.swift rename to Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPMethod.swift index 517b15c..c4e6f72 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpMethod.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPMethod.swift @@ -1,5 +1,5 @@ // -// HttpMethod.swift +// HTTPMethod.swift // HelpMeChooseIOS // // Created by CanlabLee on 2022/05/21. @@ -8,7 +8,7 @@ import Foundation -public enum HttpMethod: String { +public enum HTTPMethod: String { case get = "GET" case post = "POST" case put = "PUT" diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpParameter.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPParameter.swift similarity index 93% rename from Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpParameter.swift rename to Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPParameter.swift index 90a881b..c8d3c3d 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HttpParameter.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPParameter.swift @@ -1,5 +1,5 @@ // -// HttpParameter.swift +// HTTPParameter.swift // HelpMeChooseIOS // // Created by CanlabLee on 2022/05/21. @@ -9,7 +9,7 @@ import Foundation -public protocol HttpParameter { +public protocol HTTPParameter { var queryDict: [String: Any]? { get } var queryString: String { get } @@ -17,7 +17,7 @@ public protocol HttpParameter { var body: [String: Any]? { get } } -extension HttpParameter { +extension HTTPParameter { var queryString: String { var result = "" From 93b36236524cfe42e37f90027061e9c1d9132597 Mon Sep 17 00:00:00 2001 From: lwbvv Date: Sun, 5 Jun 2022 03:08:15 +0900 Subject: [PATCH 3/9] Feat: httpconnect interceptor --- .../Infrastructure/Network/HTTPClient.swift | 21 ++++++++++++++++++- .../Network/HTTPInterceptor.swift | 19 +++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPInterceptor.swift diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift index b82db11..d57badc 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift @@ -9,12 +9,22 @@ import Foundation public class HTTPClient { + private var interceptors: [HTTPInterceptor] = [] + + public init(interceptors: [HTTPInterceptor]) { + self.interceptors = interceptors + } + public func jsonRequest( target: HTTPConnectTarget, timeoutInterval: TimeInterval = 0, + interceptor: HTTPInterceptor, completionHandler: @escaping (Result<[String: Any], HTTPError>) -> Void ) { - request(target: target) { result in + request( + target: target, + interceptor: interceptor + ) { result in switch result { case let .success(value): completionHandler(.success(value.toJsonDictionary())) @@ -27,8 +37,13 @@ public class HTTPClient { public func request( target: HTTPConnectTarget, timeoutInterval: TimeInterval = 0, + interceptor: HTTPInterceptor, completionHandler: @escaping (Result) -> Void ) { + let finalInterceptors = interceptors + [interceptor] + + finalInterceptors + .forEach { $0.willSendRequest() } let url = URL(string: target.baseURL + @@ -47,6 +62,8 @@ public class HTTPClient { URLSession.shared.dataTask( with: request) { data, response, error in + finalInterceptors.forEach { $0.didReceiveResponse() } + if let error = error { completionHandler(.failure(.undefined(error))) return @@ -63,6 +80,8 @@ public class HTTPClient { completionHandler(.success(data)) } + + finalInterceptors.forEach { $0.didSendRequest() } } } diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPInterceptor.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPInterceptor.swift new file mode 100644 index 0000000..4986342 --- /dev/null +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPInterceptor.swift @@ -0,0 +1,19 @@ +// +// HTTPInterceptor.swift +// HelpMeChooseIOS +// +// Created by CanlabLee on 2022/06/05. +// Copyright © 2022 JYKang. All rights reserved. +// + +public protocol HTTPInterceptor { + func willSendRequest() + func didSendRequest() + func didReceiveResponse() +} + +extension HTTPInterceptor { + public func willSendRequest() {} + public func didSendRequest() {} + public func didReceiveResponse() {} +} From cf60809aae23c35b54e8a0ae1a49d7010cd3cdb0 Mon Sep 17 00:00:00 2001 From: lwbvv Date: Sun, 5 Jun 2022 03:08:53 +0900 Subject: [PATCH 4/9] fix: add resume --- .../Sources/Infrastructure/Network/HTTPClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift index d57badc..93bc309 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift @@ -79,7 +79,7 @@ public class HTTPClient { } completionHandler(.success(data)) - } + }.resume() finalInterceptors.forEach { $0.didSendRequest() } } From 64bd5616a1747b713812d43350958aa4a5e31daa Mon Sep 17 00:00:00 2001 From: lwbvv Date: Sun, 5 Jun 2022 11:33:20 +0900 Subject: [PATCH 5/9] feat: interceptor connect --- .../Infrastructure/Network/HTTPClient.swift | 14 ++++++++----- .../Network/HTTPInterceptor.swift | 20 +++++++++++++++++-- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift index 93bc309..4ede8f8 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift @@ -42,9 +42,6 @@ public class HTTPClient { ) { let finalInterceptors = interceptors + [interceptor] - finalInterceptors - .forEach { $0.willSendRequest() } - let url = URL(string: target.baseURL + target.path + @@ -59,13 +56,20 @@ public class HTTPClient { var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: timeoutInterval) request.httpBody = target.parameters.body?.toJsonData() + request = finalInterceptors.reduce(request) { $1.resetRequest(request: $0, target: target) } + + + finalInterceptors + .forEach { $0.willSendRequest() } URLSession.shared.dataTask( with: request) { data, response, error in - finalInterceptors.forEach { $0.didReceiveResponse() } if let error = error { - completionHandler(.failure(.undefined(error))) + + completionHandler( + finalInterceptors.reduce(.failure(.undefined(error))) {$1.didReceiveResponse(result: $0, target: target)} + ) return } if let response = response as? HTTPURLResponse, diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPInterceptor.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPInterceptor.swift index 4986342..e0b5ef3 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPInterceptor.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPInterceptor.swift @@ -6,14 +6,30 @@ // Copyright © 2022 JYKang. All rights reserved. // +import Foundation.NSURLRequest + public protocol HTTPInterceptor { + func resetRequest( + request: URLRequest, + target: HTTPConnectTarget + ) -> URLRequest func willSendRequest() func didSendRequest() - func didReceiveResponse() + func didReceiveResponse( + result: Result, + target: HTTPConnectTarget + ) -> Result } extension HTTPInterceptor { + public func resetRequest( + request: URLRequest, + target: HTTPConnectTarget + ) -> URLRequest { return request } public func willSendRequest() {} public func didSendRequest() {} - public func didReceiveResponse() {} + public func didReceiveResponse( + result: Result, + target: HTTPConnectTarget + ) -> Result { return result } } From 0238e4eb3593ba7af071bb85c5ca1be07f3c007e Mon Sep 17 00:00:00 2001 From: lwbvv Date: Sun, 5 Jun 2022 11:34:55 +0900 Subject: [PATCH 6/9] Revert "fix: add resume" This reverts commit cf60809aae23c35b54e8a0ae1a49d7010cd3cdb0. --- .../Sources/Infrastructure/Network/HTTPClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift index 4ede8f8..5d0ff2d 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift @@ -83,7 +83,7 @@ public class HTTPClient { } completionHandler(.success(data)) - }.resume() + } finalInterceptors.forEach { $0.didSendRequest() } } From 7f99e4be17d4a367d05a86aab617be5386d84d24 Mon Sep 17 00:00:00 2001 From: lwbvv Date: Sun, 5 Jun 2022 11:48:10 +0900 Subject: [PATCH 7/9] git commit --- .../Sources/Infrastructure/Network/HTTPClient.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift index 5d0ff2d..83df18d 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift @@ -74,7 +74,9 @@ public class HTTPClient { } if let response = response as? HTTPURLResponse, !(200...299).contains(response.statusCode) { - completionHandler(.failure(.failureStatusCode(response.statusCode))) + completionHandler( + finalInterceptors.reduce(.failure(.failureStatusCode(response.statusCode))) {$1.didReceiveResponse(result: $0, target: target)} + ) return } guard let data = data else { @@ -82,7 +84,9 @@ public class HTTPClient { return } - completionHandler(.success(data)) + completionHandler( + finalInterceptors.reduce(.success(data)) { $1.didReceiveResponse(result: $0, target: target) } + ) } finalInterceptors.forEach { $0.didSendRequest() } From 646c9a2a6bc40e38b973d32bd89652e416c7539f Mon Sep 17 00:00:00 2001 From: lwbvv Date: Sun, 5 Jun 2022 12:43:53 +0900 Subject: [PATCH 8/9] feat: interceptor --- .../Infrastructure/Network/HTTPClient.swift | 112 +++++++++--------- .../Network/Interceptor/HTTPInterceptor.swift | 37 ++++++ 2 files changed, 95 insertions(+), 54 deletions(-) create mode 100644 Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/Interceptor/HTTPInterceptor.swift diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift index 83df18d..68c3934 100644 --- a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/HTTPClient.swift @@ -16,10 +16,10 @@ public class HTTPClient { } public func jsonRequest( - target: HTTPConnectTarget, - timeoutInterval: TimeInterval = 0, - interceptor: HTTPInterceptor, - completionHandler: @escaping (Result<[String: Any], HTTPError>) -> Void + target: HTTPConnectTarget, + timeoutInterval: TimeInterval = 0, + interceptor: HTTPInterceptor, + completionHandler: @escaping (Result<[String: Any], HTTPError>) -> Void ) { request( target: target, @@ -35,61 +35,65 @@ public class HTTPClient { } public func request( - target: HTTPConnectTarget, - timeoutInterval: TimeInterval = 0, - interceptor: HTTPInterceptor, - completionHandler: @escaping (Result) -> Void - ) { - let finalInterceptors = interceptors + [interceptor] - - let url = URL(string: + target: HTTPConnectTarget, + timeoutInterval: TimeInterval = 0, + interceptor: HTTPInterceptor, + completionHandler: @escaping (Result) -> Void + ) { + let finalInterceptors = interceptors + [interceptor] + + let url = URL(string: target.baseURL + - target.path + - target.parameters.queryString - ) - - guard let url = url else { - assertionFailure("Invalid url") - return - } - - var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: timeoutInterval) - request.httpBody = target.parameters.body?.toJsonData() - - request = finalInterceptors.reduce(request) { $1.resetRequest(request: $0, target: target) } - - - finalInterceptors - .forEach { $0.willSendRequest() } - - URLSession.shared.dataTask( - with: request) { data, response, error in - - if let error = error { + target.path + + target.parameters.queryString + ) + + guard let url = url else { + assertionFailure("Invalid url") + return + } + + var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: timeoutInterval) + request.httpBody = target.parameters.body?.toJsonData() + + request = finalInterceptors.reduce(request) { $1.resetRequest(request: $0, target: target) } + + + finalInterceptors + .forEach { $0.willSendRequest() } + + URLSession.shared.dataTask( + with: request) { data, response, error in + guard let response = response else { + assertionFailure("response data does not exist") + return + } + + if let error = error { + + completionHandler( + finalInterceptors.reduce(.failure(.undefined(error))) {$1.didReceiveResponse(result: ($0, response), target: target)} + ) + return + } + if let response = response as? HTTPURLResponse, + !(200...299).contains(response.statusCode) { + completionHandler( + finalInterceptors.reduce(.failure(.failureStatusCode(response.statusCode))) {$1.didReceiveResponse(result: ($0, response), target: target)} + ) + return + } + guard let data = data else { + completionHandler(.failure(.emptyData)) + return + } completionHandler( - finalInterceptors.reduce(.failure(.undefined(error))) {$1.didReceiveResponse(result: $0, target: target)} - ) - return - } - if let response = response as? HTTPURLResponse, - !(200...299).contains(response.statusCode) { - completionHandler( - finalInterceptors.reduce(.failure(.failureStatusCode(response.statusCode))) {$1.didReceiveResponse(result: $0, target: target)} + finalInterceptors.reduce(.success(data)) { $1.didReceiveResponse(result: ($0, response), target: target) } ) - return - } - guard let data = data else { - completionHandler(.failure(.emptyData)) - return } - - completionHandler( - finalInterceptors.reduce(.success(data)) { $1.didReceiveResponse(result: $0, target: target) } - ) - } - - finalInterceptors.forEach { $0.didSendRequest() } + + finalInterceptors.forEach { $0.didSendRequest() } } } diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/Interceptor/HTTPInterceptor.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/Interceptor/HTTPInterceptor.swift new file mode 100644 index 0000000..3bfa617 --- /dev/null +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/Interceptor/HTTPInterceptor.swift @@ -0,0 +1,37 @@ +// +// HTTPInterceptor.swift +// HelpMeChooseIOS +// +// Created by CanlabLee on 2022/06/05. +// Copyright © 2022 JYKang. All rights reserved. +// + +import Foundation.NSURLRequest +import Foundation.NSURLResponse + +public protocol HTTPInterceptor { + func resetRequest( + request: URLRequest, + target: HTTPConnectTarget + ) -> URLRequest + func willSendRequest() + func didSendRequest() + func didReceiveResponse( + result: (Result, URLResponse), + target: HTTPConnectTarget + ) -> Result +} + +extension HTTPInterceptor { + public func resetRequest( + request: URLRequest, + target: HTTPConnectTarget + ) -> URLRequest { return request } + public func willSendRequest() {} + public func didSendRequest() {} + public func didReceiveResponse( + result: (Result, URLResponse), + target: HTTPConnectTarget + ) -> Result { return result.0 } +} + From 66eb4a3cb885d9a0cdd727a59251478e1f17fc7b Mon Sep 17 00:00:00 2001 From: lwbvv Date: Mon, 6 Jun 2022 17:09:26 +0900 Subject: [PATCH 9/9] Feat: token inject interactor --- .../Interceptor/TokenInjectInterceptor.swift | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/Interceptor/TokenInjectInterceptor.swift diff --git a/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/Interceptor/TokenInjectInterceptor.swift b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/Interceptor/TokenInjectInterceptor.swift new file mode 100644 index 0000000..52f9e21 --- /dev/null +++ b/Targets/HelpMeChooseIOS/Sources/Infrastructure/Network/Interceptor/TokenInjectInterceptor.swift @@ -0,0 +1,43 @@ +// +// TokenInjectInterceptor.swift +// HelpMeChooseIOS +// +// Created by CanlabLee on 2022/06/05. +// Copyright © 2022 JYKang. All rights reserved. +// + +import Foundation + +public enum AcessToken { + case bearer(String) + case custom(String) + + public var value: String { + switch self { + case let .bearer(value): return "Bearer \(value)" + case let .custom(value): return value + } + } +} + +public class TokenInjectInterceptor: HTTPInterceptor { + private let headerFieldKey = "Authorization" + let token: () -> AcessToken + + public init(token: @escaping () -> AcessToken) { + self.token = token + } + public func resetRequest( + request: URLRequest, + target: HTTPConnectTarget + ) -> URLRequest { + let token = token() + var newRequest = request + + if token.value == request.value(forHTTPHeaderField: headerFieldKey){ return request } + + newRequest.setValue(token.value, forHTTPHeaderField: headerFieldKey) + + return newRequest + } +}