From 707dcc3daae3c6bf32d8d29ebe7bb343af21d002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20Tr=C3=A9guier?= Date: Fri, 6 Sep 2024 12:44:18 +0200 Subject: [PATCH] Make requests idempotent --- Fyreplace/Config/Config.swift | 12 ++++++++++-- Fyreplace/Data/RequestIdMiddleware.swift | 17 +++++++++++++++++ Fyreplace/Extensions/HTTPField.swift | 5 +++++ Fyreplace/Extensions/String.swift | 7 +++++++ 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 Fyreplace/Data/RequestIdMiddleware.swift create mode 100644 Fyreplace/Extensions/HTTPField.swift create mode 100644 Fyreplace/Extensions/String.swift diff --git a/Fyreplace/Config/Config.swift b/Fyreplace/Config/Config.swift index ee5192e..98f8b80 100644 --- a/Fyreplace/Config/Config.swift +++ b/Fyreplace/Config/Config.swift @@ -83,10 +83,18 @@ struct Config { } func client(for environment: ServerEnvironment) -> Client { + let configuration = URLSessionConfiguration.default + configuration.waitsForConnectivity = true + + #if os(iOS) + configuration.multipathServiceType = .handover + #endif + return Client( serverURL: url(for: environment), - transport: URLSessionTransport(), - middlewares: [AuthenticationMiddleware()] + configuration: .init(dateTranscoder: .iso8601WithFractionalSeconds), + transport: URLSessionTransport(configuration: .init(session: .init(configuration: configuration))), + middlewares: [RequestIdMiddleware(), AuthenticationMiddleware()] ) } } diff --git a/Fyreplace/Data/RequestIdMiddleware.swift b/Fyreplace/Data/RequestIdMiddleware.swift new file mode 100644 index 0000000..628fb54 --- /dev/null +++ b/Fyreplace/Data/RequestIdMiddleware.swift @@ -0,0 +1,17 @@ +import Foundation +import HTTPTypes +import OpenAPIRuntime + +struct RequestIdMiddleware: ClientMiddleware { + func intercept( + _ request: HTTPRequest, + body: HTTPBody?, + baseURL: URL, + operationID _: String, + next: @Sendable (HTTPRequest, HTTPBody?, URL) async throws -> (HTTPResponse, HTTPBody?) + ) async throws -> (HTTPResponse, HTTPBody?) { + var request = request + request.headerFields[.xRequestId] = UUID().uuidString + return try await next(request, body, baseURL) + } +} diff --git a/Fyreplace/Extensions/HTTPField.swift b/Fyreplace/Extensions/HTTPField.swift new file mode 100644 index 0000000..6a41dc1 --- /dev/null +++ b/Fyreplace/Extensions/HTTPField.swift @@ -0,0 +1,5 @@ +import HTTPTypes + +extension HTTPField.Name { + static let xRequestId = Self("X-Request-Id")! +} diff --git a/Fyreplace/Extensions/String.swift b/Fyreplace/Extensions/String.swift new file mode 100644 index 0000000..afb3276 --- /dev/null +++ b/Fyreplace/Extensions/String.swift @@ -0,0 +1,7 @@ +import Foundation + +extension String { + static var randomUuid: String { + UUID().uuidString + } +}