Skip to content

Commit 9c7e8d4

Browse files
committed
make [more] immutable again
1 parent d87dc01 commit 9c7e8d4

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
@@ -88,16 +88,19 @@ extension HTTPClient {
8888
/// Represent HTTP request.
8989
public struct Request {
9090
/// Request HTTP version, defaults to `HTTP/1.1`.
91-
public var version: HTTPVersion
91+
public let version: HTTPVersion
9292
/// 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
94100
/// Request custom HTTP Headers, defaults to no headers.
95101
public var headers: HTTPHeaders
96102
/// Request body, defaults to no body.
97103
public var body: Body?
98-
private var _url: URL!
99-
private var _scheme: String!
100-
private var _host: String!
101104

102105
/// Create HTTP request.
103106
///
@@ -133,14 +136,6 @@ extension HTTPClient {
133136
/// - `unsupportedScheme` if URL does contains unsupported HTTP scheme.
134137
/// - `emptyHost` if URL does not contains a host.
135138
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 {
144139
guard let scheme = url.scheme?.lowercased() else {
145140
throw HTTPClientError.emptyScheme
146141
}
@@ -153,24 +148,13 @@ extension HTTPClient {
153148
throw HTTPClientError.emptyHost
154149
}
155150

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

176160
/// Whether request will be executed using secure socket.
@@ -668,14 +652,7 @@ internal struct RedirectHandler<T> {
668652
}
669653

670654
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
679656

680657
var convertToGet = false
681658
if status == .seeOther, request.method != .HEAD {
@@ -684,20 +661,29 @@ internal struct RedirectHandler<T> {
684661
convertToGet = true
685662
}
686663

664+
var method = originalRequest.method
665+
var headers = originalRequest.headers
666+
var body = originalRequest.body
667+
687668
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")
692673
}
693674

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")
699680
}
700681

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+
}
702688
}
703689
}

0 commit comments

Comments
 (0)