Skip to content

Commit 50fd77d

Browse files
committed
make [more] immutable again
1 parent 1e3e29f commit 50fd77d

File tree

1 file changed

+35
-49
lines changed

1 file changed

+35
-49
lines changed

Sources/AsyncHTTPClient/HTTPHandler.swift

Lines changed: 35 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,19 @@ extension HTTPClient {
8989
/// Represent HTTP request.
9090
public struct Request {
9191
/// Request HTTP version, defaults to `HTTP/1.1`.
92-
public var version: HTTPVersion
92+
public let version: HTTPVersion
9393
/// 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
95101
/// Request custom HTTP Headers, defaults to no headers.
96102
public var headers: HTTPHeaders
97103
/// Request body, defaults to no body.
98104
public var body: Body?
99-
private var _url: URL!
100-
private var _scheme: String!
101-
private var _host: String!
102105

103106
/// Create HTTP request.
104107
///
@@ -134,14 +137,6 @@ extension HTTPClient {
134137
/// - `unsupportedScheme` if URL does contains unsupported HTTP scheme.
135138
/// - `emptyHost` if URL does not contains a host.
136139
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 {
145140
guard let scheme = url.scheme?.lowercased() else {
146141
throw HTTPClientError.emptyScheme
147142
}
@@ -154,24 +149,13 @@ extension HTTPClient {
154149
throw HTTPClientError.emptyHost
155150
}
156151

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
175159
}
176160

177161
/// Whether request will be executed using secure socket.
@@ -665,14 +649,7 @@ internal struct RedirectHandler<T> {
665649
}
666650

667651
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
676653

677654
var convertToGet = false
678655
if status == .seeOther, request.method != .HEAD {
@@ -681,20 +658,29 @@ internal struct RedirectHandler<T> {
681658
convertToGet = true
682659
}
683660

661+
var method = originalRequest.method
662+
var headers = originalRequest.headers
663+
var body = originalRequest.body
664+
684665
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")
689670
}
690671

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")
696677
}
697678

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+
}
699685
}
700686
}

0 commit comments

Comments
 (0)