Skip to content

Commit f893cb9

Browse files
committed
handleMatchedRequest
1 parent 76b2d2d commit f893cb9

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

FlyingFox/Sources/Handlers/RoutedHTTPHandler.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,24 @@ public extension RoutedHTTPHandler {
136136
}
137137
}
138138

139+
public extension RoutedHTTPHandler {
140+
141+
static func handleMatchedRequest(
142+
isolation: isolated (any Actor)? = #isolation,
143+
_ request: HTTPRequest,
144+
to route: HTTPRoute,
145+
handler: (HTTPRequest) async throws -> HTTPResponse
146+
) async throws -> HTTPResponse? {
147+
if await route ~= request {
148+
return try await HTTPRequest.$matchedRoute.withValue(route) {
149+
_ = isolation
150+
return try await handler(request)
151+
}
152+
}
153+
return nil
154+
}
155+
}
156+
139157
extension RoutedHTTPHandler: RangeReplaceableCollection {
140158
public typealias Index = Array<Element>.Index
141159
public typealias Element = (route: HTTPRoute, handler: any HTTPHandler)

FlyingFox/Tests/Handlers/RoutedHTTPHandlerTests.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,39 @@ struct RoutedHTTPHandlerTests {
124124
try await handler.handleRequest(.make("/450/hello?food=shrimp&qty=🍤")).bodyString == "900 shrimp 🍤"
125125
)
126126
}
127+
128+
@Test
129+
func handleMatchedRequest_matches() async throws {
130+
// given
131+
let request = HTTPRequest.make("/10/hello?food=fish&qty=🐟")
132+
let route = HTTPRoute("GET /:id/hello?food=:food&qty=:qty")
133+
134+
// when
135+
let response = try await RoutedHTTPHandler.handleMatchedRequest(request, to: route) {
136+
#expect($0.routeParameters["id"] == "10")
137+
#expect($0.routeParameters["food"] == "fish")
138+
#expect($0.routeParameters["qty"] == "🐟")
139+
return HTTPResponse(statusCode: .ok)
140+
}
141+
142+
// then
143+
#expect(response?.statusCode == .ok)
144+
}
145+
146+
@Test
147+
func handleMatchedRequest_skips() async throws {
148+
// given
149+
let request = HTTPRequest.make("/chips")
150+
let route = HTTPRoute("GET /fish")
151+
152+
// when
153+
let response = try await RoutedHTTPHandler.handleMatchedRequest(request, to: route) { _ in
154+
return HTTPResponse(statusCode: .ok)
155+
}
156+
157+
// then
158+
#expect(response?.statusCode == nil)
159+
}
127160
}
128161

129162
private struct MockHandler: HTTPHandler {

0 commit comments

Comments
 (0)