Releases: swhitty/FlyingFox
Route Parameters
- Adds route parameters (🙏🏻 @tonyarnold)
HTTPRoute
now matches methods againstSet<HTTPMethod>
- Replaces
AsyncChunkedSequence
withAsyncBufferedSequence
- Support for
Transfer-Encoding: chunked
for responses without a known size
Route Parameters
Routes can include named parameters within a path or query item using the :
prefix. Any string supplied to this parameter will match the route, handlers can access the value of the string using request.routePamaters
.
handler.appendRoute("GET /creature/:name?type=:beast") { request in
let name = request.routeParameters["name"]
let beast = request.routeParameters["beast"]
return HTTPResponse(statusCode: .ok)
}
When using Swift 5.9+, route parameters can be automatically extracted and mapped to closure parameters of handlers.
enum Beast: String, HTTPRouteParameterValue {
case fish
case dog
}
handler.appendRoute("GET /creature/:name?type=:beast") { (name: String, beast: Beast) -> HTTPResponse in
return HTTPResponse(statusCode: .ok)
}
The request can be optionally included.
handler.appendRoute("GET /creature/:name?type=:beast") { (request: HTTPRequest, name: String, beast: Beast) -> HTTPResponse in
return HTTPResponse(statusCode: .ok)
}
String
, Int
, Double
, Bool
and any type that conforms to HTTPRouteParameterValue
can be extracted.
0.14.0 RangeReplaceableCollection
RoutedHTTPHandler
now conforms toRangeReplaceableCollection
#77- Some internal continuations are now
swhitty/IdentifiableContinuation
making it easier to manage continuations with cancellation handlers.
Fix Percent Encoded Paths Swift 5.7+
- Fixes support for parsing and matching requests and routes with percent encoded paths. #74 Thanks @wirrareka
- Drops support for Swift 5.5 and 5.6.
Fix crash in HTTPServer.stop()
Fix Buffer leak
Initial Support for Swift 5.9 & DiscardingTaskGroup
- Adds support for Swift 5.9 and DiscardingTaskGroup (when available). #60
- Xcode 15 Beta 2 support
- Support
image/x-icon
,image/webp
,image/jp2
Content-Type.
Initial Support for Swift 5.9 & DiscardingTaskGroup
Large Requests with HTTPBodySequence
Adds support for very large bodies within HTTPRequest
and HTTPResponse
that can be processed in Data
chunks.
HTTPRequest
Requests now include a bodySequence: HTTPBodySequence
which allows the request body to be iterated in small chunks as they arrive:
func saveBody(request: HTTPRequest) async throws -> HTTPResponse {
let file = URL(fileURLWithPath: "/tmp/file")
_ = FileManager.default.createFile(atPath: file.path, contents: nil)
let handle = try FileHandle(forWritingTo: file)
for try await chunk in req.bodySequence {
try handle.write(contentsOf: chunk)
}
return HTTPResponse(statusCode: .ok)
}
The existing var data: Data
property has been deprecated, but is still supported and synchronously returns the uploaded data for requests less than 10 MiB.
HTTPResponse
Response payloads can provide a HTTPBodySequence
which allows the response body to be provided in small chunks as they are sent:
func getXcode(request: HTTPRequest) async throws -> HTTPResponse {
try HTTPResponse(
statusCode: .ok,
body: HTTPBodySequence(file: URL(fileURLWithPath: "/tmp/Xcode_14.3.xip"))
)
}
Providing a Data
instance for the body
property is still supported.
The existing var data: Data?
property has been deprecated, but is still supported and synchronously returns response payload if the response is not a web socket or HTTPBodySequence
.
FileHTTPHandler
The existing FileHTTPHandler
now serves all files larger than 10 MiB in small chunks, while files smaller are still served via a complete Data
instance.
Large Requests with HTTPBodySequence
Adds support for very large bodies within HTTPRequest
and HTTPResponse
that can be processed in Data
chunks.
HTTPRequest
Requests now include a bodySequence: HTTPBodySequence
which allows the request body to be iterated in small chunks as the arrive:
func saveBody(request: HTTPRequest) async throws -> HTTPResponse {
let file = URL(fileURLWithPath: "/tmp/file")
_ = FileManager.default.createFile(atPath: file.path, contents: nil)
let handle = try FileHandle(forWritingTo: file)
for try await chunk in req.bodySequence {
try handle.write(contentsOf: chunk)
}
return HTTPResponse(statusCode: .ok)
}
The existing var data: Data
property has been deprecated, but is still supported and synchronously returns the uploaded data for requests less than 10 MiB.
HTTPResponse
Response payloads can provide a HTTPBodySequence
which allows the response body to be provided in small chunks as they are sent:
func getXcode(request: HTTPRequest) async throws -> HTTPResponse {
try HTTPResponse(
statusCode: .ok,
body: HTTPBodySequence(file: URL(fileURLWithPath: "/tmp/Xcode_14.3.xip"))
)
}
Providing a Data
instance for the body
property is still supported.
The existing var data: Data?
property has been deprecated, but is still supported and synchronously returns response payload if the response is not a web socket or HTTPBodySequence
.
FileHTTPHandler
The existing FileHTTPHandler
now serves all files larger than 10 MiB in small chunks, while files smaller are still served via a complete Data
instance.
SocketPool kqueue / epoll
kqueue(2)
/epoll(7)
events are now used to suspend and resume socket usingSocketPool<EventQueue>
SocketPool<EventQueue>
is now the default pool used byHTTPServer
PollingSocketPool
has been replaced bySocketPool<Poll>
- Windows uses
SocketPool<Poll>
- Moved
HTTPLogging
toFlyingSocks.Logging
enabling logs within sockets and pools. - Decreased compilation time