Skip to content

Commit 5bba6e3

Browse files
committed
fix Test
1 parent 1b370ff commit 5bba6e3

File tree

87 files changed

+546
-405
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+546
-405
lines changed

Sources/Auth/AuthClient.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,10 +1122,12 @@ public final class AuthClient: Sendable {
11221122

11231123
if let jwt {
11241124
request.headerFields[.authorization] = "Bearer \(jwt)"
1125+
let (data, _) = try await api.execute(for: request, from: nil)
1126+
return try configuration.decoder.decode(User.self, from: data)
1127+
} else {
1128+
let (data, _) = try await api.authorizedExecute(for: request, from: nil)
1129+
return try configuration.decoder.decode(User.self, from: data)
11251130
}
1126-
1127-
let (data, _) = try await api.authorizedExecute(for: request, from: nil)
1128-
return try configuration.decoder.decode(User.self, from: data)
11291131
}
11301132

11311133
/// Updates user data, if there is a logged in user.

Sources/Auth/AuthClientConfiguration.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ extension AuthClient {
8383
},
8484
autoRefreshToken: Bool = AuthClient.Configuration.defaultAutoRefreshToken
8585
) {
86-
let headers = headers.merging(with: Configuration.defaultHeaders)
86+
let headers = Configuration.defaultHeaders.merging(headers) { $1 }
8787

8888
self.url = url ?? defaultAuthURL
8989
self.headers = headers

Sources/Auth/Internal/APIClient.swift

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,9 @@ struct APIClient: Sendable {
3535
func execute(
3636
for request: HTTPRequest,
3737
from bodyData: Data?
38-
) async throws -> (
39-
Data,
40-
HTTPResponse
41-
) {
38+
) async throws -> (Data, HTTPResponse) {
4239
var request = request
43-
request.headerFields = HTTPFields(configuration.headers).merging(with: request.headerFields)
40+
request.headerFields = request.headerFields.merging(configuration.headers) { $1 }
4441

4542
if request.headerFields[.apiVersionHeaderName] == nil {
4643
request.headerFields[.apiVersionHeaderName] = apiVersions[._20240101]!.name.rawValue

Sources/Functions/FunctionsClient.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,12 @@ public final class FunctionsClient: Sendable {
236236
url: url
237237
.appendingPathComponent(functionName)
238238
.appendingQueryItems(options.query),
239-
headerFields: mutableState.headers.merging(with: options.headers)
239+
headerFields: mutableState.headers.merging(options.headers) { $1 }
240240
)
241+
242+
if options.body != nil && request.headerFields[.contentType] == nil {
243+
request.headerFields[.contentType] = "application/json"
244+
}
241245

242246
if let region = options.region ?? region {
243247
request.headerFields[.xRegion] = region

Sources/Functions/Types.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public struct FunctionInvokeOptions: Sendable {
6565
}
6666

6767
self.method = method
68-
self.headers = defaultHeaders.merging(with: headers)
68+
self.headers = defaultHeaders.merging(headers) { $1 }
6969
self.region = region
7070
self.query = query
7171
}

Sources/Helpers/HTTP/HTTPClient.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,12 @@ package actor HTTPClient: HTTPClientType {
3232
_ request: HTTPRequest,
3333
_ bodyData: Data?
3434
) async throws -> (Data, HTTPResponse) {
35-
var next: @Sendable (HTTPRequest, Data?) async throws -> (Data, HTTPResponse) = {
36-
return try await self.fetch($0, $1)
35+
var next: @Sendable (HTTPRequest, Data?) async throws -> (Data, HTTPResponse) = { request, bodyData in
36+
var request = request
37+
if bodyData != nil && request.headerFields[.contentType] == nil {
38+
request.headerFields[.contentType] = "application/json"
39+
}
40+
return try await self.fetch(request, bodyData)
3741
}
3842

3943
for interceptor in interceptors.reversed() {

Sources/Helpers/HTTP/HTTPFields.swift

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,21 @@ extension HTTPFields {
99
return .init(keyValues, uniquingKeysWith: { $1 })
1010
}
1111

12-
package mutating func merge(with other: Self) {
13-
for field in other {
14-
self[field.name] = field.value
15-
}
12+
package mutating func merge(
13+
_ other: Self,
14+
uniquingKeysWith combine: (String, String) throws -> String
15+
) rethrows {
16+
self = try self.merging(other, uniquingKeysWith: combine)
1617
}
17-
18-
package func merging(with other: Self) -> Self {
18+
19+
package func merging(
20+
_ other: Self,
21+
uniquingKeysWith combine: (String, String) throws -> String
22+
) rethrows -> HTTPFields {
1923
var copy = self
2024

2125
for field in other {
22-
copy[field.name] = field.value
26+
copy[field.name] = try combine(self[field.name] ?? "", field.value)
2327
}
2428

2529
return copy

Sources/Helpers/HTTP/LoggerInterceptor.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ package struct LoggerInterceptor: HTTPClientInterceptor {
3131
)
3232

3333
do {
34+
var request = request
35+
if bodyData != nil && request.headerFields[.contentType] == nil {
36+
request.headerFields[.contentType] = "application/json"
37+
}
3438
let (data, response) = try await next(request, bodyData)
3539
logger.verbose(
3640
"""
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import Foundation
2+
import HTTPTypes
3+
4+
#if canImport(FoundationNetworking)
5+
import FoundationNetworking
6+
#endif
7+
8+
#if !os(WASI)
9+
10+
extension URLSessionTask {
11+
/// The original HTTP request this task was created with.
12+
public var originalHTTPRequest: HTTPRequest? {
13+
self.originalRequest?.httpRequest
14+
}
15+
16+
/// The current HTTP request -- may differ from the `originalHTTPRequest` due to HTTP redirection.
17+
public var currentHTTPRequest: HTTPRequest? {
18+
self.currentRequest?.httpRequest
19+
}
20+
21+
/// The HTTP response received from the server.
22+
public var httpResponse: HTTPResponse? {
23+
(self.response as? HTTPURLResponse)?.httpResponse
24+
}
25+
}
26+
27+
private enum HTTPTypeConversionError: Error {
28+
case failedToConvertHTTPRequestToURLRequest
29+
case failedToConvertURLResponseToHTTPResponse
30+
}
31+
32+
#endif
33+
34+
#if canImport(FoundationNetworking) && compiler(<6)
35+
36+
@available(macOS 12.0, iOS 15.0, watchOS 8.0, tvOS 15.0, *)
37+
extension URLSession {
38+
/// Convenience method to load data using an `HTTPRequest`; creates and resumes a `URLSessionDataTask` internally.
39+
///
40+
/// - Parameter request: The `HTTPRequest` for which to load data.
41+
/// - Parameter delegate: Task-specific delegate.
42+
/// - Returns: Data and response.
43+
public func data(
44+
for request: HTTPRequest,
45+
delegate: (any URLSessionTaskDelegate)? = nil
46+
) async throws -> (Data, HTTPResponse) {
47+
guard let urlRequest = URLRequest(httpRequest: request) else {
48+
throw HTTPTypeConversionError.failedToConvertHTTPRequestToURLRequest
49+
}
50+
let (data, urlResponse) = try await self.data(for: urlRequest, delegate: delegate)
51+
guard let response = (urlResponse as? HTTPURLResponse)?.httpResponse else {
52+
throw HTTPTypeConversionError.failedToConvertURLResponseToHTTPResponse
53+
}
54+
return (data, response)
55+
}
56+
57+
/// Convenience method to upload data using an `HTTPRequest`, creates and resumes a `URLSessionUploadTask` internally.
58+
///
59+
/// - Parameter request: The `HTTPRequest` for which to upload data.
60+
/// - Parameter bodyData: Data to upload.
61+
/// - Parameter delegate: Task-specific delegate.
62+
/// - Returns: Data and response.
63+
public func upload(
64+
for request: HTTPRequest,
65+
from bodyData: Data,
66+
delegate: (any URLSessionTaskDelegate)? = nil
67+
) async throws -> (Data, HTTPResponse) {
68+
guard let urlRequest = URLRequest(httpRequest: request) else {
69+
throw HTTPTypeConversionError.failedToConvertHTTPRequestToURLRequest
70+
}
71+
let (data, urlResponse) = try await self.upload(for: urlRequest, from: bodyData, delegate: delegate)
72+
guard let response = (urlResponse as? HTTPURLResponse)?.httpResponse else {
73+
throw HTTPTypeConversionError.failedToConvertURLResponseToHTTPResponse
74+
}
75+
return (data, response)
76+
}
77+
}
78+
79+
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
80+
extension URLSession {
81+
/// Convenience method to load data using an `HTTPRequest`; creates and resumes a `URLSessionDataTask` internally.
82+
///
83+
/// - Parameter request: The `HTTPRequest` for which to load data.
84+
/// - Returns: Data and response.
85+
public func data(for request: HTTPRequest) async throws -> (Data, HTTPResponse) {
86+
guard let urlRequest = URLRequest(httpRequest: request) else {
87+
throw HTTPTypeConversionError.failedToConvertHTTPRequestToURLRequest
88+
}
89+
let (data, urlResponse) = try await self.data(for: urlRequest)
90+
guard let response = (urlResponse as? HTTPURLResponse)?.httpResponse else {
91+
throw HTTPTypeConversionError.failedToConvertURLResponseToHTTPResponse
92+
}
93+
return (data, response)
94+
}
95+
96+
/// Convenience method to upload data using an `HTTPRequest`, creates and resumes a `URLSessionUploadTask` internally.
97+
///
98+
/// - Parameter request: The `HTTPRequest` for which to upload data.
99+
/// - Parameter bodyData: Data to upload.
100+
/// - Returns: Data and response.
101+
public func upload(for request: HTTPRequest, from bodyData: Data) async throws -> (Data, HTTPResponse) {
102+
guard let urlRequest = URLRequest(httpRequest: request) else {
103+
throw HTTPTypeConversionError.failedToConvertHTTPRequestToURLRequest
104+
}
105+
let (data, urlResponse) = try await self.upload(for: urlRequest, from: bodyData)
106+
guard let response = (urlResponse as? HTTPURLResponse)?.httpResponse else {
107+
throw HTTPTypeConversionError.failedToConvertURLResponseToHTTPResponse
108+
}
109+
return (data, response)
110+
}
111+
}
112+
113+
#endif

Sources/PostgREST/PostgrestBuilder.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public class PostgrestBuilder: @unchecked Sendable {
102102
options: FetchOptions,
103103
decode: (Data) throws -> T
104104
) async throws -> PostgrestResponse<T> {
105-
let request = mutableState.withValue {
105+
let (request, bodyData) = mutableState.withValue {
106106
$0.fetchOptions = options
107107

108108
if $0.fetchOptions.head {
@@ -130,10 +130,10 @@ public class PostgrestBuilder: @unchecked Sendable {
130130
}
131131
}
132132

133-
return $0.request
133+
return ($0.request, $0.bodyData)
134134
}
135135

136-
let (data, response) = try await http.send(request, nil)
136+
let (data, response) = try await http.send(request, bodyData)
137137

138138
guard 200..<300 ~= response.status.code else {
139139
if let error = try? configuration.decoder.decode(PostgrestError.self, from: data) {

0 commit comments

Comments
 (0)