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
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
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
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.
only/exclude comes to play.
Consider that we have a handler like this which will on run for
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
- You check if the route is a
Here’s also a sample for
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
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
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