@@ -89,16 +89,19 @@ extension HTTPClient {
89
89
/// Represent HTTP request.
90
90
public struct Request {
91
91
/// Request HTTP version, defaults to `HTTP/1.1`.
92
- public var version : HTTPVersion
92
+ public let version : HTTPVersion
93
93
/// Request HTTP method, defaults to `GET`.
94
- public var method : HTTPMethod
94
+ public let method : HTTPMethod
95
+ /// Remote URL.
96
+ public let url : URL
97
+ /// Remote HTTP scheme, resolved from `URL`.
98
+ public let scheme : String
99
+ /// Remote host, resolved from `URL`.
100
+ public let host : String
95
101
/// Request custom HTTP Headers, defaults to no headers.
96
102
public var headers : HTTPHeaders
97
103
/// Request body, defaults to no body.
98
104
public var body : Body ?
99
- private var _url : URL !
100
- private var _scheme : String !
101
- private var _host : String !
102
105
103
106
/// Create HTTP request.
104
107
///
@@ -134,14 +137,6 @@ extension HTTPClient {
134
137
/// - `unsupportedScheme` if URL does contains unsupported HTTP scheme.
135
138
/// - `emptyHost` if URL does not contains a host.
136
139
public init ( url: URL , version: HTTPVersion = HTTPVersion ( major: 1 , minor: 1 ) , method: HTTPMethod = . GET, headers: HTTPHeaders = HTTPHeaders ( ) , body: Body ? = nil ) throws {
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
140
guard let scheme = url. scheme? . lowercased ( ) else {
146
141
throw HTTPClientError . emptyScheme
147
142
}
@@ -154,24 +149,13 @@ extension HTTPClient {
154
149
throw HTTPClientError . emptyHost
155
150
}
156
151
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
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
175
159
}
176
160
177
161
/// Whether request will be executed using secure socket.
@@ -665,14 +649,7 @@ internal struct RedirectHandler<T> {
665
649
}
666
650
667
651
func redirect( status: HTTPResponseStatus , to redirectURL: URL , promise: EventLoopPromise < T > ) {
668
- let originalURL = self . request. url
669
-
670
- var request = self . request
671
- do {
672
- try request. setURL ( redirectURL)
673
- } catch {
674
- return promise. fail ( error)
675
- }
652
+ let originalRequest = self . request
676
653
677
654
var convertToGet = false
678
655
if status == . seeOther, request. method != . HEAD {
@@ -681,20 +658,29 @@ internal struct RedirectHandler<T> {
681
658
convertToGet = true
682
659
}
683
660
661
+ var method = originalRequest. method
662
+ var headers = originalRequest. headers
663
+ var body = originalRequest. body
664
+
684
665
if convertToGet {
685
- request . method = . GET
686
- request . body = nil
687
- request . headers. remove ( name: " Content-Length " )
688
- request . headers. remove ( name: " Content-Type " )
666
+ method = . GET
667
+ body = nil
668
+ headers. remove ( name: " Content-Length " )
669
+ headers. remove ( name: " Content-Type " )
689
670
}
690
671
691
- if !originalURL . hasTheSameOrigin ( as: redirectURL) {
692
- request . headers. remove ( name: " Origin " )
693
- request . headers. remove ( name: " Cookie " )
694
- request . headers. remove ( name: " Authorization " )
695
- request . headers. remove ( name: " Proxy-Authorization " )
672
+ if !originalRequest . url . hasTheSameOrigin ( as: redirectURL) {
673
+ headers. remove ( name: " Origin " )
674
+ headers. remove ( name: " Cookie " )
675
+ headers. remove ( name: " Authorization " )
676
+ headers. remove ( name: " Proxy-Authorization " )
696
677
}
697
678
698
- return self . execute ( request) . futureResult. cascade ( to: promise)
679
+ do {
680
+ let newRequest = try HTTPClient . Request ( url: redirectURL, version: originalRequest. version, method: method, headers: headers, body: body)
681
+ return self . execute ( newRequest) . futureResult. cascade ( to: promise)
682
+ } catch {
683
+ return promise. fail ( error)
684
+ }
699
685
}
700
686
}
0 commit comments