From e6b388b83f0bd93da0281979da21fc1c46db8aa2 Mon Sep 17 00:00:00 2001 From: Sichan Yoo Date: Tue, 28 May 2024 17:17:12 -0700 Subject: [PATCH] Use serial queue & hidden property to make getter & setter for HttpResponse.statusCode thread-safe. --- .../DefaultSDKRuntimeConfiguration.swift | 2 +- .../Networking/Http/HttpResponse.swift | 21 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Sources/ClientRuntime/Config/DefaultSDKRuntimeConfiguration.swift b/Sources/ClientRuntime/Config/DefaultSDKRuntimeConfiguration.swift index 2f3197c00..b90739be5 100644 --- a/Sources/ClientRuntime/Config/DefaultSDKRuntimeConfiguration.swift +++ b/Sources/ClientRuntime/Config/DefaultSDKRuntimeConfiguration.swift @@ -86,7 +86,7 @@ public extension DefaultSDKRuntimeConfiguration { static func makeClient( httpClientConfiguration: HttpClientConfiguration = defaultHttpClientConfiguration ) -> HTTPClient { - #if os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) || os(macOS) + #if os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) //|| os(macOS) return URLSessionHTTPClient(httpClientConfiguration: httpClientConfiguration) #else let connectTimeoutMs = httpClientConfiguration.connectTimeout.map { UInt32($0 * 1000) } diff --git a/Sources/ClientRuntime/Networking/Http/HttpResponse.swift b/Sources/ClientRuntime/Networking/Http/HttpResponse.swift index 39f598b76..672792d75 100644 --- a/Sources/ClientRuntime/Networking/Http/HttpResponse.swift +++ b/Sources/ClientRuntime/Networking/Http/HttpResponse.swift @@ -7,22 +7,37 @@ import protocol SmithyReadWrite.WireDataProviding import AwsCommonRuntimeKit +import class Foundation.DispatchQueue public class HttpResponse: HttpUrlResponse, ResponseMessage { public var headers: Headers public var body: ByteStream - public var statusCode: HttpStatusCode + + private var _statusCode: HttpStatusCode + private let statusCodeQueue = DispatchQueue(label: "statusCodeSerialQueue") + public var statusCode: HttpStatusCode { + get { + statusCodeQueue.sync { + return _statusCode + } + } + set { + statusCodeQueue.sync { + self._statusCode = newValue + } + } + } public init(headers: Headers = .init(), statusCode: HttpStatusCode = .processing, body: ByteStream = .noStream) { self.headers = headers - self.statusCode = statusCode + self._statusCode = statusCode self.body = body } public init(headers: Headers = .init(), body: ByteStream, statusCode: HttpStatusCode) { self.body = body - self.statusCode = statusCode + self._statusCode = statusCode self.headers = headers } }