@@ -60,13 +60,14 @@ extension HTTPClient {
60
60
}
61
61
62
62
public struct Request {
63
- public var version : HTTPVersion
64
- public var method : HTTPMethod
65
- public var url : URL
66
- public var scheme : String
67
- public var host : String
63
+ public let version : HTTPVersion
64
+ public let method : HTTPMethod
65
+ public let url : URL
68
66
public var headers : HTTPHeaders
69
67
public var body : Body ?
68
+
69
+ internal let scheme : String
70
+ internal let host : String
70
71
71
72
public init ( url: String , version: HTTPVersion = HTTPVersion ( major: 1 , minor: 1 ) , method: HTTPMethod = . GET, headers: HTTPHeaders = HTTPHeaders ( ) , body: Body ? = nil ) throws {
72
73
guard let url = URL ( string: url) else {
@@ -77,7 +78,7 @@ extension HTTPClient {
77
78
}
78
79
79
80
public init ( url: URL , version: HTTPVersion = HTTPVersion ( major: 1 , minor: 1 ) , method: HTTPMethod = . GET, headers: HTTPHeaders = HTTPHeaders ( ) , body: Body ? = nil ) throws {
80
- guard let scheme = url. scheme else {
81
+ guard let scheme = url. scheme? . lowercased ( ) else {
81
82
throw HTTPClientError . emptyScheme
82
83
}
83
84
@@ -99,14 +100,14 @@ extension HTTPClient {
99
100
}
100
101
101
102
public var useTLS : Bool {
102
- return self . url . scheme == " https "
103
+ return self . scheme == " https "
103
104
}
104
105
105
106
public var port : Int {
106
107
return self . url. port ?? ( self . useTLS ? 443 : 80 )
107
108
}
108
109
109
- static func isSchemeSupported( scheme: String ? ) -> Bool {
110
+ static func isSchemeSupported( scheme: String ) -> Bool {
110
111
return scheme == " http " || scheme == " https "
111
112
}
112
113
}
@@ -514,7 +515,7 @@ internal struct RedirectHandler<T> {
514
515
return nil
515
516
}
516
517
517
- guard HTTPClient . Request. isSchemeSupported ( scheme: url . scheme) else {
518
+ guard HTTPClient . Request. isSchemeSupported ( scheme: request . scheme) else {
518
519
return nil
519
520
}
520
521
@@ -526,44 +527,38 @@ internal struct RedirectHandler<T> {
526
527
}
527
528
528
529
func redirect( status: HTTPResponseStatus , to redirectURL: URL , promise: EventLoopPromise < T > ) {
529
- let originalURL = self . request. url
530
-
531
- var request = self . request
532
- request. url = redirectURL
533
-
534
- if let redirectHost = redirectURL. host {
535
- request. host = redirectHost
536
- } else {
537
- preconditionFailure ( " redirectURL doesn't contain a host " )
538
- }
539
-
540
- if let redirectScheme = redirectURL. scheme {
541
- request. scheme = redirectScheme
542
- } else {
543
- preconditionFailure ( " redirectURL doesn't contain a scheme " )
544
- }
530
+ let originalRequest = self . request
545
531
546
532
var convertToGet = false
547
533
if status == . seeOther, request. method != . HEAD {
548
534
convertToGet = true
549
535
} else if status == . movedPermanently || status == . found, request. method == . POST {
550
536
convertToGet = true
551
537
}
552
-
538
+
539
+ var method = originalRequest. method
540
+ var headers = originalRequest. headers
541
+ var body = originalRequest. body
542
+
553
543
if convertToGet {
554
- request . method = . GET
555
- request . body = nil
556
- request . headers. remove ( name: " Content-Length " )
557
- request . headers. remove ( name: " Content-Type " )
544
+ method = . GET
545
+ body = nil
546
+ headers. remove ( name: " Content-Length " )
547
+ headers. remove ( name: " Content-Type " )
558
548
}
559
549
560
- if !originalURL. hasTheSameOrigin ( as: redirectURL) {
561
- request. headers. remove ( name: " Origin " )
562
- request. headers. remove ( name: " Cookie " )
563
- request. headers. remove ( name: " Authorization " )
564
- request. headers. remove ( name: " Proxy-Authorization " )
550
+ if !originalRequest. url. hasTheSameOrigin ( as: redirectURL) {
551
+ headers. remove ( name: " Origin " )
552
+ headers. remove ( name: " Cookie " )
553
+ headers. remove ( name: " Authorization " )
554
+ headers. remove ( name: " Proxy-Authorization " )
555
+ }
556
+
557
+ do {
558
+ let request = try HTTPClient . Request ( url: redirectURL, version: originalRequest. version, method: method, headers: headers, body: body)
559
+ return self . execute ( request) . futureResult. cascade ( to: promise)
560
+ } catch {
561
+ return promise. fail ( error)
565
562
}
566
-
567
- return self . execute ( request) . futureResult. cascade ( to: promise)
568
563
}
569
564
}
0 commit comments