commit
cd5f83f013
2 changed files with 20 additions and 4 deletions
|
@ -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
|
||||
|
|
|
@ -5,10 +5,12 @@ module Kemal
|
|||
include HTTP::Handler
|
||||
|
||||
INSTANCE = new
|
||||
property routes
|
||||
CACHED_ROUTES_LIMIT = 1024
|
||||
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 +24,22 @@ 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)
|
||||
|
||||
if route.found?
|
||||
@cached_routes.clear if @cached_routes.size == CACHED_ROUTES_LIMIT
|
||||
@cached_routes[lookup_path] = route
|
||||
end
|
||||
|
||||
route
|
||||
end
|
||||
|
||||
# Processes the route if it's a match. Otherwise renders 404.
|
||||
|
|
Loading…
Reference in a new issue