@@ -87,16 +87,14 @@ extension HTTPClient {
87
87
88
88
/// Represent HTTP request.
89
89
public struct Request {
90
- /// Request HTTP version, defaults to `HTTP/1.1`.
91
- public var version : HTTPVersion
92
90
/// Request HTTP method, defaults to `GET`.
93
- public var method : HTTPMethod
91
+ public let method : HTTPMethod
94
92
/// Remote URL.
95
- public var url : URL
93
+ public let url : URL
96
94
/// Remote HTTP scheme, resolved from `URL`.
97
- public var scheme : String
95
+ public let scheme : String
98
96
/// Remote host, resolved from `URL`.
99
- public var host : String
97
+ public let host : String
100
98
/// Request custom HTTP Headers, defaults to no headers.
101
99
public var headers : HTTPHeaders
102
100
/// Request body, defaults to no body.
@@ -115,12 +113,12 @@ extension HTTPClient {
115
113
/// - `emptyScheme` if URL does not contain HTTP scheme.
116
114
/// - `unsupportedScheme` if URL does contains unsupported HTTP scheme.
117
115
/// - `emptyHost` if URL does not contains a host.
118
- public init ( url: String , version : HTTPVersion = HTTPVersion ( major : 1 , minor : 1 ) , method: HTTPMethod = . GET, headers: HTTPHeaders = HTTPHeaders ( ) , body: Body ? = nil ) throws {
116
+ public init ( url: String , method: HTTPMethod = . GET, headers: HTTPHeaders = HTTPHeaders ( ) , body: Body ? = nil ) throws {
119
117
guard let url = URL ( string: url) else {
120
118
throw HTTPClientError . invalidURL
121
119
}
122
120
123
- try self . init ( url: url, version : version , method: method, headers: headers, body: body)
121
+ try self . init ( url: url, method: method, headers: headers, body: body)
124
122
}
125
123
126
124
/// Create an HTTP `Request`.
@@ -135,8 +133,8 @@ extension HTTPClient {
135
133
/// - `emptyScheme` if URL does not contain HTTP scheme.
136
134
/// - `unsupportedScheme` if URL does contains unsupported HTTP scheme.
137
135
/// - `emptyHost` if URL does not contains a host.
138
- 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
+ public init ( url: URL , method: HTTPMethod = . GET, headers: HTTPHeaders = HTTPHeaders ( ) , body: Body ? = nil ) throws {
137
+ guard let scheme = url. scheme? . lowercased ( ) else {
140
138
throw HTTPClientError . emptyScheme
141
139
}
142
140
@@ -148,7 +146,6 @@ extension HTTPClient {
148
146
throw HTTPClientError . emptyHost
149
147
}
150
148
151
- self . version = version
152
149
self . method = method
153
150
self . url = url
154
151
self . scheme = scheme
@@ -159,15 +156,15 @@ extension HTTPClient {
159
156
160
157
/// Whether request will be executed using secure socket.
161
158
public var useTLS : Bool {
162
- return self . url . scheme == " https "
159
+ return self . scheme == " https "
163
160
}
164
161
165
162
/// Resolved port.
166
163
public var port : Int {
167
164
return self . url. port ?? ( self . useTLS ? 443 : 80 )
168
165
}
169
166
170
- static func isSchemeSupported( scheme: String ? ) -> Bool {
167
+ static func isSchemeSupported( scheme: String ) -> Bool {
171
168
return scheme == " http " || scheme == " https "
172
169
}
173
170
}
@@ -444,10 +441,10 @@ internal class TaskHandler<T: HTTPClientResponseDelegate>: ChannelInboundHandler
444
441
self . state = . idle
445
442
let request = unwrapOutboundIn ( data)
446
443
447
- var head = HTTPRequestHead ( version: request . version , method: request. method, uri: request. url. uri)
444
+ var head = HTTPRequestHead ( version: HTTPVersion ( major : 1 , minor : 1 ) , method: request. method, uri: request. url. uri)
448
445
var headers = request. headers
449
446
450
- if request . version . major == 1 , request . version . minor == 1 , !request. headers. contains ( name: " Host " ) {
447
+ if !request. headers. contains ( name: " Host " ) {
451
448
headers. add ( name: " Host " , value: request. host)
452
449
}
453
450
@@ -640,7 +637,7 @@ internal struct RedirectHandler<T> {
640
637
return nil
641
638
}
642
639
643
- guard HTTPClient . Request. isSchemeSupported ( scheme: url . scheme) else {
640
+ guard HTTPClient . Request. isSchemeSupported ( scheme: self . request . scheme) else {
644
641
return nil
645
642
}
646
643
@@ -652,44 +649,38 @@ internal struct RedirectHandler<T> {
652
649
}
653
650
654
651
func redirect( status: HTTPResponseStatus , to redirectURL: URL , promise: EventLoopPromise < T > ) {
655
- let originalURL = self . request. url
656
-
657
- 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 " )
670
- }
652
+ let originalRequest = self . request
671
653
672
654
var convertToGet = false
673
- if status == . seeOther, request. method != . HEAD {
655
+ if status == . seeOther, self . request. method != . HEAD {
674
656
convertToGet = true
675
- } else if status == . movedPermanently || status == . found, request. method == . POST {
657
+ } else if status == . movedPermanently || status == . found, self . request. method == . POST {
676
658
convertToGet = true
677
659
}
678
660
661
+ var method = originalRequest. method
662
+ var headers = originalRequest. headers
663
+ var body = originalRequest. body
664
+
679
665
if convertToGet {
680
- request . method = . GET
681
- request . body = nil
682
- request . headers. remove ( name: " Content-Length " )
683
- request . headers. remove ( name: " Content-Type " )
666
+ method = . GET
667
+ body = nil
668
+ headers. remove ( name: " Content-Length " )
669
+ headers. remove ( name: " Content-Type " )
684
670
}
685
671
686
- if !originalURL . hasTheSameOrigin ( as: redirectURL) {
687
- request . headers. remove ( name: " Origin " )
688
- request . headers. remove ( name: " Cookie " )
689
- request . headers. remove ( name: " Authorization " )
690
- 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 " )
691
677
}
692
678
693
- return self . execute ( request) . futureResult. cascade ( to: promise)
679
+ do {
680
+ let newRequest = try HTTPClient . Request ( url: redirectURL, method: method, headers: headers, body: body)
681
+ return self . execute ( newRequest) . futureResult. cascade ( to: promise)
682
+ } catch {
683
+ return promise. fail ( error)
684
+ }
694
685
}
695
686
}
0 commit comments