Skip to content

Commit

Permalink
Merge pull request #1 from stealmh/1.1.0
Browse files Browse the repository at this point in the history
1.1.0
  • Loading branch information
stealmh authored Nov 30, 2023
2 parents c152405 + d1082cc commit 1eaa423
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 35 deletions.
40 changes: 26 additions & 14 deletions Sources/CuteNetwork/Cute.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,19 @@ class Cute<EndPoint: EndPointType>: NSObject, NetworkRouter, URLSessionDelegate
/// Properties
private var task: URLSessionTask?
/// petit(_ root: EndPoint, petitLogVisible: Bool) async throws -> Data 함수를 통해 받은 Data를 파싱해주는 함수입니다.
func petit<T: Decodable>(_ root: EndPoint, petitLogVisible: Bool = true) async throws -> T{
let result = try await petit(root, petitLogVisible: petitLogVisible)
func petit<T: Decodable>(_ root: EndPoint, petitLogVisible: Bool = true) async throws -> T {
do {
let result = try await petit(root, petitLogVisible: petitLogVisible)

let decoder = JSONDecoder()
let data = try decoder.decode(T.self, from: result)

return data
} catch {
throw NetworkError.parsingError
/// [1] `result` error handling
if let networkError = error as? NetworkError { throw networkError }
/// [2] `Decode fail` error handling
else { throw NetworkError.parsingError }
}
}
/// petit(_ route: EndPoint, logAccess: Bool, completion: @escaping NetworkRouterCompletion)를 받아
Expand All @@ -27,13 +32,25 @@ class Cute<EndPoint: EndPointType>: NSObject, NetworkRouter, URLSessionDelegate
return try await withCheckedThrowingContinuation({ value in
petit(root, logAccess: petitLogVisible) { data, response, error in
if let error {
value.resume(throwing: error)
} else if let data {
value.resume(returning: data)
} else {
value.resume(throwing: NetworkError.noData)
value.resume(throwing: error as? NetworkError ?? NetworkError.custom(message: error.localizedDescription))
}

if let response = response as? HTTPURLResponse {
let result = ResponseHandler.handleNetworkResponse(response)
switch result {
case .success:
guard let data else {
value.resume(throwing: NetworkError.custom(message: "데이터를 받지 못했습니다."))
return
}
value.resume(returning: data)
case .failure(let message):
guard let _ = data else {
value.resume(throwing: NetworkError.custom(message: message))
return
}
}
}
}
})
}
Expand Down Expand Up @@ -116,11 +133,6 @@ fileprivate extension Cute {

func addHeaders(_ headers: HTTPHeaders?, request: inout URLRequest) {
guard let headers = headers else { return }

let _ = headers.map { request.setValue($0, forHTTPHeaderField: $1) }

// for (key, value) in headers {
// request.setValue(value, forHTTPHeaderField: key)
// }
headers.forEach { request.setValue($0, forHTTPHeaderField: $1) }
}
}
17 changes: 17 additions & 0 deletions Sources/CuteNetwork/Encodable+parameter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// Encodable+parameter.swift
//
//
// Created by DEV IOS on 2023/11/30.
//

import Foundation

extension Encodable {
var toParameter: [String: Any]? {
guard let object = try? JSONEncoder().encode(self) else { return nil }
guard let dictionary = try? JSONSerialization.jsonObject(with: object, options: [])
as? [String: Any] else { return nil }
return dictionary
}
}
4 changes: 2 additions & 2 deletions Sources/CuteNetwork/FormParameterEncoder.swift
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
//
// FORMParameterEncoder.swift
// FormarameterEncoder.swift
//
//
// Created by mino on 2023/11/29.
//

import Foundation

public struct FORMParameterEncoder: ParameterEncoder {
public struct FormParameterEncoder: ParameterEncoder {
public func encode(urlRequest: inout URLRequest, with parameters: Parameters) throws {
var parameterArray = [String]()
for param in parameters {
Expand Down
32 changes: 16 additions & 16 deletions Sources/CuteNetwork/NetworkLogger.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,37 +11,37 @@ class NetworkLogger {

static func log(request: URLRequest) {

debugPrint("🥚 [NetworkLogger Start]")
defer { debugPrint("🐥 [NetworkLogger End]") }

let urlAsString = request.url?.absoluteString ?? ""
let urlComponents = NSURLComponents(string: urlAsString)

let method = request.httpMethod != nil ? "\(request.httpMethod ?? "")" : ""
let path = "\(urlComponents?.path ?? "")"
let query = "\(urlComponents?.query ?? "")"
let host = "\(urlComponents?.host ?? "")"
debugPrint("🐣 [NetworkLogger Request] URL: \(urlAsString)\n")
debugPrint("🐣 [NetworkLogger Request] Method: \(method)")
debugPrint("🐣 [NetworkLogger Request] Path: \(path)")
debugPrint("🐣 [NetworkLogger Request] query: \(query)")

var logOutput = """
\(urlAsString) \n\n
\(method) \(path)?\(query) HTTP/1.1 \n
HOST: \(host)\n
"""
var bodyLog: String = ""

for (key, value) in request.allHTTPHeaderFields ?? [:] {
logOutput += "\(key): \(value) \n"
}

let headerLog = (request.allHTTPHeaderFields ?? [:])
.map { "\($0.key): \($0.value)" }
.joined(separator: "\n")

if let body = request.httpBody {
bodyLog += "\n \(NSString(data: body, encoding: String.Encoding.utf8.rawValue) ?? "")"
}

debugPrint("🥚 [NetworkLogger Start]")
defer { debugPrint("🐥 [NetworkLogger End]") }
debugPrint("🐣 [NetworkLogger Request] URL: \(urlAsString)\n")
debugPrint("🐣 [NetworkLogger Request] Method: \(method)")
debugPrint("🐣 [NetworkLogger Request] Path: \(path)")
debugPrint("🐣 [NetworkLogger Request] query: \(query)")

#if DEBUG
/// debugPrint는 멀티라인을 지원하지 않기 때문에 print로 사용하고 debug처리
print("""
"🐣 [NetworkLogger Header] header:\n \(headerLog)"\n
""")

print("""
"🐣 [NetworkLogger Request] body:\n \(bodyLog)"\n
""")
Expand Down
2 changes: 1 addition & 1 deletion Sources/CuteNetwork/ParameterEncoding.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public enum ParameterEncoding {

case .formEncoding:
guard let bodyParameters = bodyParameters else { return }
try FORMParameterEncoder().encode(urlRequest: &urlRequest, with: bodyParameters)
try FormParameterEncoder().encode(urlRequest: &urlRequest, with: bodyParameters)
}
} catch {
throw error
Expand Down
36 changes: 34 additions & 2 deletions Tests/CuteNetworkTests/CuteNetworkTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,42 @@ import XCTest
@testable import CuteNetwork

final class CuteNetworkTests: XCTestCase {
func testExample() throws {
enum MockEndpoint: EndPointType {
case test

var baseURL: URL {
return URL(string: "123")!
}

var path: String {
return ""
}

var httpMethod: CuteNetwork.HTTPMethod {
return .get
}

var task: CuteNetwork.HTTPTask {
return .request
}

var headers: CuteNetwork.HTTPHeaders? {
return [:]
}
}


func testExample() async throws {

let cute = Cute<MockEndpoint>()
do {
let a = try await cute.petit(.test, petitLogVisible: false)
// XCTAssertNotEqual(a, Data())
} catch {
print("error: \(error)")
}
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct
// results.
XCTAssertEqual(CuteNetwork().text, "Hello, World!")
}
}

0 comments on commit 1eaa423

Please sign in to comment.