@@ -99,19 +99,26 @@ extension HTTPClient {
99
99
public struct Request {
100
100
/// Represent kind of Request
101
101
enum Kind {
102
+ enum UnixScheme {
103
+ case baseURL
104
+ }
105
+
102
106
/// Remote host request.
103
107
case host
104
108
/// UNIX Domain Socket HTTP request.
105
- case unixSocket
109
+ case unixSocket( _ scheme : UnixScheme )
106
110
107
111
private static var hostSchemes = [ " http " , " https " ]
108
112
private static var unixSchemes = [ " unix " ]
109
113
110
114
init ( forScheme scheme: String ) throws {
111
115
if Kind . host. supports ( scheme: scheme) {
112
116
self = . host
113
- } else if Kind . unixSocket. supports ( scheme: scheme) {
114
- self = . unixSocket
117
+ } else if Kind . unixSchemes. contains ( scheme) {
118
+ switch scheme {
119
+ case " unix " : self = . unixSocket( . baseURL)
120
+ default : preconditionFailure ( " scheme should already be a valid option " )
121
+ }
115
122
} else {
116
123
throw HTTPClientError . unsupportedScheme ( scheme)
117
124
}
@@ -129,11 +136,35 @@ extension HTTPClient {
129
136
}
130
137
}
131
138
139
+ func socketPathFromURL( _ url: URL ) throws -> String {
140
+ switch self {
141
+ case . unixSocket( let scheme) :
142
+ switch scheme {
143
+ case . baseURL:
144
+ return url. baseURL? . path ?? url. path
145
+ }
146
+ case . host:
147
+ return " "
148
+ }
149
+ }
150
+
151
+ func uriFromURL( _ url: URL ) -> String {
152
+ switch self {
153
+ case . host:
154
+ return url. uri
155
+ case . unixSocket( let scheme) :
156
+ switch scheme {
157
+ case . baseURL:
158
+ return url. baseURL != nil ? url. uri : " / "
159
+ }
160
+ }
161
+ }
162
+
132
163
func supports( scheme: String ) -> Bool {
133
164
switch self {
134
165
case . host:
135
166
return Kind . hostSchemes. contains ( scheme)
136
- case . unixSocket:
167
+ case . unixSocket( scheme : _ ) :
137
168
return Kind . unixSchemes. contains ( scheme)
138
169
}
139
170
}
@@ -147,6 +178,10 @@ extension HTTPClient {
147
178
public let scheme : String
148
179
/// Remote host, resolved from `URL`.
149
180
public let host : String
181
+ /// Socket path, resolved from `URL`.
182
+ public let socketPath : String
183
+ /// URI, resolved from `URL`.
184
+ public let uri : String
150
185
/// Request custom HTTP Headers, defaults to no headers.
151
186
public var headers : HTTPHeaders
152
187
/// Request body, defaults to no body.
@@ -199,6 +234,8 @@ extension HTTPClient {
199
234
200
235
self . kind = try Kind ( forScheme: scheme)
201
236
self . host = try self . kind. hostFromURL ( url)
237
+ self . socketPath = try self . kind. socketPathFromURL ( url)
238
+ self . uri = self . kind. uriFromURL ( url)
202
239
203
240
self . redirectState = nil
204
241
self . url = url
@@ -712,15 +749,7 @@ extension TaskHandler: ChannelDuplexHandler {
712
749
self . state = . idle
713
750
let request = self . unwrapOutboundIn ( data)
714
751
715
- let uri : String
716
- switch ( self . kind, request. url. baseURL) {
717
- case ( . host, _) :
718
- uri = request. url. uri
719
- case ( . unixSocket, . none) :
720
- uri = " / " // we don't have a real path, the path we have is the path of the UNIX Domain Socket.
721
- case ( . unixSocket, . some( _) ) :
722
- uri = request. url. uri
723
- }
752
+ let uri : String = request. uri
724
753
725
754
var head = HTTPRequestHead ( version: HTTPVersion ( major: 1 , minor: 1 ) ,
726
755
method: request. method,
0 commit comments