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