Skip to content

Commit 203671d

Browse files
committed
Update changelog
1 parent 77af12f commit 203671d

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

changelog.d/1561

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
synopsis: New combinator to return routed path in response headers
2+
prs: #1561
3+
issues: #1553
4+
5+
description: {
6+
7+
This commit introduces a new type-level combinator, `WithRoutingHeader`.
8+
It modifies the behaviour of the following sub-API, such that all endpoints of said API return an additional routing header in their response.
9+
10+
A routing header is a header that specifies which endpoint the incoming request was routed to.
11+
Endpoint are designated by their path, in which `Capture'` and `CaptureAll` combinators are replaced by a capture hint.
12+
13+
This header can be used by downstream middlewares to gather information about individual endpoints, since in most cases
14+
a routing header uniquely identifies a single endpoint.
15+
16+
Example:
17+
18+
```haskell
19+
type MyApi =
20+
WithRoutingHeader :> "by-id" :> Capture "id" Int :> Get '[JSON] Foo
21+
-- GET /by-id/1234 will return a response with the following header:
22+
-- ("Servant-Routed-Path", "/by-id/<id::Int>")
23+
```
24+
25+
To achieve this, two refactorings were necessary:
26+
27+
* Introduce a type `RouterEnv env` to encapsulate the `env` type (as in `Router env a`), which contains a tuple-encoded list of url pieces parsed from the incoming request. This type makes it possible to pass more information throughout the routing process, and the computation of the `Delayed env c` associated with each request.
28+
* Introduce a new kind of router, which only modifies the `RouterEnv`, and doesn't affect the routing process otherwise: `EnvRouter (RouterEnv env -> RouterEnv env) (Router' env a)`.
29+
This new router is used when encountering the `WithRoutingHeader` combinator in an API, to notify the endpoints of the sub-API that they must produce a routing header (this behaviour is disabled by default).
30+
31+
This PR also introduces `Spec` tests for the `WithRoutingHeader` combinator, which showcase some of its possible uses.
32+
33+
}

0 commit comments

Comments
 (0)