Sha256: 8881f3a757f69bc809b74d17418d0fde1392d9e4b030c9b8e205f90d390682c0
Contents?: true
Size: 1.17 KB
Versions: 2
Compression:
Stored size: 1.17 KB
Contents
module Kontrol class Router def initialize @routing = [] end def map(pattern, block, options = {}) @routing << [pattern, block, options] end OPTION_MAPPING = { :method => 'REQUEST_METHOD', :port => 'SERVER_PORT', :host => 'HTTP_HOST', :accept => 'HTTP_ACCEPT', :query => 'QUERY_STRING', :content_type => 'CONTENT_TYPE' } def options_match(env, options) options.all? do |name, pattern| value = env[OPTION_MAPPING[name] || name] value and pattern.match(value) end end def call(env) path = env["PATH_INFO"].to_s.squeeze("/") for pattern, app, options in @routing match = path.match(/^#{pattern}/) if match and options_match(env, options) env = env.dup (env['kontrol.args'] ||= []).concat(match.to_a[1..-1]) if match[0] == pattern env["SCRIPT_NAME"] += match[0] env["PATH_INFO"] = path[match[0].size..-1] end return app.call(env) end end [404, {"Content-Type" => "text/plain"}, ["Not Found: #{env['REQUEST_URI']}"]] end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
georgi-kontrol-0.1.1 | lib/kontrol/router.rb |
georgi-kontrol-0.1 | lib/kontrol/router.rb |