@@ -3,9 +3,8 @@ import OSLog
33
44/// A protocol for making authenticated HTTP requests to the WordPress REST API.
55public protocol EditorHTTPClientProtocol : Sendable {
6- func GET( url: URL ) async throws -> ( Data , HTTPURLResponse )
7- func OPTIONS( url: URL ) async throws -> ( Data , HTTPURLResponse )
8- func download( url: URL ) async throws -> ( URL , HTTPURLResponse )
6+ func perform( _ urlRequest: URLRequest ) async throws -> ( Data , HTTPURLResponse )
7+ func download( _ urlRequest: URLRequest ) async throws -> ( URL , HTTPURLResponse )
98}
109
1110/// A delegate for observing HTTP requests made by the editor.
@@ -40,65 +39,58 @@ public actor EditorHTTPClient: EditorHTTPClientProtocol {
4039 private let urlSession : URLSession
4140 private let authHeader : String
4241 private let delegate : EditorHTTPClientDelegate ?
43-
42+ private let requestTimeout : TimeInterval
43+
4444 public init (
4545 urlSession: URLSession ,
4646 authHeader: String ,
47- delegate: EditorHTTPClientDelegate ? = nil
47+ delegate: EditorHTTPClientDelegate ? = nil ,
48+ requestTimeout: TimeInterval = 60 // `URLRequest` default
4849 ) {
4950 self . urlSession = urlSession
5051 self . authHeader = authHeader
5152 self . delegate = delegate
53+ self . requestTimeout = requestTimeout
5254 }
53-
54- public func GET( url: URL ) async throws -> ( Data , HTTPURLResponse ) {
55- var request = URLRequest ( url: url)
56- request. httpMethod = " GET "
57- return try await self . perform ( request: request)
58- }
59-
60- public func OPTIONS( url: URL ) async throws -> ( Data , HTTPURLResponse ) {
61- var request = URLRequest ( url: url)
62- request. httpMethod = " OPTIONS "
63- return try await self . perform ( request: request)
64- }
65-
66- public func download( url: URL ) async throws -> ( URL , HTTPURLResponse ) {
67- var request = URLRequest ( url: url)
68- request. addValue ( self . authHeader, forHTTPHeaderField: " Authorization " )
69-
70- let ( url, response) = try await self . urlSession. download ( for: request)
71-
72- let httpResponse = response as! HTTPURLResponse
73-
74- guard 200 ... 299 ~= httpResponse. statusCode else {
75- throw ClientError . downloadFailed ( statusCode: httpResponse. statusCode)
76- }
77-
78- return ( url, response as! HTTPURLResponse )
79- }
80-
81- private func perform( request: URLRequest ) async throws -> ( Data , HTTPURLResponse ) {
82- var signedRequest = request
83- signedRequest. setValue ( self . authHeader, forHTTPHeaderField: " Authorization " )
84- signedRequest. timeoutInterval = 60
85-
86- let ( data, response) = try await self . urlSession. data ( for: signedRequest)
87- self . delegate? . didPerformRequest ( signedRequest, response: response, data: data)
88-
55+
56+ public func perform( _ urlRequest: URLRequest ) async throws -> ( Data , HTTPURLResponse ) {
57+ var mutableRequest = urlRequest
58+ mutableRequest. setValue ( self . authHeader, forHTTPHeaderField: " Authorization " )
59+ mutableRequest. timeoutInterval = self . requestTimeout
60+
61+ let ( data, response) = try await self . urlSession. data ( for: mutableRequest)
62+ self . delegate? . didPerformRequest ( mutableRequest, response: response, data: data)
63+
8964 let httpResponse = response as! HTTPURLResponse
90-
65+
9166 guard 200 ... 299 ~= httpResponse. statusCode else {
92- Logger . http. error ( " 📡 HTTP error fetching \( request . url!. absoluteString) : \( httpResponse. statusCode) " )
93-
67+ Logger . http. error ( " 📡 HTTP error fetching \( mutableRequest . url!. absoluteString) : \( httpResponse. statusCode) " )
68+
9469 if let wpError = try ? JSONDecoder ( ) . decode ( WPError . self, from: data) {
9570 throw ClientError . wpError ( wpError)
9671 }
97-
72+
9873 throw ClientError . unknown ( response: data, statusCode: httpResponse. statusCode)
9974 }
100-
75+
10176 return ( data, httpResponse)
10277 }
103-
78+
79+ public func download( _ urlRequest: URLRequest ) async throws -> ( URL , HTTPURLResponse ) {
80+ var mutableRequest = urlRequest
81+ mutableRequest. addValue ( self . authHeader, forHTTPHeaderField: " Authorization " )
82+ mutableRequest. timeoutInterval = self . requestTimeout
83+
84+ let ( url, response) = try await self . urlSession. download ( for: mutableRequest)
85+
86+ let httpResponse = response as! HTTPURLResponse
87+
88+ guard 200 ... 299 ~= httpResponse. statusCode else {
89+ Logger . http. error ( " 📡 HTTP error fetching \( mutableRequest. url!. absoluteString) : \( httpResponse. statusCode) " )
90+
91+ throw ClientError . downloadFailed ( statusCode: httpResponse. statusCode)
92+ }
93+
94+ return ( url, response as! HTTPURLResponse )
95+ }
10496}
0 commit comments