Releases: swhitty/FlyingFox
Swift 6 Language Mode
Uses Swift 6 language mode when building with Xcode 16 (RC)
Makes EchoWSMessageHandler public #115 🙏🏻 @stefanomondino
Unit tests have been migrated to Swift Testing when available
Uses variation of lock from swift-mutex
Uses variation of withThrowingTimeout from swift-timeout
Cocoapods support removed
New HTTPBodySequence
Swift 5.9+
Support for Swift 5.8 has been removed.
HTTPBodySequence
HTTPBodySequence has had the underlying sequence replaced to consume less memory.
- Requests with body size < 2MB are now buffered on demand via
HTTPSharedReplaySequence. These sequences can be iterated multiple times concurrently. - Requests with body size > 2MB are not buffered and can only be iterated a single time.
Configuration
HTTPServer.Configuration is a new struct containing all properties used to start HTTPServer.
Remote Address
HTTPRequest.remoteAddress allows handlers to receive the address and port of the remove client making the request.
HTTPRequest.remoteIPAddress is also added as a convenience, preferring the client value from the X-Forwarded-For header which is useful for handlers running behind a reverse proxy.
🙏🏻 @blaineam
watchOS Support
Support for watchOS was added #105, #98
🙏🏻 @NicoHinderling @noahsmartin
Windows fix
A bug was fixed within windows builds #104
🙏🏻 @bdashore3
Dynamic Buffer Overflow Fix
Route Parameters
- Adds route parameters (🙏🏻 @tonyarnold)
HTTPRoutenow matches methods againstSet<HTTPMethod>- Replaces
AsyncChunkedSequencewithAsyncBufferedSequence - Support for
Transfer-Encoding: chunkedfor 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
RoutedHTTPHandlernow conforms toRangeReplaceableCollection#77- Some internal continuations are now
swhitty/IdentifiableContinuationmaking 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/jp2Content-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.