From fa6bfc44c690559aaf7685195971d2c39264b73e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Portela=20Afonso?= Date: Tue, 7 Feb 2023 18:02:07 +0000 Subject: [PATCH] feat(http-client): introduce safe string convertible (#43) --- Sources/YData/Client/InternalClient.swift | 22 ++++++++++++++++--- .../YData/Client/InternalResponse+Vapor.swift | 2 ++ Sources/YData/Client/InternalResponse.swift | 8 +++++-- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Sources/YData/Client/InternalClient.swift b/Sources/YData/Client/InternalClient.swift index 398d0fa..b0cd960 100644 --- a/Sources/YData/Client/InternalClient.swift +++ b/Sources/YData/Client/InternalClient.swift @@ -23,11 +23,12 @@ public extension InternalClient { var scheme: URI.Scheme { URI.Scheme("http") } var basePath: String? { nil } - func send(_ request: Request) -> EventLoopFuture { + func send(_ request: Request) -> EventLoopFuture + where Request: InternalRequest, Response: InternalResponse { let clientRequest = buildClientRequest(for: request) - return httpClient.send(buildClientRequest(for: request)) - .always { self.logger.info("response for request \(clientRequest.url): \($0)") } + return httpClient.send(clientRequest) + .always { self.logger.info("response for request \(clientRequest.url): \($0.safeDescription)") } .mapToInternalResponse() } @@ -69,3 +70,18 @@ private extension EventLoopFuture where Value: InternalResponse { } } } + +extension Result: SafeStringConvertible { + public var safeDescription: String { + switch self { + case .failure(let error): + return "\(error)" + case .success(let value): + if let value = value as? SafeStringConvertible { + return value.safeDescription + } + + return "\(value)" + } + } +} diff --git a/Sources/YData/Client/InternalResponse+Vapor.swift b/Sources/YData/Client/InternalResponse+Vapor.swift index 1952049..03149e4 100644 --- a/Sources/YData/Client/InternalResponse+Vapor.swift +++ b/Sources/YData/Client/InternalResponse+Vapor.swift @@ -80,3 +80,5 @@ extension Internal.SuccessResponse: ResponseEncodable { return request.eventLoop.makeSucceededFuture(response) } } + +extension ClientResponse: SafeStringConvertible {} diff --git a/Sources/YData/Client/InternalResponse.swift b/Sources/YData/Client/InternalResponse.swift index 29b062c..39648ca 100644 --- a/Sources/YData/Client/InternalResponse.swift +++ b/Sources/YData/Client/InternalResponse.swift @@ -126,8 +126,12 @@ public extension Internal.SuccessResponse { } } -public extension CustomStringConvertible where Self: InternalResponse { - var description: String { +public protocol SafeStringConvertible { + var safeDescription: String { get } +} + +public extension SafeStringConvertible where Self: InternalResponse { + var safeDescription: String { var desc = ["HTTP/1.1 \(status.code) \(status.reasonPhrase)"] desc += self.headers.map { "\($0.name): \($0.value)" } return desc.joined(separator: "\n")