Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
HTTP route-matching library for Clojure
branch: master

Merge pull request #22 from PCTiby/master

Add no-slurp hint for Instaparse
latest commit 76b9e5c729
James Reeves authored
Failed to load latest commit information.
src/clout Add no-slurp hint for Instaparse
test/clout Add escaping to routes
.gitignore Updated .gitignore with latest Lein defaults
.travis.yml Added .travis.yml file
LICENSE.html Removed unncessary copyright notice in file, added LICENSE.html
project.clj Release 2.1.0


Build Status

Clout is a library for matching Ring HTTP requests. It uses the same routing syntax as used by popular Ruby web frameworks like Ruby on Rails and Sinatra.


Add the following to your project.clj dependencies:

[clout "2.1.0"]


Require Clout in the normal way:

(require '[clout.core :as clout])

These following examples also make use of the ring-mock library to generate Ring request maps:

(require '[ring.mock.request :as mock])

Routes can match by keyword:

 (mock/request :get "/article/clojure"))

=> {:title "clojure"}

Or with wildcards:

 (mock/request :get "/public/style/screen.css"))

=> {:* "style/screen.css"}

Clout can also match absolute routes:

 (mock/request :get ""))

=> {}

And scheme-relative routes:

 (mock/request :get ""))

=> {}

 (mock/request :get ""))

=> {}

Clout supports both keywords and wildcards. Keywords (like ":title") will match any character but the following: / . , ; ?. Wildcards (*) will match anything.

If a route does not match, nil is returned:

(clout/route-matches "/products" (mock/request :get "/articles"))

=> nil

For additional performance, you can choose to pre-compile a route:

(def user-route
  (clout/route-compile "/user/:id"))

(clout/route-matches user-route (mock/request :get "/user/10"))

=> {:id "10"}

When compiling a route, you can specify a map of regular expressions to use for different keywords. This allows more specific routing:

(def user-route
  (clout/route-compile "/user/:id" {:id #"\d+"}))

(clout/route-matches user-route (mock/request :get "/user/10"))

=> {:user "10"}

(clout/route-matches user-route (mock/request :get "/user/jsmith"))

=> nil

You can also specify regular expressions inline in braces after the keyword:

(def user-route
  (clout/route-compile "/user/:id{\\d+}"))

Note that regular expression escape sequences (like \d) need to be double-escaped when placed inline in a string.


Copyright © 2014 James Reeves

Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.

Something went wrong with that request. Please try again.