Kemal 0.17.0 released!
Hello everyone,
Kemal 0.17.0 is here! It’s the most complete and polished release yet with lots of goodies. This release also adds support for the awesome Crystal 0.20.0 release.
Better Middleware / Filter Routing
Now all requests will first go through the Middleware stack then Filters (before_* / after_*) and will finally reach the matching route.
Which is illustrated as,
Request -> Middleware -> Filter -> Route
Let’s take a look at an example. Be aware that all custom handlers have to inherit from Kemal::Handler
.
class MyCustomHandler < Kemal::Handler
def call(env)
puts "You shall pass me first!"
call_next(env)
end
end
before_get "/" do
puts "This will work before get"
end
get "/" do
puts "Hello Kemal!"
end
add_handler MyCustomHandler.new
Now what’s the output of this? Before Kemal 0.17.0
This will work before get
You shall pass me first!
Hello Kemal
As you can easily see before 0.17.0
handlers worked after the filters. After 0.17.0
it will work as expected
You shall pass me first!
This will work before get
Hello Kemal
Neat!
Only / Exclude for Handlers
Now that the lifecycle of a request / response starts from a Handler
it’d be great to have a handler work for specified routes.
That’s where only/exclude
comes to play.
Consider that we have a handler like this which will on run for /
path.
class OnlyHandler < Kemal::Handler
only ["/"]
def call(env)
return call_next(env) unless only_match?(env)
puts "If the path is / i will be doing some processing here."
end
end
Here’s 2 points to catch.
- You define which routes the handler will run with
only ["/"]
. - You check if the route is a
only
registered withonly_match?(env)
.
Here’s also a sample for exclude
class ExcludeHandler < Kemal::Handler
exclude ["/"]
def call(env)
return call_next(env) unless only_match?(env)
puts "If the path is NOT / i will be doing some processing here."
end
end
Simple enough!
Better Custom Error Handling
error
handler now also yields error. For example you can get the error mesasage like
error 500 do |env, err|
err.message
end
More
Be sure to check out the CHANGELOG for the full awesomeness and bug fixes :) And a big THANKS to everyone for making this release possible <3
Happy Crystalling!