Cache http routes

This commit is contained in:
Serdar Dogruyol 2018-09-16 13:17:51 +03:00
parent e59cd646cd
commit 8fb028149b
2 changed files with 15 additions and 3 deletions

View file

@ -83,5 +83,6 @@ end
Spec.after_each do
Kemal.config.clear
Kemal::RouteHandler::INSTANCE.routes = Radix::Tree(Route).new
Kemal::RouteHandler::INSTANCE.cached_routes = Hash(String, Radix::Result(Route)).new
Kemal::WebSocketHandler::INSTANCE.routes = Radix::Tree(WebSocket).new
end

View file

@ -5,10 +5,11 @@ module Kemal
include HTTP::Handler
INSTANCE = new
property routes
property routes, cached_routes
def initialize
@routes = Radix::Tree(Route).new
@cached_routes = Hash(String, Radix::Result(Route)).new
end
def call(context : HTTP::Server::Context)
@ -22,9 +23,19 @@ module Kemal
add_to_radix_tree("HEAD", path, Route.new("HEAD", path) { }) if method == "GET"
end
# Check if a route is defined and returns the lookup
# Looks up the route from the Radix::Tree for the first time and caches to improve performance.
def lookup_route(verb : String, path : String)
@routes.find radix_path(verb, path)
lookup_path = radix_path(verb, path)
if cached_route = @cached_routes[lookup_path]?
return cached_route
end
route = @routes.find(lookup_path)
@cached_routes[lookup_path] = route if route.found?
route
end
# Processes the route if it's a match. Otherwise renders 404.