@@ -60,14 +60,13 @@ extension HTTPClient {
60
60
}
61
61
62
62
public struct Request {
63
- public let version : HTTPVersion
64
- public let method : HTTPMethod
65
- public let url : URL
63
+ public var version : HTTPVersion
64
+ public var method : HTTPMethod
66
65
public var headers : HTTPHeaders
67
66
public var body : Body ?
68
-
69
- internal let scheme : String
70
- internal let host : String
67
+ private var _url : URL !
68
+ private var _schema : String !
69
+ private var _host : String !
71
70
72
71
public init ( url: String , version: HTTPVersion = HTTPVersion ( major: 1 , minor: 1 ) , method: HTTPMethod = . GET, headers: HTTPHeaders = HTTPHeaders ( ) , body: Body ? = nil ) throws {
73
72
guard let url = URL ( string: url) else {
@@ -78,25 +77,41 @@ extension HTTPClient {
78
77
}
79
78
80
79
public init ( url: URL , version: HTTPVersion = HTTPVersion ( major: 1 , minor: 1 ) , method: HTTPMethod = . GET, headers: HTTPHeaders = HTTPHeaders ( ) , body: Body ? = nil ) throws {
80
+ self . version = version
81
+ self . method = method
82
+ self . headers = headers
83
+ self . body = body
84
+ try self . setUrl ( url)
85
+ }
86
+
87
+ public mutating func setUrl( _ url: URL ) throws {
81
88
guard let scheme = url. scheme? . lowercased ( ) else {
82
89
throw HTTPClientError . emptyScheme
83
90
}
84
91
85
- guard Request . isSchemeSupported ( scheme: scheme) else {
92
+ guard HTTPClient . Request. isSchemeSupported ( scheme: scheme) else {
86
93
throw HTTPClientError . unsupportedScheme ( scheme)
87
94
}
88
95
89
96
guard let host = url. host else {
90
97
throw HTTPClientError . emptyHost
91
98
}
92
99
93
- self . version = version
94
- self . method = method
95
- self . url = url
96
- self . scheme = scheme
97
- self . host = host
98
- self . headers = headers
99
- self . body = body
100
+ self . _url = url
101
+ self . _schema = scheme
102
+ self . _host = host
103
+ }
104
+
105
+ public var url : URL {
106
+ return self . _url
107
+ }
108
+
109
+ public var scheme : String {
110
+ return self . _schema
111
+ }
112
+
113
+ public var host : String {
114
+ return self . _host
100
115
}
101
116
102
117
public var useTLS : Bool {
@@ -527,38 +542,36 @@ internal struct RedirectHandler<T> {
527
542
}
528
543
529
544
func redirect( status: HTTPResponseStatus , to redirectURL: URL , promise: EventLoopPromise < T > ) {
530
- let originalRequest = self . request
545
+ let originalURL = self . request. url
546
+
547
+ var request = self . request
548
+ do {
549
+ try request. setUrl ( redirectURL)
550
+ } catch {
551
+ return promise. fail ( error)
552
+ }
531
553
532
554
var convertToGet = false
533
555
if status == . seeOther, request. method != . HEAD {
534
556
convertToGet = true
535
557
} else if status == . movedPermanently || status == . found, request. method == . POST {
536
558
convertToGet = true
537
559
}
538
-
539
- var method = originalRequest. method
540
- var headers = originalRequest. headers
541
- var body = originalRequest. body
542
-
560
+
543
561
if convertToGet {
544
- method = . GET
545
- body = nil
546
- headers. remove ( name: " Content-Length " )
547
- headers. remove ( name: " Content-Type " )
562
+ request . method = . GET
563
+ request . body = nil
564
+ request . headers. remove ( name: " Content-Length " )
565
+ request . headers. remove ( name: " Content-Type " )
548
566
}
549
567
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)
568
+ if !originalURL. hasTheSameOrigin ( as: redirectURL) {
569
+ request. headers. remove ( name: " Origin " )
570
+ request. headers. remove ( name: " Cookie " )
571
+ request. headers. remove ( name: " Authorization " )
572
+ request. headers. remove ( name: " Proxy-Authorization " )
562
573
}
574
+
575
+ return self . execute ( request) . futureResult. cascade ( to: promise)
563
576
}
564
577
}
0 commit comments