@@ -91,16 +91,13 @@ extension HTTPClient {
91
91
public var version : HTTPVersion
92
92
/// Request HTTP method, defaults to `GET`.
93
93
public var method : HTTPMethod
94
- /// Remote URL.
95
- public var url : URL
96
- /// Remote HTTP scheme, resolved from `URL`.
97
- public var scheme : String
98
- /// Remote host, resolved from `URL`.
99
- public var host : String
100
94
/// Request custom HTTP Headers, defaults to no headers.
101
95
public var headers : HTTPHeaders
102
96
/// Request body, defaults to no body.
103
97
public var body : Body ?
98
+ private var _url : URL !
99
+ private var _scheme : String !
100
+ private var _host : String !
104
101
105
102
/// Create HTTP request.
106
103
///
@@ -136,7 +133,15 @@ extension HTTPClient {
136
133
/// - `unsupportedScheme` if URL does contains unsupported HTTP scheme.
137
134
/// - `emptyHost` if URL does not contains a host.
138
135
public init ( url: URL , version: HTTPVersion = HTTPVersion ( major: 1 , minor: 1 ) , method: HTTPMethod = . GET, headers: HTTPHeaders = HTTPHeaders ( ) , body: Body ? = nil ) throws {
139
- guard let scheme = url. scheme else {
136
+ self . version = version
137
+ self . method = method
138
+ self . headers = headers
139
+ self . body = body
140
+ try self . setURL ( url)
141
+ }
142
+
143
+ public mutating func setURL( _ url: URL ) throws {
144
+ guard let scheme = url. scheme? . lowercased ( ) else {
140
145
throw HTTPClientError . emptyScheme
141
146
}
142
147
@@ -148,26 +153,37 @@ extension HTTPClient {
148
153
throw HTTPClientError . emptyHost
149
154
}
150
155
151
- self . version = version
152
- self . method = method
153
- self . url = url
154
- self . scheme = scheme
155
- self . host = host
156
- self . headers = headers
157
- self . body = body
156
+ self . _url = url
157
+ self . _scheme = scheme
158
+ self . _host = host
159
+ }
160
+
161
+ /// Remote URL.
162
+ public var url : URL {
163
+ return self . _url
164
+ }
165
+
166
+ /// Remote HTTP scheme, resolved from `URL`.
167
+ public var scheme : String {
168
+ return self . _scheme
169
+ }
170
+
171
+ /// Remote host, resolved from `URL`.
172
+ public var host : String {
173
+ return self . _host
158
174
}
159
175
160
176
/// Whether request will be executed using secure socket.
161
177
public var useTLS : Bool {
162
- return self . url . scheme == " https "
178
+ return self . scheme == " https "
163
179
}
164
180
165
181
/// Resolved port.
166
182
public var port : Int {
167
183
return self . url. port ?? ( self . useTLS ? 443 : 80 )
168
184
}
169
185
170
- static func isSchemeSupported( scheme: String ? ) -> Bool {
186
+ static func isSchemeSupported( scheme: String ) -> Bool {
171
187
return scheme == " http " || scheme == " https "
172
188
}
173
189
}
@@ -640,7 +656,7 @@ internal struct RedirectHandler<T> {
640
656
return nil
641
657
}
642
658
643
- guard HTTPClient . Request. isSchemeSupported ( scheme: url . scheme) else {
659
+ guard HTTPClient . Request. isSchemeSupported ( scheme: request . scheme) else {
644
660
return nil
645
661
}
646
662
@@ -655,18 +671,10 @@ internal struct RedirectHandler<T> {
655
671
let originalURL = self . request. url
656
672
657
673
var request = self . request
658
- request. url = redirectURL
659
-
660
- if let redirectHost = redirectURL. host {
661
- request. host = redirectHost
662
- } else {
663
- preconditionFailure ( " redirectURL doesn't contain a host " )
664
- }
665
-
666
- if let redirectScheme = redirectURL. scheme {
667
- request. scheme = redirectScheme
668
- } else {
669
- preconditionFailure ( " redirectURL doesn't contain a scheme " )
674
+ do {
675
+ try request. setURL ( redirectURL)
676
+ } catch {
677
+ return promise. fail ( error)
670
678
}
671
679
672
680
var convertToGet = false
0 commit comments