All Versions
24
Latest Version
Avg Release Cycle
49 days
Latest Release
99 days ago

Changelog History
Page 1

  • v0.26.0

    August 05, 2019
  • v0.25.2

    February 08, 2019

    🍱 Crystal 0.27.2 support 🎉

    ➕ Add option to config to parse or not command line parameters #483. Thanks @diegogub 🙏

    👍 Allow to set filename for send_file #512. Thanks @mamantoha 🙏

    send\_file env, "./asset/image.jpeg", filename: "image.jpg"
    

    🍱 Set status_code before response #513. Thanks @mamantohoa 🙏

    🍱 Use Crystal MIME registry. #516 Thanks @Sija 🙏

  • v0.25.1

    November 05, 2018
  • v0.25.0

    November 04, 2018

    👍 Crystal 0.27.0 support.

    [breaking change] Added back env.params.files.

    Here's a fully working sample for reading a image file upload image1 and saving it under public/uploads.

    post "/upload" do |env| file = env.params.files["image1"].tmpfile file\_path = ::File.join [Kemal.config.public\_folder, "uploads/", file.filename]File.open(file\_path, "w") do |f| IO.copy(file, f)end"Upload ok"end
    

    ✅ To test

    curl -F "image1=@/Users/serdar/Downloads/kemal.png" http://localhost:3000/upload

    • 🐎 Cache HTTP routes to increase performance 🚀 #493
  • v0.24.0

    August 14, 2018

    👍 Crystal 0.26.0 support

    [breaking change] Removed env.params.files. You can use Crystal's built-in HTTP::FormData.parse instead

    post "/upload" do |env| HTTP::FormData.parse(env.request) do |upload| filename = file.filename if !filename.is\_a?(String) "No filename included in upload"else file\_path = ::File.join [Kemal.config.public\_folder, "uploads/", filename] File.open(file\_path, "w") do |f| IO.copy(file.tmpfile, f) end"Upload OK"endend
    
    • [breaking change] From now on to access dynamic url params in a WebSocket route you have to use:

      ws "/:id" do |socket, context| id = context.ws_route_lookup.params["id"]end

    [breaking change] Removed _method magic param.

    ➕ Added new exception page #466. Thanks @mamantoha 🙏

    👌 Support custom port binding. Thanks @straight-shoota 🙏

    Kemal.run do |config| server = config.server.not\_nil! server.bind\_tcp "127.0.0.1", 3000, reuse\_port: true server.bind\_tcp "0.0.0.0", 3001, reuse\_port: trueend
    
  • v0.23.0

    June 17, 2018
    • 🍱 Crystal 0.25.0 support 🎉
    • ➕ Add Kemal::Context.get? to safely access context storage 😎
    • 🔒 [Security] Don't serve 404 image dynamically 👍
    • 🍱 Disable X-Powered-By header #449. Thanks @Blacksmoke16 🙏
  • v0.22.0

    December 29, 2017
    • 🍱 Crystal 0.24.1 support 🎉
    • 🍱 Only return string from route.#408 thanks @crisward 🙏
    • 🚀 Don't crash on empty path when compiled in --release. #407 thanks @crisward 🙏
    • 📇 Rename Kemal::CommonLogHandler to Kemal::LogHandler and Kemal::CommonExceptionHandler to Kemal::ExceptionHandler.
    • 👍 Allow videos to be opened with correct mime type. #406 thanks @crisward 🙏
    • ➕ Add webm mime type.#413 thanks @reindeer-cafe 🙏
  • v0.21.0

    September 05, 2017
    • 🍱 Dynamically insert handlers 💪 Fixes #376.
    • ➕ Add context to WebSocket. This allows one to use HTTP::Server::Context in ws declarations 😍 Fixes #349.

      ws "/:room_name" do |socket, env| env.params.url["room_name"]end

    • ➕ Add support for customizing the headers of built-in Kemal::StaticFileHandler 🔨 Useful for supporting CORS for single page applications 👏

      static_headers do |response, filepath, filestat| if filepath =~ /.html$/ response.headers.add("Access-Control-Allow-Origin", "*") end response.headers.add("Content-Size", filestat.size.to_s) endend

    👍 Allow %w in Handler macros #385. Thanks @will 🙏

    🔒 Security: X-Content-Type-Options: nosniff for static files. Fixes #379. Thanks @crisward 🙏

    🐎 Performance: Remove tempfile management to OS. This brings %10 - 15 performance boost to Kemal 🚀

  • v0.20.0

    July 01, 2017
    • 🚀 Crystal 0.23.0 support! As always, Kemal is compatible with the latest major release of Crystal 💎
    • Great news everyone 🎉 All handlers are now completely _ customizable _!. Use the default Kemal handlers or go wild, it's all up to you ⛏

      Don't forget to add Kemal::RouteHandler::INSTANCE or your routes won't work!Kemal.config.handlers = [Kemal::InitHandler.new, YourHandler.new, Kemal::RouteHandler::INSTANCE]

    You can also insert a handler into a specific position.

    # This adds MyCustomHandler instance to 1 position. Be aware that the index starts from 0.add\_handler MyCustomHandler.new, 1
    
    • ⚡️ Updated Kilt to v0.4.0.
    • 🐎 Make Route a Struct. This improves the performance of route declarations.
  • v0.19.0

    May 09, 2017
    • 🛠 Return no body for head route fixes #323. (thanks @crisward)
    • ⚡️ Update radix to 0.3.8. (thanks @waghanza)
    • User defined context store types. (thanks @neovitange)
    class User
       property name
    end
    
    add_context_storage_type(User)
    
    • Prevent `send_file returning filesize. (thanks @crisward)
    • Dont call setup in config#add_filter_handler fixes #338.