A kick-ass HTTP router for use in Rack https://github.com/joshbuddy/http_router
Go to file
Joshua Hull defc049bf6
Merge pull request #48 from jamesdabbs/master
Fix env handling for Rack 2
2022-09-29 22:06:31 +00:00
benchmarks capture original path, allow head 2011-09-24 15:18:57 -07:00
examples remove rack mapper support 2012-04-11 11:36:33 -07:00
js whoops, no log here 2011-09-10 14:11:04 -07:00
lib Merge pull request #48 from jamesdabbs/master 2022-09-29 22:06:31 +00:00
test Don't assume a router in Route#name=. 2014-08-01 04:11:20 -07:00
.gitignore add to gitignore 2011-09-10 14:11:18 -07:00
Gemfile Removes bundler deprecation warning 2014-01-27 16:40:34 -05:00
LICENSE added license 2011-04-18 01:37:37 -07:00
README.md Update README to match the code. 2015-06-29 17:32:08 +02:00
Rakefile fix doc references 2013-09-20 19:51:39 -03:00
http_router.gemspec remove bundler version requirement 2012-04-10 10:47:46 -07:00

README.md

HTTP Router

What is it?

This is an HTTP router for use in either a web framework, or on it's own using Rack. It takes a set of routes and attempts to find the best match for it. Take a look at the examples directory for how you'd use it in the Rack context.

Features

  • Ordered route resolution.
  • Supports variables, and globbing, both named and unnamed.
  • Regex support for variables.
  • Request condition support.
  • Partial matches.
  • Supports interstitial variables (e.g. /my-:variable-brings.all.the.boys/yard) and unnamed variable /one/:/two
  • Very fast and small code base (~1,000 loc).
  • Sinatra via https://github.com/joshbuddy/http_router_sinatra

Usage

Please see the examples directory for a bunch of awesome rackup file examples, with tonnes of commentary. As well, the rdocs should provide a lot of useful specifics and exact usage.

HttpRouter.new

Takes the following options:

  • :default_app - The default #call made on non-matches. Defaults to a 404 generator.
  • :ignore_trailing_slash - Ignores the trailing slash when matching. Defaults to true.
  • :middleware - Perform matching without deferring to matched route. Defaults to false.

#add(name, options)

Maps a route. The format for variables in paths is: :variable *glob

Everything else is treated literally. Optional parts are surrounded by brackets. Partially matching paths have a trailing *. Optional trailing slash matching is done with /?.

As well, you can escape the following characters with a backslash: ( ) : *

Once you have a route object, use HttpRouter::Route#to to add a destination and HttpRouter::Route#name to name it.

e.g.

  r = HttpRouter.new
  r.add('/test/:variable(.:format)').name(:my_test_path).to {|env| [200, {}, "Hey dude #{env['router.params'][:variable]}"]}
  r.add('/test').redirect("http://www.google.com/")
  r.add('/static').static('/my_file_system')

As well, you can support regex matching and request conditions. To add a regex match, use matching(:id => /\d+/). To match on a request condition you can use condition(:request_method => %w(POST HEAD)) or more succinctly request_method('POST', 'HEAD').

There are convenience methods HttpRouter#get, HttpRouter#post, etc for each request method.

Routes will not be recognized unless #to has been called on it.

#url(name or route, *args)

Generates a route. The args can either be a hash, a list, or a mix of both.

#call(env)

Recognizes and dispatches the request. env should be a Hash representing the rack environment.

#recognize(env)

Only performs recognition. env should be a Hash representing the rack environment.