@@ -99,20 +99,27 @@ extension HTTPClient {
9999 public struct Request {
100100 /// Represent kind of Request
101101 enum Kind {
102+ enum UnixScheme {
103+ case baseURL
104+ case http_unix
105+ case https_unix
106+ }
107+
102108 /// Remote host request.
103109 case host
104110 /// UNIX Domain Socket HTTP request.
105- case unixSocket
111+ case unixSocket( _ scheme : UnixScheme )
106112
107113 private static var hostSchemes = [ " http " , " https " ]
108- private static var unixSchemes = [ " unix " ]
114+ private static var unixSchemes = [ " unix " , " http+unix " , " https+unix " ]
109115
110116 init ( forScheme scheme: String ) throws {
111- if Kind . host. supports ( scheme: scheme) {
112- self = . host
113- } else if Kind . unixSocket. supports ( scheme: scheme) {
114- self = . unixSocket
115- } else {
117+ switch scheme {
118+ case " http " , " https " : self = . host
119+ case " unix " : self = . unixSocket( . baseURL)
120+ case " http+unix " : self = . unixSocket( . http_unix)
121+ case " https+unix " : self = . unixSocket( . https_unix)
122+ default :
116123 throw HTTPClientError . unsupportedScheme ( scheme)
117124 }
118125 }
@@ -129,6 +136,31 @@ extension HTTPClient {
129136 }
130137 }
131138
139+ func socketPathFromURL( _ url: URL ) throws -> String {
140+ switch self {
141+ case . unixSocket( . baseURL) :
142+ return url. baseURL? . path ?? url. path
143+ case . unixSocket:
144+ guard let socketPath = url. host else {
145+ throw HTTPClientError . missingSocketPath
146+ }
147+ return socketPath
148+ case . host:
149+ return " "
150+ }
151+ }
152+
153+ func uriFromURL( _ url: URL ) -> String {
154+ switch self {
155+ case . host:
156+ return url. uri
157+ case . unixSocket( . baseURL) :
158+ return url. baseURL != nil ? url. uri : " / "
159+ case . unixSocket:
160+ return url. uri
161+ }
162+ }
163+
132164 func supports( scheme: String ) -> Bool {
133165 switch self {
134166 case . host:
@@ -147,6 +179,10 @@ extension HTTPClient {
147179 public let scheme : String
148180 /// Remote host, resolved from `URL`.
149181 public let host : String
182+ /// Socket path, resolved from `URL`.
183+ let socketPath : String
184+ /// URI composed of the path and query, resolved from `URL`.
185+ let uri : String
150186 /// Request custom HTTP Headers, defaults to no headers.
151187 public var headers : HTTPHeaders
152188 /// Request body, defaults to no body.
@@ -192,13 +228,16 @@ extension HTTPClient {
192228 /// - `emptyScheme` if URL does not contain HTTP scheme.
193229 /// - `unsupportedScheme` if URL does contains unsupported HTTP scheme.
194230 /// - `emptyHost` if URL does not contains a host.
231+ /// - `missingSocketPath` if URL does not contains a socketPath as an encoded host.
195232 public init ( url: URL , method: HTTPMethod = . GET, headers: HTTPHeaders = HTTPHeaders ( ) , body: Body ? = nil ) throws {
196233 guard let scheme = url. scheme? . lowercased ( ) else {
197234 throw HTTPClientError . emptyScheme
198235 }
199236
200237 self . kind = try Kind ( forScheme: scheme)
201238 self . host = try self . kind. hostFromURL ( url)
239+ self . socketPath = try self . kind. socketPathFromURL ( url)
240+ self . uri = self . kind. uriFromURL ( url)
202241
203242 self . redirectState = nil
204243 self . url = url
@@ -210,7 +249,7 @@ extension HTTPClient {
210249
211250 /// Whether request will be executed using secure socket.
212251 public var useTLS : Bool {
213- return self . scheme == " https "
252+ return self . scheme == " https " || self . scheme == " https+unix "
214253 }
215254
216255 /// Resolved port.
@@ -712,19 +751,9 @@ extension TaskHandler: ChannelDuplexHandler {
712751 self . state = . idle
713752 let request = self . unwrapOutboundIn ( data)
714753
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- }
724-
725754 var head = HTTPRequestHead ( version: HTTPVersion ( major: 1 , minor: 1 ) ,
726755 method: request. method,
727- uri: uri)
756+ uri: request . uri)
728757 var headers = request. headers
729758
730759 if !request. headers. contains ( name: " Host " ) {
0 commit comments