@@ -88,12 +88,54 @@ extension HTTPClient {
88
88
89
89
/// Represent HTTP request.
90
90
public struct Request {
91
+ /// Represent kind of Request
92
+ enum Kind {
93
+ /// Remote host request.
94
+ case host
95
+ /// UNIX Domain Socket HTTP request.
96
+ case unixSocket
97
+
98
+ private static var hostSchemes = [ " http " , " https " ]
99
+ private static var unixSchemes = [ " unix " ]
100
+
101
+ init ( forScheme scheme: String ) throws {
102
+ if Kind . host. supports ( scheme: scheme) {
103
+ self = . host
104
+ } else if Kind . unixSocket. supports ( scheme: scheme) {
105
+ self = . unixSocket
106
+ } else {
107
+ throw HTTPClientError . unsupportedScheme ( scheme)
108
+ }
109
+ }
110
+
111
+ func hostFromURL( _ url: URL ) throws -> String {
112
+ switch self {
113
+ case . host:
114
+ guard let host = url. host else {
115
+ throw HTTPClientError . emptyHost
116
+ }
117
+ return host
118
+ case . unixSocket:
119
+ return " "
120
+ }
121
+ }
122
+
123
+ func supports( scheme: String ) -> Bool {
124
+ switch self {
125
+ case . host:
126
+ return Kind . hostSchemes. contains ( scheme)
127
+ case . unixSocket:
128
+ return Kind . unixSchemes. contains ( scheme)
129
+ }
130
+ }
131
+ }
132
+
91
133
/// Request HTTP method, defaults to `GET`.
92
- public let method : HTTPMethod
134
+ public var method : HTTPMethod
93
135
/// Remote URL.
94
- public let url : URL
136
+ public var url : URL
95
137
/// Remote HTTP scheme, resolved from `URL`.
96
- public let scheme : String
138
+ public var scheme : String
97
139
/// Remote host, resolved from `URL`.
98
140
public let host : String
99
141
/// Request custom HTTP Headers, defaults to no headers.
@@ -107,6 +149,7 @@ extension HTTPClient {
107
149
}
108
150
109
151
var redirectState : RedirectState ?
152
+ let kind : Kind
110
153
111
154
/// Create HTTP request.
112
155
///
@@ -133,7 +176,6 @@ extension HTTPClient {
133
176
///
134
177
/// - parameters:
135
178
/// - url: Remote `URL`.
136
- /// - version: HTTP version.
137
179
/// - method: HTTP method.
138
180
/// - headers: Custom HTTP headers.
139
181
/// - body: Request body.
@@ -146,22 +188,15 @@ extension HTTPClient {
146
188
throw HTTPClientError . emptyScheme
147
189
}
148
190
149
- guard Request . isSchemeSupported ( scheme: scheme) else {
150
- throw HTTPClientError . unsupportedScheme ( scheme)
151
- }
152
-
153
- guard let host = url. host else {
154
- throw HTTPClientError . emptyHost
155
- }
191
+ self . kind = try Kind ( forScheme: scheme)
192
+ self . host = try self . kind. hostFromURL ( url)
156
193
157
- self . method = method
194
+ self . redirectState = nil
158
195
self . url = url
196
+ self . method = method
159
197
self . scheme = scheme
160
- self . host = host
161
198
self . headers = headers
162
199
self . body = body
163
-
164
- self . redirectState = nil
165
200
}
166
201
167
202
/// Whether request will be executed using secure socket.
@@ -173,10 +208,6 @@ extension HTTPClient {
173
208
public var port : Int {
174
209
return self . url. port ?? ( self . useTLS ? 443 : 80 )
175
210
}
176
-
177
- static func isSchemeSupported( scheme: String ) -> Bool {
178
- return scheme == " http " || scheme == " https "
179
- }
180
211
}
181
212
182
213
/// Represent HTTP response.
@@ -812,7 +843,7 @@ internal struct RedirectHandler<ResponseType> {
812
843
return nil
813
844
}
814
845
815
- guard HTTPClient . Request . isSchemeSupported ( scheme: self . request. scheme) else {
846
+ guard self . request . kind . supports ( scheme: self . request. scheme) else {
816
847
return nil
817
848
}
818
849
0 commit comments