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