mirror of
https://gitea.invidious.io/iv-org/shard-kemal.git
synced 2024-08-15 00:53:36 +00:00
Prettify docs (#410)
This commit is contained in:
parent
c2da18ed38
commit
210e2c0801
16 changed files with 129 additions and 85 deletions
12
src/kemal.cr
12
src/kemal.cr
|
@ -7,26 +7,26 @@ require "./kemal/ext/*"
|
||||||
require "./kemal/helpers/*"
|
require "./kemal/helpers/*"
|
||||||
|
|
||||||
module Kemal
|
module Kemal
|
||||||
# Overload of self.run with the default startup logging
|
# Overload of `self.run` with the default startup logging.
|
||||||
def self.run(port : Int32?)
|
def self.run(port : Int32?)
|
||||||
self.run port do
|
self.run port do
|
||||||
log "[#{config.env}] Kemal is ready to lead at #{config.scheme}://#{config.host_binding}:#{config.port}"
|
log "[#{config.env}] Kemal is ready to lead at #{config.scheme}://#{config.host_binding}:#{config.port}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Overload of self.run without port - fixex #399
|
# Overload of `self.run` without port.
|
||||||
def self.run
|
def self.run
|
||||||
self.run(nil)
|
self.run(nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Overload of self.run to allow just a block
|
# Overload of `self.run` to allow just a block.
|
||||||
def self.run(&block)
|
def self.run(&block)
|
||||||
self.run nil, &block
|
self.run nil, &block
|
||||||
end
|
end
|
||||||
|
|
||||||
# The command to run a `Kemal` application.
|
# The command to run a `Kemal` application.
|
||||||
# The port can be given to `#run` but is optional.
|
#
|
||||||
# If not given Kemal will use `Kemal::Config#port`
|
# If *port* is not given Kemal will use `Kemal::Config#port`
|
||||||
def self.run(port : Int32? = nil, &block)
|
def self.run(port : Int32? = nil, &block)
|
||||||
Kemal::CLI.new
|
Kemal::CLI.new
|
||||||
config = Kemal.config
|
config = Kemal.config
|
||||||
|
@ -61,7 +61,7 @@ module Kemal
|
||||||
|
|
||||||
config.server ||= HTTP::Server.new(config.host_binding, config.port, config.handlers)
|
config.server ||= HTTP::Server.new(config.host_binding, config.port, config.handlers)
|
||||||
{% if !flag?(:without_openssl) %}
|
{% if !flag?(:without_openssl) %}
|
||||||
config.server.not_nil!.tls = config.ssl
|
config.server.not_nil!.tls = config.ssl
|
||||||
{% end %}
|
{% end %}
|
||||||
config.running = true
|
config.running = true
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module Kemal
|
module Kemal
|
||||||
# Kemal::CommonExceptionHandler handles all the exceptions including 404, custom errors and 500.
|
# Handles all the exceptions, including 404, custom errors and 500.
|
||||||
class CommonExceptionHandler
|
class CommonExceptionHandler
|
||||||
include HTTP::Handler
|
include HTTP::Handler
|
||||||
INSTANCE = new
|
INSTANCE = new
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module Kemal
|
module Kemal
|
||||||
# Kemal::CommonLogHandler uses STDOUT by default and handles the logging of request/response process time.
|
# Uses `STDOUT` by default and handles the logging of request/response process time.
|
||||||
class CommonLogHandler < Kemal::BaseLogHandler
|
class CommonLogHandler < Kemal::BaseLogHandler
|
||||||
@io : IO
|
@io : IO
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
module Kemal
|
module Kemal
|
||||||
# Kemal::Config stores all the configuration options for a Kemal application.
|
# Stores all the configuration options for a Kemal application.
|
||||||
# It's a singleton and you can access it like.
|
# It's a singleton and you can access it like.
|
||||||
#
|
#
|
||||||
# Kemal.config
|
# ```
|
||||||
#
|
# Kemal.config
|
||||||
|
# ```
|
||||||
class Config
|
class Config
|
||||||
INSTANCE = Config.new
|
INSTANCE = Config.new
|
||||||
HANDLERS = [] of HTTP::Handler
|
HANDLERS = [] of HTTP::Handler
|
||||||
|
@ -12,9 +13,9 @@ module Kemal
|
||||||
ERROR_HANDLERS = {} of Int32 => HTTP::Server::Context, Exception -> String
|
ERROR_HANDLERS = {} of Int32 => HTTP::Server::Context, Exception -> String
|
||||||
|
|
||||||
{% if flag?(:without_openssl) %}
|
{% if flag?(:without_openssl) %}
|
||||||
@ssl : Bool?
|
@ssl : Bool?
|
||||||
{% else %}
|
{% else %}
|
||||||
@ssl : OpenSSL::SSL::Context::Server?
|
@ssl : OpenSSL::SSL::Context::Server?
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
getter custom_handler_position
|
getter custom_handler_position
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
# Kemal DSL is defined here and it's baked into global scope.
|
# Kemal DSL is defined here and it's baked into global scope.
|
||||||
# The DSL currently consists of
|
#
|
||||||
|
# The DSL currently consists of:
|
||||||
|
#
|
||||||
# - get post put patch delete options
|
# - get post put patch delete options
|
||||||
# - WebSocket(ws)
|
# - WebSocket(ws)
|
||||||
# - before_*
|
# - before_*
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
# HTTP::Server::Context is the class which holds HTTP::Request and HTTP::Server::Response alongside with
|
# `HTTP::Server::Context` is the class which holds `HTTP::Request` and
|
||||||
# information such as request params, request/response content_type, session e.g
|
# `HTTP::Server::Response` alongside with information such as request params,
|
||||||
|
# request/response content_type, session data and alike.
|
||||||
#
|
#
|
||||||
# Instances of this class are passed to an `HTTP::Server` handler.
|
# Instances of this class are passed to an `HTTP::Server` handler.
|
||||||
class HTTP::Server
|
class HTTP::Server
|
||||||
|
|
|
@ -10,7 +10,7 @@ module Kemal
|
||||||
Kemal.config.add_filter_handler(self)
|
Kemal.config.add_filter_handler(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
# The call order of the filters is before_all -> before_x -> X -> after_x -> after_all
|
# The call order of the filters is `before_all -> before_x -> X -> after_x -> after_all`.
|
||||||
def call(context : HTTP::Server::Context)
|
def call(context : HTTP::Server::Context)
|
||||||
return call_next(context) unless context.route_defined?
|
return call_next(context) unless context.route_defined?
|
||||||
call_block_for_path_type("ALL", context.request.path, :before, context)
|
call_block_for_path_type("ALL", context.request.path, :before, context)
|
||||||
|
@ -24,7 +24,8 @@ module Kemal
|
||||||
context
|
context
|
||||||
end
|
end
|
||||||
|
|
||||||
# :nodoc: This shouldn't be called directly, it's not private because I need to call it for testing purpose since I can't call the macros in the spec.
|
# :nodoc: This shouldn't be called directly, it's not private because
|
||||||
|
# I need to call it for testing purpose since I can't call the macros in the spec.
|
||||||
# It adds the block for the corresponding verb/path/type combination to the tree.
|
# It adds the block for the corresponding verb/path/type combination to the tree.
|
||||||
def _add_route_filter(verb : String, path, type, &block : HTTP::Server::Context -> _)
|
def _add_route_filter(verb : String, path, type, &block : HTTP::Server::Context -> _)
|
||||||
lookup = lookup_filters_for_path_type(verb, path, type)
|
lookup = lookup_filters_for_path_type(verb, path, type)
|
||||||
|
@ -35,12 +36,16 @@ module Kemal
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# This can be called directly but it's simpler to just use the macros, it will check if another filter is not already defined for this verb/path/type and proceed to call `add_route_filter`
|
# This can be called directly but it's simpler to just use the macros,
|
||||||
|
# it will check if another filter is not already defined for this
|
||||||
|
# verb/path/type and proceed to call `add_route_filter`
|
||||||
def before(verb : String, path : String = "*", &block : HTTP::Server::Context -> _)
|
def before(verb : String, path : String = "*", &block : HTTP::Server::Context -> _)
|
||||||
_add_route_filter verb, path, :before, &block
|
_add_route_filter verb, path, :before, &block
|
||||||
end
|
end
|
||||||
|
|
||||||
# This can be called directly but it's simpler to just use the macros, it will check if another filter is not already defined for this verb/path/type and proceed to call `add_route_filter`
|
# This can be called directly but it's simpler to just use the macros,
|
||||||
|
# it will check if another filter is not already defined for this
|
||||||
|
# verb/path/type and proceed to call `add_route_filter`
|
||||||
def after(verb : String, path : String = "*", &block : HTTP::Server::Context -> _)
|
def after(verb : String, path : String = "*", &block : HTTP::Server::Context -> _)
|
||||||
_add_route_filter verb, path, :after, &block
|
_add_route_filter verb, path, :after, &block
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
module Kemal
|
module Kemal
|
||||||
# `Kemal::Handler` is a subclass of `HTTP::Handler`.
|
# `Kemal::Handler` is a subclass of `HTTP::Handler`.
|
||||||
|
#
|
||||||
# It adds `only`, `only_match?`, `exclude`, `exclude_match?`.
|
# It adds `only`, `only_match?`, `exclude`, `exclude_match?`.
|
||||||
# These methods are useful for custom handlers for conditional execution.
|
# These methods are useful for custom handlers for conditional execution.
|
||||||
class Handler
|
class Handler
|
||||||
|
@ -32,14 +33,16 @@ module Kemal
|
||||||
#
|
#
|
||||||
# However this is not done automatically. All handlers must inherit from `Kemal::Handler`.
|
# However this is not done automatically. All handlers must inherit from `Kemal::Handler`.
|
||||||
#
|
#
|
||||||
# class OnlyHandler < Kemal::Handler
|
# ```
|
||||||
# only ["/"]
|
# class OnlyHandler < Kemal::Handler
|
||||||
|
# only ["/"]
|
||||||
#
|
#
|
||||||
# def call(env)
|
# def call(env)
|
||||||
# return call_next(env) unless only_match?(env)
|
# return call_next(env) unless only_match?(env)
|
||||||
# puts "If the path is / i will be doing some processing here."
|
# puts "If the path is / i will be doing some processing here."
|
||||||
# end
|
# end
|
||||||
# end
|
# end
|
||||||
|
# ```
|
||||||
def only_match?(env : HTTP::Server::Context)
|
def only_match?(env : HTTP::Server::Context)
|
||||||
@@only_routes_tree.find(radix_path(env.request.method, env.request.path)).found?
|
@@only_routes_tree.find(radix_path(env.request.method, env.request.path)).found?
|
||||||
end
|
end
|
||||||
|
@ -51,14 +54,16 @@ module Kemal
|
||||||
#
|
#
|
||||||
# However this is not done automatically. All handlers must inherit from `Kemal::Handler`.
|
# However this is not done automatically. All handlers must inherit from `Kemal::Handler`.
|
||||||
#
|
#
|
||||||
# class ExcludeHandler < Kemal::Handler
|
# ```
|
||||||
# exclude ["/"]
|
# class ExcludeHandler < Kemal::Handler
|
||||||
|
# exclude ["/"]
|
||||||
#
|
#
|
||||||
# def call(env)
|
# def call(env)
|
||||||
# return call_next(env) if exclude_match?(env)
|
# return call_next(env) if exclude_match?(env)
|
||||||
# puts "If the path is not / i will be doing some processing here."
|
# puts "If the path is not / i will be doing some processing here."
|
||||||
# end
|
# end
|
||||||
# end
|
# end
|
||||||
|
# ```
|
||||||
def exclude_match?(env : HTTP::Server::Context)
|
def exclude_match?(env : HTTP::Server::Context)
|
||||||
@@exclude_routes_tree.find(radix_path(env.request.method, env.request.path)).found?
|
@@exclude_routes_tree.find(radix_path(env.request.method, env.request.path)).found?
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
# Adds given Kemal::Handler to handlers chain.
|
# Adds given `Kemal::Handler` to handlers chain.
|
||||||
# There are 5 handlers by default and all the custom handlers
|
# There are 5 handlers by default and all the custom handlers
|
||||||
# goes between the first 4 and the last `Kemal::RouteHandler`.
|
# goes between the first 4 and the last `Kemal::RouteHandler`.
|
||||||
#
|
#
|
||||||
# - Kemal::InitHandler
|
# - `Kemal::InitHandler`
|
||||||
# - Kemal::CommonLogHandler
|
# - `Kemal::CommonLogHandler`
|
||||||
# - Kemal::CommonExceptionHandler
|
# - `Kemal::CommonExceptionHandler`
|
||||||
# - Kemal::StaticFileHandler
|
# - `Kemal::StaticFileHandler`
|
||||||
# - Here goes custom handlers
|
# - Here goes custom handlers
|
||||||
# - Kemal::RouteHandler
|
# - `Kemal::RouteHandler`
|
||||||
def add_handler(handler : HTTP::Handler)
|
def add_handler(handler : HTTP::Handler)
|
||||||
Kemal.config.add_handler handler
|
Kemal.config.add_handler handler
|
||||||
end
|
end
|
||||||
|
@ -17,6 +17,7 @@ def add_handler(handler : HTTP::Handler, position : Int32)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Sets public folder from which the static assets will be served.
|
# Sets public folder from which the static assets will be served.
|
||||||
|
#
|
||||||
# By default this is `/public` not `src/public`.
|
# By default this is `/public` not `src/public`.
|
||||||
def public_folder(path : String)
|
def public_folder(path : String)
|
||||||
Kemal.config.public_folder = path
|
Kemal.config.public_folder = path
|
||||||
|
@ -31,7 +32,9 @@ end
|
||||||
# Enables / Disables logging.
|
# Enables / Disables logging.
|
||||||
# This is enabled by default.
|
# This is enabled by default.
|
||||||
#
|
#
|
||||||
# logging false
|
# ```
|
||||||
|
# logging false
|
||||||
|
# ```
|
||||||
def logging(status : Bool)
|
def logging(status : Bool)
|
||||||
Kemal.config.logging = status
|
Kemal.config.logging = status
|
||||||
end
|
end
|
||||||
|
@ -41,22 +44,26 @@ end
|
||||||
# A custom logger must inherit from `Kemal::BaseLogHandler` and must implement
|
# A custom logger must inherit from `Kemal::BaseLogHandler` and must implement
|
||||||
# `call(env)`, `write(message)` methods.
|
# `call(env)`, `write(message)` methods.
|
||||||
#
|
#
|
||||||
# class MyCustomLogger < Kemal::BaseLogHandler
|
# ```
|
||||||
|
# class MyCustomLogger < Kemal::BaseLogHandler
|
||||||
#
|
#
|
||||||
# def call(env)
|
# def call(env)
|
||||||
# puts "I'm logging some custom stuff here."
|
# puts "I'm logging some custom stuff here."
|
||||||
# call_next(env) # => This calls the next handler
|
# call_next(env) # => This calls the next handler
|
||||||
# end
|
|
||||||
#
|
|
||||||
# # This is used from `log` method.
|
|
||||||
# def write(message)
|
|
||||||
# STDERR.puts message # => Logs the output to STDERR
|
|
||||||
# end
|
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
|
# # This is used from `log` method.
|
||||||
|
# def write(message)
|
||||||
|
# STDERR.puts message # => Logs the output to STDERR
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
# ```
|
||||||
|
#
|
||||||
# Now that we have a custom logger here's how we use it
|
# Now that we have a custom logger here's how we use it
|
||||||
#
|
#
|
||||||
# logger MyCustomLogger.new
|
# ```
|
||||||
|
# logger MyCustomLogger.new
|
||||||
|
# ```
|
||||||
def logger(logger : Kemal::BaseLogHandler)
|
def logger(logger : Kemal::BaseLogHandler)
|
||||||
Kemal.config.logger = logger
|
Kemal.config.logger = logger
|
||||||
Kemal.config.add_handler logger
|
Kemal.config.add_handler logger
|
||||||
|
@ -65,12 +72,16 @@ end
|
||||||
# Enables / Disables static file serving.
|
# Enables / Disables static file serving.
|
||||||
# This is enabled by default.
|
# This is enabled by default.
|
||||||
#
|
#
|
||||||
|
# ```
|
||||||
# serve_static false
|
# serve_static false
|
||||||
|
# ```
|
||||||
#
|
#
|
||||||
# Static server also have some advanced customization options like `dir_listing` and
|
# Static server also have some advanced customization options like `dir_listing` and
|
||||||
# `gzip`.
|
# `gzip`.
|
||||||
#
|
#
|
||||||
|
# ```
|
||||||
# serve_static {"gzip" => true, "dir_listing" => false}
|
# serve_static {"gzip" => true, "dir_listing" => false}
|
||||||
|
# ```
|
||||||
def serve_static(status : (Bool | Hash))
|
def serve_static(status : (Bool | Hash))
|
||||||
Kemal.config.serve_static = status
|
Kemal.config.serve_static = status
|
||||||
end
|
end
|
||||||
|
@ -78,9 +89,11 @@ end
|
||||||
# Helper for easily modifying response headers.
|
# Helper for easily modifying response headers.
|
||||||
# This can be used to modify a response header with the given hash.
|
# This can be used to modify a response header with the given hash.
|
||||||
#
|
#
|
||||||
# def call(env)
|
# ```
|
||||||
# headers(env, {"custom-header" => "This is a custom value"})
|
# def call(env)
|
||||||
# end
|
# headers(env, {"X-Custom-Header" => "This is a custom value"})
|
||||||
|
# end
|
||||||
|
# ```
|
||||||
def headers(env : HTTP::Server::Context, additional_headers : Hash(String, String))
|
def headers(env : HTTP::Server::Context, additional_headers : Hash(String, String))
|
||||||
env.response.headers.merge!(additional_headers)
|
env.response.headers.merge!(additional_headers)
|
||||||
end
|
end
|
||||||
|
@ -88,11 +101,15 @@ end
|
||||||
# Send a file with given path and base the mime-type on the file extension
|
# Send a file with given path and base the mime-type on the file extension
|
||||||
# or default `application/octet-stream` mime_type.
|
# or default `application/octet-stream` mime_type.
|
||||||
#
|
#
|
||||||
# send_file env, "./path/to/file"
|
# ```
|
||||||
|
# send_file env, "./path/to/file"
|
||||||
|
# ```
|
||||||
#
|
#
|
||||||
# Optionally you can override the mime_type
|
# Optionally you can override the mime_type
|
||||||
#
|
#
|
||||||
# send_file env, "./path/to/file", "image/jpeg"
|
# ```
|
||||||
|
# send_file env, "./path/to/file", "image/jpeg"
|
||||||
|
# ```
|
||||||
def send_file(env : HTTP::Server::Context, path : String, mime_type : String? = nil)
|
def send_file(env : HTTP::Server::Context, path : String, mime_type : String? = nil)
|
||||||
config = Kemal.config.serve_static
|
config = Kemal.config.serve_static
|
||||||
file_path = File.expand_path(path, Dir.current)
|
file_path = File.expand_path(path, Dir.current)
|
||||||
|
@ -184,11 +201,15 @@ end
|
||||||
|
|
||||||
# Send a file with given data and default `application/octet-stream` mime_type.
|
# Send a file with given data and default `application/octet-stream` mime_type.
|
||||||
#
|
#
|
||||||
# send_file env, data_slice
|
# ```
|
||||||
|
# send_file env, data_slice
|
||||||
|
# ```
|
||||||
#
|
#
|
||||||
# Optionally you can override the mime_type
|
# Optionally you can override the mime_type
|
||||||
#
|
#
|
||||||
# send_file env, data_slice, "image/jpeg"
|
# ```
|
||||||
|
# send_file env, data_slice, "image/jpeg"
|
||||||
|
# ```
|
||||||
def send_file(env : HTTP::Server::Context, data : Slice(UInt8), mime_type : String? = nil)
|
def send_file(env : HTTP::Server::Context, data : Slice(UInt8), mime_type : String? = nil)
|
||||||
mime_type ||= "application/octet-stream"
|
mime_type ||= "application/octet-stream"
|
||||||
env.response.content_type = mime_type
|
env.response.content_type = mime_type
|
||||||
|
@ -198,14 +219,15 @@ end
|
||||||
|
|
||||||
# Configures an `HTTP::Server::Response` to compress the response
|
# Configures an `HTTP::Server::Response` to compress the response
|
||||||
# output, either using gzip or deflate, depending on the `Accept-Encoding` request header.
|
# output, either using gzip or deflate, depending on the `Accept-Encoding` request header.
|
||||||
# It's disabled by default.
|
#
|
||||||
|
# Disabled by default.
|
||||||
def gzip(status : Bool = false)
|
def gzip(status : Bool = false)
|
||||||
add_handler HTTP::CompressHandler.new if status
|
add_handler HTTP::CompressHandler.new if status
|
||||||
end
|
end
|
||||||
|
|
||||||
# Adds headers to `Kemal::StaticFileHandler`. This is especially useful for `CORS`.
|
# Adds headers to `Kemal::StaticFileHandler`. This is especially useful for `CORS`.
|
||||||
#
|
#
|
||||||
# ```ruby
|
# ```
|
||||||
# static_headers do |response, filepath, filestat|
|
# static_headers do |response, filepath, filestat|
|
||||||
# if filepath =~ /\.html$/
|
# if filepath =~ /\.html$/
|
||||||
# response.headers.add("Access-Control-Allow-Origin", "*")
|
# response.headers.add("Access-Control-Allow-Origin", "*")
|
||||||
|
|
|
@ -13,16 +13,20 @@ CONTENT_FOR_BLOCKS = Hash(String, Tuple(String, Proc(String))).new
|
||||||
# You call `content_for`, generally from a view, to capture a block of markup
|
# You call `content_for`, generally from a view, to capture a block of markup
|
||||||
# giving it an identifier:
|
# giving it an identifier:
|
||||||
#
|
#
|
||||||
# # index.ecr
|
# ```
|
||||||
# <% content_for "some_key" do %>
|
# # index.ecr
|
||||||
# <chunk of="html">...</chunk>
|
# <% content_for "some_key" do %>
|
||||||
# <% end %>
|
# <chunk of="html">...</chunk>
|
||||||
|
# <% end %>
|
||||||
|
# ```
|
||||||
#
|
#
|
||||||
# Then, you call `yield_content` with that identifier, generally from a
|
# Then, you call `yield_content` with that identifier, generally from a
|
||||||
# layout, to render the captured block:
|
# layout, to render the captured block:
|
||||||
#
|
#
|
||||||
# # layout.ecr
|
# ```
|
||||||
# <%= yield_content "some_key" %>
|
# # layout.ecr
|
||||||
|
# <%= yield_content "some_key" %>
|
||||||
|
# ```
|
||||||
#
|
#
|
||||||
# ## And How Is This Useful?
|
# ## And How Is This Useful?
|
||||||
#
|
#
|
||||||
|
@ -53,8 +57,9 @@ end
|
||||||
|
|
||||||
# Render view with a layout as the superview.
|
# Render view with a layout as the superview.
|
||||||
#
|
#
|
||||||
# render "src/views/index.ecr", "src/views/layout.ecr"
|
# ```
|
||||||
#
|
# render "src/views/index.ecr", "src/views/layout.ecr"
|
||||||
|
# ```
|
||||||
macro render(filename, layout)
|
macro render(filename, layout)
|
||||||
__content_filename__ = {{filename}}
|
__content_filename__ = {{filename}}
|
||||||
content = render {{filename}}
|
content = render {{filename}}
|
||||||
|
@ -69,7 +74,9 @@ end
|
||||||
# Halt execution with the current context.
|
# Halt execution with the current context.
|
||||||
# Returns 200 and an empty response by default.
|
# Returns 200 and an empty response by default.
|
||||||
#
|
#
|
||||||
# halt env, status_code: 403, response: "Forbidden"
|
# ```
|
||||||
|
# halt env, status_code: 403, response: "Forbidden"
|
||||||
|
# ```
|
||||||
macro halt(env, status_code = 200, response = "")
|
macro halt(env, status_code = 200, response = "")
|
||||||
{{env}}.response.status_code = {{status_code}}
|
{{env}}.response.status_code = {{status_code}}
|
||||||
{{env}}.response.print {{response}}
|
{{env}}.response.print {{response}}
|
||||||
|
@ -79,12 +86,13 @@ end
|
||||||
|
|
||||||
# Extends context storage with user defined types.
|
# Extends context storage with user defined types.
|
||||||
#
|
#
|
||||||
|
# ```
|
||||||
# class User
|
# class User
|
||||||
# property name
|
# property name
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# add_context_storage_type(User)
|
# add_context_storage_type(User)
|
||||||
#
|
# ```
|
||||||
macro add_context_storage_type(type)
|
macro add_context_storage_type(type)
|
||||||
{{ HTTP::Server::Context::STORE_MAPPINGS.push(type) }}
|
{{ HTTP::Server::Context::STORE_MAPPINGS.push(type) }}
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
module Kemal
|
module Kemal
|
||||||
# Kemal::InitHandler is the first handler thus initializes the context with default values.
|
# Initializes the context with default values, such as
|
||||||
# Such as *Content-Type*, *X-Powered-By* headers.
|
# *Content-Type* or *X-Powered-By* headers.
|
||||||
class InitHandler
|
class InitHandler
|
||||||
include HTTP::Handler
|
include HTTP::Handler
|
||||||
INSTANCE = new
|
INSTANCE = new
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
module Kemal
|
module Kemal
|
||||||
# ParamParser parses the request contents including query_params and body
|
# Parses the request contents including query_params and body
|
||||||
# and converts them into a params hash which you can within the environment
|
# and converts them into a params hash which you can use within
|
||||||
# context.
|
# the environment context.
|
||||||
class ParamParser
|
class ParamParser
|
||||||
URL_ENCODED_FORM = "application/x-www-form-urlencoded"
|
URL_ENCODED_FORM = "application/x-www-form-urlencoded"
|
||||||
APPLICATION_JSON = "application/json"
|
APPLICATION_JSON = "application/json"
|
||||||
|
@ -78,9 +78,9 @@ module Kemal
|
||||||
end
|
end
|
||||||
|
|
||||||
# Parses JSON request body if Content-Type is `application/json`.
|
# Parses JSON request body if Content-Type is `application/json`.
|
||||||
# If request body is a JSON Hash then all the params are parsed and added into `params`.
|
#
|
||||||
# If request body is a JSON Array it's added into `params` as `_json` and can be accessed
|
# - If request body is a JSON `Hash` then all the params are parsed and added into `params`.
|
||||||
# like params["_json"]
|
# - If request body is a JSON `Array` it's added into `params` as `_json` and can be accessed like `params["_json"]`.
|
||||||
private def parse_json
|
private def parse_json
|
||||||
return unless @request.body && @request.headers["Content-Type"]?.try(&.starts_with?(APPLICATION_JSON))
|
return unless @request.body && @request.headers["Content-Type"]?.try(&.starts_with?(APPLICATION_JSON))
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
module Kemal
|
module Kemal
|
||||||
# Route is the main building block of Kemal.
|
# Route is the main building block of Kemal.
|
||||||
# It takes 3 parameters: Method, path and a block to specify
|
#
|
||||||
|
# It takes 3 parameters: http *method*, *path* and a *handler* to specify
|
||||||
# what action to be done if the route is matched.
|
# what action to be done if the route is matched.
|
||||||
struct Route
|
struct Route
|
||||||
getter method, path, handler
|
getter method, path, handler
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
require "radix"
|
require "radix"
|
||||||
|
|
||||||
module Kemal
|
module Kemal
|
||||||
# Kemal::RouteHandler is the main handler which handles all the HTTP requests. Routing, parsing, rendering e.g
|
# Main handler which handles all the HTTP requests.
|
||||||
# are done in this handler.
|
# Routing, parsing, rendering e.g are done in this handler.
|
||||||
class RouteHandler
|
class RouteHandler
|
||||||
include HTTP::Handler
|
include HTTP::Handler
|
||||||
INSTANCE = new
|
INSTANCE = new
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
module Kemal
|
module Kemal
|
||||||
# Route is the main building block of Kemal.
|
# Takes 2 parameters: *path* and a *handler* to specify
|
||||||
# It takes 3 parameters: Method, path and a block to specify
|
|
||||||
# what action to be done if the route is matched.
|
# what action to be done if the route is matched.
|
||||||
class WebSocket < HTTP::WebSocketHandler
|
class WebSocket < HTTP::WebSocketHandler
|
||||||
getter proc
|
getter proc
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module Kemal
|
module Kemal
|
||||||
# Kemal::WebSocketHandler is used for building a WebSocket route.
|
# Used for building a WebSocket route.
|
||||||
# For each WebSocket route a new handler is created and registered to global handlers.
|
# For each WebSocket route a new handler is created and registered to global handlers.
|
||||||
class WebSocketHandler
|
class WebSocketHandler
|
||||||
include HTTP::Handler
|
include HTTP::Handler
|
||||||
|
|
Loading…
Reference in a new issue