From 37d40f4fbe9738aa5a2e5bd27fc676f810b282aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20Kadir=20Ak=C4=B1n?= Date: Wed, 13 Jan 2016 22:22:34 +0200 Subject: [PATCH] Implement SSL handling, move option parser to another file to maintain easier --- src/kemal.cr | 16 +++------------- src/kemal/cli.cr | 35 +++++++++++++++++++++++++++++++++++ src/kemal/middleware/ssl.cr | 18 ++++++++++++++++++ 3 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 src/kemal/cli.cr create mode 100644 src/kemal/middleware/ssl.cr diff --git a/src/kemal.cr b/src/kemal.cr index 9d2638e..9353e7d 100644 --- a/src/kemal.cr +++ b/src/kemal.cr @@ -1,21 +1,11 @@ -require "option_parser" require "./kemal/*" require "./kemal/middleware/*" at_exit do - OptionParser.parse! do |opts| - opts.on("-p ", "--port ", "port") do |opt_port| - Kemal.config.port = opt_port.to_i - end - opts.on("-e ", "--environment ", "environment") do |env| - Kemal.config.env = env - end - opts.on("-b", "--bind", "host binding") do |host_binding| - Kemal.config.host_binding = host_binding - end - end + Kemal::CLI.new config = Kemal.config + logger = Kemal::Logger.new config.add_handler logger config.add_handler Kemal::StaticFileHandler.new(config.public_folder) @@ -37,7 +27,7 @@ at_exit do image = env.params["image"] file_path = File.expand_path("libs/kemal/images/#{image}", Dir.current) env.add_header "Content-Type", "application/octet-stream" - File.read(file_path) + File.read(file_path) if File.exists? file_path end server.listen diff --git a/src/kemal/cli.cr b/src/kemal/cli.cr new file mode 100644 index 0000000..0a710af --- /dev/null +++ b/src/kemal/cli.cr @@ -0,0 +1,35 @@ +require "option_parser" + +module Kemal + class CLI + def initialize + ssl = nil + OptionParser.parse! do |opts| + opts.on("-b HOST", "--bind HOST", "HTTP host to bind (defaults to 0.0.0.0)") do |host_binding| + Kemal.config.host_binding = host_binding + end + opts.on("-p PORT", "--port PORT", "HTTP port to listen connections (defaults to 3000)") do |opt_port| + Kemal.config.port = opt_port.to_i + end + opts.on("-e ENV", "--environment ENV", "Running environment [development, production] (defaults to development). Set `production` to boost performance") do |env| + Kemal.config.env = env + end + opts.on("-s", "--ssl", "Enables SSL") do + ssl = Kemal::Middleware::SSL.new + end + opts.on("--ssl-key-file FILE", "SSL key file") do |key_file| + ssl.not_nil!.set_key_file key_file + end + opts.on("--ssl-cert-file FILE", "SSL certificate file") do |cert_file| + ssl.not_nil!.set_cert_file cert_file + end + opts.on("-h", "--help", "Shows this help") do + puts opts + exit 0 + end + end + + Kemal.config.ssl = ssl.not_nil!.context if ssl + end + end +end diff --git a/src/kemal/middleware/ssl.cr b/src/kemal/middleware/ssl.cr new file mode 100644 index 0000000..4c18a21 --- /dev/null +++ b/src/kemal/middleware/ssl.cr @@ -0,0 +1,18 @@ +module Kemal::Middleware + class SSL + + getter context + + def initialize + @context = OpenSSL::SSL::Context.new + end + + def set_key_file(key_file) + @context.private_key = key_file + end + + def set_cert_file(cert_file) + @context.certificate_chain = cert_file + end + end +end