mirror of
https://github.com/metosin/reitit.git
synced 2026-01-20 13:09:01 +00:00
Compare commits
8 commits
1c67fe70d7
...
1cb0b31af8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1cb0b31af8 | ||
|
|
f4da07c222 | ||
|
|
a3c64baeba | ||
|
|
99efdeea2d | ||
|
|
f46244cc48 | ||
|
|
78a1cc144e | ||
|
|
888856b5cc | ||
|
|
83b2e90ca7 |
53 changed files with 218 additions and 86 deletions
|
|
@ -12,7 +12,7 @@ We use [Break Versioning][breakver]. The version numbers follow a `<major>.<mino
|
|||
|
||||
[breakver]: https://github.com/ptaoussanis/encore/blob/master/BREAK-VERSIONING.md
|
||||
|
||||
## 0.9.2-rc1 (2025-10-24)
|
||||
## 0.9.2 (2025-10-28)
|
||||
|
||||
* Allow multimethods as handlers when validating [#755](https://github.com/metosin/reitit/pull/755)
|
||||
* Improve error reporting when generating OpenAPI fails [#754](https://github.com/metosin/reitit/pull/754)
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ modules will continue to be released under `metosin` for compatibility purposes.
|
|||
All main modules bundled:
|
||||
|
||||
```clj
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
```
|
||||
|
||||
Optionally, the parts can be required separately.
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ There is [#reitit](https://clojurians.slack.com/messages/reitit/) in [Clojurians
|
|||
All bundled:
|
||||
|
||||
```clj
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
```
|
||||
|
||||
Optionally, the parts can be required separately.
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ The default exception formatting uses `reitit.exception/exception`. It produces
|
|||
## Pretty Errors
|
||||
|
||||
```clj
|
||||
[metosin/reitit-dev "0.9.2-rc1"]
|
||||
[metosin/reitit-dev "0.9.2"]
|
||||
```
|
||||
|
||||
For human-readable and developer-friendly exception messages, there is `reitit.dev.pretty/exception` (in the `reitit-dev` module). It is inspired by the lovely errors messages of [ELM](https://elm-lang.org/blog/compiler-errors-for-humans) and [ETA](https://twitter.com/jyothsnasrin/status/1037703436043603968) and uses [fipp](https://github.com/brandonbloom/fipp), [expound](https://github.com/bhb/expound) and [spell-spec](https://github.com/bhauman/spell-spec) for most of heavy lifting.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Default Interceptors
|
||||
|
||||
```clj
|
||||
[metosin/reitit-interceptors "0.9.2-rc1"]
|
||||
[metosin/reitit-interceptors "0.9.2"]
|
||||
```
|
||||
|
||||
Just like the [ring default middleware](../ring/default_middleware.md), but for interceptors.
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ Reitit has also support for [interceptors](http://pedestal.io/reference/intercep
|
|||
## Reitit-http
|
||||
|
||||
```clj
|
||||
[metosin/reitit-http "0.9.2-rc1"]
|
||||
[metosin/reitit-http "0.9.2"]
|
||||
```
|
||||
|
||||
A module for http-routing using interceptors instead of middleware. Builds on top of the [`reitit-ring`](../ring/ring.md) module having all the same features.
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
[Pedestal](http://pedestal.io/) is a backend web framework for Clojure. `reitit-pedestal` provides an alternative routing engine for Pedestal.
|
||||
|
||||
```clj
|
||||
[metosin/reitit-pedestal "0.9.2-rc1"]
|
||||
[metosin/reitit-pedestal "0.9.2"]
|
||||
```
|
||||
|
||||
Why should one use reitit instead of the Pedestal [default routing](http://pedestal.io/reference/routing-quick-reference)?
|
||||
|
|
@ -26,8 +26,8 @@ A minimalistic example on how to to swap the default-router with a reitit router
|
|||
```clj
|
||||
; [io.pedestal/pedestal.service "0.5.5"]
|
||||
; [io.pedestal/pedestal.jetty "0.5.5"]
|
||||
; [metosin/reitit-pedestal "0.9.2-rc1"]
|
||||
; [metosin/reitit "0.9.2-rc1"]
|
||||
; [metosin/reitit-pedestal "0.9.2"]
|
||||
; [metosin/reitit "0.9.2"]
|
||||
|
||||
(require '[io.pedestal.http :as server])
|
||||
(require '[reitit.pedestal :as pedestal])
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Sieppari
|
||||
|
||||
```clj
|
||||
[metosin/reitit-sieppari "0.9.2-rc1"]
|
||||
[metosin/reitit-sieppari "0.9.2"]
|
||||
```
|
||||
|
||||
[Sieppari](https://github.com/metosin/sieppari) is a new and fast interceptor implementation for Clojure, with pluggable async supporting [core.async](https://github.com/clojure/core.async), [Manifold](https://github.com/ztellman/manifold) and [Promesa](http://funcool.github.io/promesa/latest).
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ There is an extra option in http-router (actually, in the underlying interceptor
|
|||
### Printing Context Diffs
|
||||
|
||||
```clj
|
||||
[metosin/reitit-interceptors "0.9.2-rc1"]
|
||||
[metosin/reitit-interceptors "0.9.2"]
|
||||
```
|
||||
|
||||
Using `reitit.http.interceptors.dev/print-context-diffs` transformation, the context diffs between each interceptor are printed out to the console. To use it, add the following router option:
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Default Middleware
|
||||
|
||||
```clj
|
||||
[metosin/reitit-middleware "0.9.2-rc1"]
|
||||
[metosin/reitit-middleware "0.9.2"]
|
||||
```
|
||||
|
||||
Any Ring middleware can be used with `reitit-ring`, but using data-driven middleware is preferred as they are easier to manage and in many cases yield better performance. `reitit-middleware` contains a set of common ring middleware, lifted into data-driven middleware.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Exception Handling with Ring
|
||||
|
||||
```clj
|
||||
[metosin/reitit-middleware "0.9.2-rc1"]
|
||||
[metosin/reitit-middleware "0.9.2"]
|
||||
```
|
||||
|
||||
Exceptions thrown in router creation can be [handled with custom exception handler](../basics/error_messages.md). By default, exceptions thrown at runtime from a handler or a middleware are not caught by the `reitit.ring/ring-handler`. A good practice is to have a top-level exception handler to log and format errors for clients.
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
Read more about the [Ring Concepts](https://github.com/ring-clojure/ring/wiki/Concepts).
|
||||
|
||||
```clj
|
||||
[metosin/reitit-ring "0.9.2-rc1"]
|
||||
[metosin/reitit-ring "0.9.2"]
|
||||
```
|
||||
|
||||
## `reitit.ring/router`
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Swagger Support
|
||||
|
||||
```
|
||||
[metosin/reitit-swagger "0.9.2-rc1"]
|
||||
[metosin/reitit-swagger "0.9.2"]
|
||||
```
|
||||
|
||||
Reitit supports [Swagger2](https://swagger.io/) documentation, thanks to [schema-tools](https://github.com/metosin/schema-tools) and [spec-tools](https://github.com/metosin/spec-tools). Documentation is extracted from route definitions, coercion `:parameters` and `:responses` and from a set of new documentation keys.
|
||||
|
|
@ -47,7 +47,7 @@ If you need to post-process the generated spec, just wrap the handler with a cus
|
|||
[Swagger-ui](https://github.com/swagger-api/swagger-ui) is a user interface to visualize and interact with the Swagger specification. To make things easy, there is a pre-integrated version of the swagger-ui as a separate module.
|
||||
|
||||
```
|
||||
[metosin/reitit-swagger-ui "0.9.2-rc1"]
|
||||
[metosin/reitit-swagger-ui "0.9.2"]
|
||||
```
|
||||
|
||||
`reitit.swagger-ui/create-swagger-ui-handler` can be used to create a ring-handler to serve the swagger-ui. It accepts the following options:
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ There is an extra option in the Ring router (actually, in the underlying middlew
|
|||
### Printing Request Diffs
|
||||
|
||||
```clj
|
||||
[metosin/reitit-middleware "0.9.2-rc1"]
|
||||
[metosin/reitit-middleware "0.9.2"]
|
||||
```
|
||||
|
||||
Using `reitit.ring.middleware.dev/print-request-diffs` transformation, the request diffs between each middleware are printed out to the console. To use it, add the following router option:
|
||||
|
|
|
|||
|
|
@ -2,6 +2,6 @@
|
|||
:description "Reitit Buddy Auth App"
|
||||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[ring/ring-jetty-adapter "1.12.1"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[buddy "2.0.0"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
[ring "1.12.1"]
|
||||
[hiccup "1.0.5"]
|
||||
[org.clojure/clojurescript "1.11.132"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit-schema "0.9.2-rc1"]
|
||||
[metosin/reitit-frontend "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[metosin/reitit-schema "0.9.2"]
|
||||
[metosin/reitit-frontend "0.9.2"]
|
||||
[cljsjs/react "17.0.2-0"]
|
||||
[cljsjs/react-dom "17.0.2-0"]
|
||||
;; Just for pretty printting the match
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
[ring "1.12.1"]
|
||||
[hiccup "1.0.5"]
|
||||
[org.clojure/clojurescript "1.11.132"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit-schema "0.9.2-rc1"]
|
||||
[metosin/reitit-frontend "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[metosin/reitit-schema "0.9.2"]
|
||||
[metosin/reitit-frontend "0.9.2"]
|
||||
[cljsjs/react "17.0.2-0"]
|
||||
[cljsjs/react-dom "17.0.2-0"]
|
||||
;; Just for pretty printting the match
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
[ring "1.12.1"]
|
||||
[hiccup "1.0.5"]
|
||||
[org.clojure/clojurescript "1.10.520"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit-spec "0.9.2-rc1"]
|
||||
[metosin/reitit-frontend "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[metosin/reitit-spec "0.9.2"]
|
||||
[metosin/reitit-frontend "0.9.2"]
|
||||
[cljsjs/react "17.0.2-0"]
|
||||
[cljsjs/react-dom "17.0.2-0"]
|
||||
;; Just for pretty printting the match
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
[ring "1.12.1"]
|
||||
[hiccup "1.0.5"]
|
||||
[org.clojure/clojurescript "1.11.132"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit-malli "0.9.2-rc1"]
|
||||
[metosin/reitit-frontend "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[metosin/reitit-malli "0.9.2"]
|
||||
[metosin/reitit-frontend "0.9.2"]
|
||||
[cljsjs/react "17.0.2-0"]
|
||||
[cljsjs/react-dom "17.0.2-0"]
|
||||
;; Just for pretty printting the match
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
[ring "1.12.1"]
|
||||
[hiccup "1.0.5"]
|
||||
[org.clojure/clojurescript "1.11.132"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit-spec "0.9.2-rc1"]
|
||||
[metosin/reitit-frontend "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[metosin/reitit-spec "0.9.2"]
|
||||
[metosin/reitit-frontend "0.9.2"]
|
||||
[cljsjs/react "17.0.2-0"]
|
||||
[cljsjs/react-dom "17.0.2-0"]
|
||||
;; Just for pretty printting the match
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
(defproject frontend-re-frame "0.1.0-SNAPSHOT"
|
||||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[org.clojure/clojurescript "1.11.132"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[reagent "1.2.0"]
|
||||
[re-frame "0.10.6"]
|
||||
[cljsjs/react "17.0.2-0"]
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
[ring "1.12.1"]
|
||||
[hiccup "1.0.5"]
|
||||
[org.clojure/clojurescript "1.11.132"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit-spec "0.9.2-rc1"]
|
||||
[metosin/reitit-frontend "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[metosin/reitit-spec "0.9.2"]
|
||||
[metosin/reitit-frontend "0.9.2"]
|
||||
[cljsjs/react "17.0.2-0"]
|
||||
[cljsjs/react-dom "17.0.2-0"]
|
||||
;; Just for pretty printting the match
|
||||
|
|
|
|||
|
|
@ -3,6 +3,6 @@
|
|||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[ring/ring-jetty-adapter "1.12.1"]
|
||||
[aleph "0.7.1"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[metosin/ring-swagger-ui "5.9.0"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -5,5 +5,5 @@
|
|||
[funcool/promesa "11.0.678"]
|
||||
[manifold "0.4.2"]
|
||||
[ring/ring-jetty-adapter "1.12.1"]
|
||||
[metosin/reitit "0.9.2-rc1"]]
|
||||
[metosin/reitit "0.9.2"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -2,4 +2,4 @@
|
|||
:description "Reitit coercion with vanilla ring"
|
||||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[ring/ring-jetty-adapter "1.12.1"]
|
||||
[metosin/reitit "0.9.2-rc1"]])
|
||||
[metosin/reitit "0.9.2"]])
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[metosin/jsonista "0.3.8"]
|
||||
[ring/ring-jetty-adapter "1.12.1"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[metosin/ring-swagger-ui "5.9.0"]]
|
||||
:repl-options {:init-ns example.server}
|
||||
:profiles {:dev {:dependencies [[ring/ring-mock "0.4.0"]]}})
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[io.pedestal/pedestal.service "0.6.3"]
|
||||
[io.pedestal/pedestal.jetty "0.6.3"]
|
||||
[metosin/reitit-malli "0.9.2-rc1"]
|
||||
[metosin/reitit-pedestal "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2-rc1"]]
|
||||
[metosin/reitit-malli "0.9.2"]
|
||||
[metosin/reitit-pedestal "0.9.2"]
|
||||
[metosin/reitit "0.9.2"]]
|
||||
:repl-options {:init-ns server})
|
||||
|
|
|
|||
|
|
@ -3,6 +3,6 @@
|
|||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[io.pedestal/pedestal.service "0.6.3"]
|
||||
[io.pedestal/pedestal.jetty "0.6.3"]
|
||||
[metosin/reitit-pedestal "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2-rc1"]]
|
||||
[metosin/reitit-pedestal "0.9.2"]
|
||||
[metosin/reitit "0.9.2"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -3,6 +3,6 @@
|
|||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[io.pedestal/pedestal.service "0.6.3"]
|
||||
[io.pedestal/pedestal.jetty "0.6.3"]
|
||||
[metosin/reitit-pedestal "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2-rc1"]]
|
||||
[metosin/reitit-pedestal "0.9.2"]
|
||||
[metosin/reitit "0.9.2"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@
|
|||
:description "Reitit Ring App"
|
||||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[ring/ring-jetty-adapter "1.12.1"]
|
||||
[metosin/reitit "0.9.2-rc1"]]
|
||||
[metosin/reitit "0.9.2"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
:description "Reitit Ring App with Integrant"
|
||||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[ring/ring-jetty-adapter "1.12.1"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[integrant "0.8.1"]]
|
||||
:main example.server
|
||||
:repl-options {:init-ns user}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,6 @@
|
|||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[metosin/jsonista "0.3.8"]
|
||||
[ring/ring-jetty-adapter "1.12.1"]
|
||||
[metosin/reitit "0.9.2-rc1"]]
|
||||
[metosin/reitit "0.9.2"]]
|
||||
:repl-options {:init-ns example.server}
|
||||
:profiles {:dev {:dependencies [[ring/ring-mock "0.4.0"]]}})
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[metosin/jsonista "0.3.8"]
|
||||
[ring/ring-jetty-adapter "1.12.1"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[metosin/ring-swagger-ui "5.9.0"]]
|
||||
:repl-options {:init-ns example.server}
|
||||
:profiles {:dev {:dependencies [[ring/ring-mock "0.4.0"]]}})
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
:description "Reitit Ring App with Swagger"
|
||||
:dependencies [[org.clojure/clojure "1.11.2"]
|
||||
[ring/ring-jetty-adapter "1.12.1"]
|
||||
[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit "0.9.2"]
|
||||
[metosin/ring-swagger-ui "5.9.0"]]
|
||||
:repl-options {:init-ns example.server}
|
||||
:profiles {:dev {:dependencies [[ring/ring-mock "0.4.0"]]}})
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-core "0.9.2-rc1"
|
||||
(defproject metosin/reitit-core "0.9.2"
|
||||
:description "Snappy data-driven router for Clojure(Script)"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-dev "0.9.2-rc1"
|
||||
(defproject metosin/reitit-dev "0.9.2"
|
||||
:description "Snappy data-driven router for Clojure(Script)"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-frontend "0.9.2-rc1"
|
||||
(defproject metosin/reitit-frontend "0.9.2"
|
||||
:description "Reitit: Clojurescript frontend routing core"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-http "0.9.2-rc1"
|
||||
(defproject metosin/reitit-http "0.9.2"
|
||||
:description "Reitit: HTTP routing with interceptors"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-interceptors "0.9.2-rc1"
|
||||
(defproject metosin/reitit-interceptors "0.9.2"
|
||||
:description "Reitit, common interceptors bundled"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-malli "0.9.2-rc1"
|
||||
(defproject metosin/reitit-malli "0.9.2"
|
||||
:description "Reitit: Malli coercion"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-middleware "0.9.2-rc1"
|
||||
(defproject metosin/reitit-middleware "0.9.2"
|
||||
:description "Reitit, common middleware bundled"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
(ns reitit.ring.middleware.session
|
||||
(:require
|
||||
[clojure.spec.alpha :as s]
|
||||
[ring.middleware.session :as session]
|
||||
[ring.middleware.session.store :as session-store]
|
||||
[ring.middleware.session.memory :as memory]))
|
||||
|
||||
(s/def ::store #(satisfies? session-store/SessionStore %))
|
||||
(s/def ::root string?)
|
||||
(s/def ::cookie-name string?)
|
||||
(s/def ::cookie-attrs map?)
|
||||
(s/def ::session (s/keys :opt-un [::store ::root ::cookie-name ::cookie-attrs]))
|
||||
(s/def ::spec (s/keys :opt-un [::session]))
|
||||
|
||||
(def ^:private store
|
||||
"The default shared in-memory session store.
|
||||
|
||||
This is used when no `:store` key is provided to the middleware."
|
||||
(memory/memory-store (atom {})))
|
||||
|
||||
(def session-middleware
|
||||
"Middleware for session.
|
||||
|
||||
Enter:
|
||||
Add the `:session` key into the request map based on the `:cookies`
|
||||
in the request map.
|
||||
|
||||
Exit:
|
||||
When `:session` key presents in the response map, update the session
|
||||
store with its value. Then remove `:session` from the response map.
|
||||
|
||||
| key | description |
|
||||
| -------------|-------------|
|
||||
| `:session` | A map of options that passes into the [`ring.middleware.session/wrap-session](http://ring-clojure.github.io/ring/ring.middleware.session.html#var-wrap-session) function`, or an empty map for the default options. The absence of this value will disable the middleware."
|
||||
{:name :session
|
||||
:spec ::spec
|
||||
:compile (fn [{session-opts :session} _]
|
||||
(if session-opts
|
||||
(let [session-opts (merge {:store store} session-opts)]
|
||||
{:wrap #(session/wrap-session % session-opts)})))})
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject fi.metosin/reitit-openapi "0.9.2-rc1"
|
||||
(defproject fi.metosin/reitit-openapi "0.9.2"
|
||||
:description "Reitit: OpenAPI-support"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-pedestal "0.9.2-rc1"
|
||||
(defproject metosin/reitit-pedestal "0.9.2"
|
||||
:description "Reitit + Pedestal Integration"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-ring "0.9.2-rc1"
|
||||
(defproject metosin/reitit-ring "0.9.2"
|
||||
:description "Reitit: Ring routing"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-schema "0.9.2-rc1"
|
||||
(defproject metosin/reitit-schema "0.9.2"
|
||||
:description "Reitit: Plumatic Schema coercion"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-sieppari "0.9.2-rc1"
|
||||
(defproject metosin/reitit-sieppari "0.9.2"
|
||||
:description "Reitit: Sieppari Interceptors"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-spec "0.9.2-rc1"
|
||||
(defproject metosin/reitit-spec "0.9.2"
|
||||
:description "Reitit: clojure.spec coercion"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-swagger-ui "0.9.2-rc1"
|
||||
(defproject metosin/reitit-swagger-ui "0.9.2"
|
||||
:description "Reitit: Swagger-ui support"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-swagger "0.9.2-rc1"
|
||||
(defproject metosin/reitit-swagger "0.9.2"
|
||||
:description "Reitit: Swagger-support"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit "0.9.2-rc1"
|
||||
(defproject metosin/reitit "0.9.2"
|
||||
:description "Snappy data-driven router for Clojure(Script)"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
34
project.clj
34
project.clj
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-parent "0.9.2-rc1"
|
||||
(defproject metosin/reitit-parent "0.9.2"
|
||||
:description "Snappy data-driven router for Clojure(Script)"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
@ -18,22 +18,22 @@
|
|||
:url "https://github.com/metosin/reitit"}
|
||||
;; Ring 1.13.1 drops support for Java 1.8 so lets target 11
|
||||
:javac-options ["-Xlint:unchecked" "-target" "11" "-source" "11"]
|
||||
:managed-dependencies [[metosin/reitit "0.9.2-rc1"]
|
||||
[metosin/reitit-core "0.9.2-rc1"]
|
||||
[metosin/reitit-dev "0.9.2-rc1"]
|
||||
[metosin/reitit-spec "0.9.2-rc1"]
|
||||
[metosin/reitit-malli "0.9.2-rc1"]
|
||||
[metosin/reitit-schema "0.9.2-rc1"]
|
||||
[metosin/reitit-ring "0.9.2-rc1"]
|
||||
[metosin/reitit-middleware "0.9.2-rc1"]
|
||||
[metosin/reitit-http "0.9.2-rc1"]
|
||||
[metosin/reitit-interceptors "0.9.2-rc1"]
|
||||
[metosin/reitit-swagger "0.9.2-rc1"]
|
||||
[fi.metosin/reitit-openapi "0.9.2-rc1"]
|
||||
[metosin/reitit-swagger-ui "0.9.2-rc1"]
|
||||
[metosin/reitit-frontend "0.9.2-rc1"]
|
||||
[metosin/reitit-sieppari "0.9.2-rc1"]
|
||||
[metosin/reitit-pedestal "0.9.2-rc1"]
|
||||
:managed-dependencies [[metosin/reitit "0.9.2"]
|
||||
[metosin/reitit-core "0.9.2"]
|
||||
[metosin/reitit-dev "0.9.2"]
|
||||
[metosin/reitit-spec "0.9.2"]
|
||||
[metosin/reitit-malli "0.9.2"]
|
||||
[metosin/reitit-schema "0.9.2"]
|
||||
[metosin/reitit-ring "0.9.2"]
|
||||
[metosin/reitit-middleware "0.9.2"]
|
||||
[metosin/reitit-http "0.9.2"]
|
||||
[metosin/reitit-interceptors "0.9.2"]
|
||||
[metosin/reitit-swagger "0.9.2"]
|
||||
[fi.metosin/reitit-openapi "0.9.2"]
|
||||
[metosin/reitit-swagger-ui "0.9.2"]
|
||||
[metosin/reitit-frontend "0.9.2"]
|
||||
[metosin/reitit-sieppari "0.9.2"]
|
||||
[metosin/reitit-pedestal "0.9.2"]
|
||||
[metosin/ring-swagger-ui "5.20.0"]
|
||||
[metosin/spec-tools "0.10.7"]
|
||||
[metosin/schema-tools "0.13.1"]
|
||||
|
|
|
|||
92
test/clj/reitit/ring/middleware/session_test.clj
Normal file
92
test/clj/reitit/ring/middleware/session_test.clj
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
(ns reitit.ring.middleware.session-test
|
||||
(:require [clojure.test :refer [deftest testing is]]
|
||||
[reitit.ring.middleware.session :as session]
|
||||
[ring.middleware.session.memory :as memory]
|
||||
[reitit.spec :as rs]
|
||||
[reitit.ring :as ring]
|
||||
[reitit.ring.spec :as rrs]))
|
||||
|
||||
(defn get-session-id
|
||||
"Parse the session-id out of response headers."
|
||||
[request]
|
||||
(let [pattern #"ring-session=([-\w]+);Path=/;HttpOnly"
|
||||
parse-fn (partial re-find pattern)]
|
||||
(some-> request
|
||||
(get-in [:headers "Set-Cookie"])
|
||||
first
|
||||
parse-fn
|
||||
second)))
|
||||
|
||||
(defn handler
|
||||
"The handler that increments the counter."
|
||||
[{session :session}]
|
||||
(let [counter (inc (:counter session 0))]
|
||||
{:status 200
|
||||
:body {:counter counter}
|
||||
:session {:counter counter}}))
|
||||
|
||||
(deftest session-test
|
||||
(testing "Custom session store"
|
||||
(let [store (atom {})
|
||||
app (ring/ring-handler
|
||||
(ring/router
|
||||
["/api"
|
||||
{:session {:store (memory/memory-store store)}
|
||||
:middleware [session/session-middleware]}
|
||||
["/ping" handler]
|
||||
["/pong" handler]]))
|
||||
first-response (app {:request-method :get
|
||||
:uri "/api/ping"})
|
||||
session-id (get-session-id first-response)
|
||||
second-response (app {:request-method :get
|
||||
:uri "/api/pong"
|
||||
:cookies {"ring-session" {:value session-id}}})]
|
||||
(testing "shared across routes"
|
||||
(is (= (count @store)
|
||||
1))
|
||||
(is (-> @store first second)
|
||||
{:counter 2})))))
|
||||
|
||||
(deftest default-session-test
|
||||
(testing "Default session store"
|
||||
(let [app (ring/ring-handler
|
||||
(ring/router
|
||||
["/api"
|
||||
{:middleware [session/session-middleware]
|
||||
:session {}}
|
||||
["/ping" handler]
|
||||
["/pong" handler]]))
|
||||
first-response (app {:request-method :get
|
||||
:uri "/api/ping"})
|
||||
session-id (get-session-id first-response)
|
||||
second-response (app {:request-method :get
|
||||
:uri "/api/pong"
|
||||
:cookies {"ring-session" {:value session-id}}})]
|
||||
(testing "shared across routes"
|
||||
(is (= (inc (get-in first-response [:body :counter]))
|
||||
(get-in second-response [:body :counter])))))))
|
||||
|
||||
(deftest default-session-off-test
|
||||
(testing "Default session middleware"
|
||||
(let [app (ring/ring-handler
|
||||
(ring/router
|
||||
["/api"
|
||||
{:middleware [session/session-middleware]}
|
||||
["/ping" handler]]))
|
||||
resp (app {:request-method :get
|
||||
:uri "/api/ping"})]
|
||||
(testing "off by default"
|
||||
(is (nil? (get-session-id resp)))))))
|
||||
|
||||
(deftest session-spec-test
|
||||
(testing "Session spec"
|
||||
(testing "with invalid session store type"
|
||||
(is
|
||||
(thrown? Exception
|
||||
(ring/ring-handler
|
||||
(ring/router
|
||||
["/api"
|
||||
{:session {:store nil}
|
||||
:middleware [session/session-middleware]
|
||||
:handler handler}]
|
||||
{:validate rrs/validate})))))))
|
||||
Loading…
Reference in a new issue