hanami-controller/CHANGELOG.md

553 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Hanami::Controller
Complete, fast and testable actions for Rack
## v2.0.0.rc1 - 2022-11-08
### Changed
- [Tim Riley] Simplify assignment of response format: `response.format = :json` (was `response.format = format(:json)`)
## v2.0.0.beta4 - 2022-10-24
### Added
- [Tim Riley] Add `Response#flash`, and delgate to request object for both `Response#session` and `Response#flash`, ensuring the same objects are used when accessed via either request or response (#399)
### Fixed
- [Benjamin Klotz] When a params validation schema is provided (in a `params do` block), only return the validated params from `request.params` (#375)
- [Sean Collins] Handle dry-schema's messages hash now being frozen by default (#391)
### Changed
- [Tim Riley] When `Action.accept` is declared (or `Action::Config.accepted_formats` configured), return a 406 error if an `Accept` request header is present but is not acceptable. In the absence of an `Accept` header, return a 415 error if a `Content-Type` header is present but not acceptable. If neither header is provided, accept the request. (#396)
- [Tim Riley] Add `Action.handle_exception` class method as a shortcut for `Hanami::Action::Config#handle_exception` (#394)
- [Tim Riley] Significantly reduce memory usage by leveraging recent dry-configurable changes, and relocating `accepted_formats`, `before_callbacks`, `after_callbacks` inheritable attributes to `config` (#392)
- [Tim Riley] Make params validation schemas (defined in `params do` block) inheritable to subclasses (#394)
- [Benhamin Klotz, Tim Riley] Raise `Hanami::Action::MissingSessionError` with a friendly message if `Request#session`, `Request#flash`, `Response#session` or `Response#flash` are called for an action that does not already include `Hanami::Action:Session` mixin (#379 via #395)
## v2.0.0.beta1 - 2022-07-20
### Fixed
- [Benjamin Klotz] Using `Hanami::Action.params` without having `hanami-validations` installed now returns a user-friendly error
- [Narinda Reeders] Ensure HEAD responses to send empty body, but preserve headers
- [Narinda Reeders] Ensure HEAD redirect responses to return redirect headers
- [Andrew Croome] Do not automatically render halted requests
## v2.0.0.alpha8 - 2022-02-19
### Changed
- [Tim Riley] Removed automatic integration of `Hanami::Action` subclasses with their surrounding Hanami application. Action base classes within Hanami apps should inherit from `Hanami::Application::Action` instead.
## v2.0.0.alpha6 - 2022-02-10
### Added
- [Luca Guidi] Official support for Ruby: MRI 3.1
### Changed
- [Luca Guidi] Drop support for Ruby: MRI 2.6, and 2.7.
- [Sean Collins] Align with Rack list of HTTP supported status. Added: `103`, `306`, `421`, `425`, `451`, and `509`. Removed: `418`, `420`, `444`, `449`, `450`, `451`, `499`, `598`, `599`.
## v2.0.0.alpha5 - 2022-01-12
### Added
- [Philip Arndt] Added "rss" ("application/rss+xml") to list of supported MIME types
## v2.0.0.alpha4 - 2021-12-07
### Added
- [Luca Guidi] Manage Content Security Policy (CSP) defaults and new API via `Hanami::Action::ApplicationConfiguration#content_security_policy`
- [Tim Riley & Marc Busqué] Provide access to routes inside all application actions via `Hanami::Action::ApplicationAction#routes`
## v2.0.0.alpha3 - 2021-11-09
### Added
- [Luca Guidi] Automatically include session behavior in `Hanami::Action` when sessions are enabled via Hanami application config
- [Sean Collins] Pass exposures from action to view
### Changed
- [Tim Riley] (Internal) Updated settings to use updated `setting` API in dry-configurable 0.13.0
- [Sean Collins] Move automatic view rendering from `handle` to `finish`
## v2.0.0.alpha2 - 2021-05-04
### Added
- [Luca Guidi] Official support for Ruby: MRI 3.0
- [Tim Riley] Introduced `Hanami::Action::ApplicationAction`
- [Tim Riley] Introduced `Hanami::Action::Configuration`
- [Tim Riley] Introduced `Hanami::Action::ApplicationConfiguration`
- [Tim Riley] Auto-inject a paired view into any `Hanami::Action::ApplicationAction` instance
- [Tim Riley] Auto-render `Hanami::Action::ApplicationAction` subclasses that don't implement `#handle`
- [Tim Riley] Enable CSRF protection automatically when HTTP sessions are enabled
### Fixed
- [Luca Guidi] Ensure `Hanami::Action::Response#renderable?` to return `false` when body is set
- [Andrew Croome] Ensure `Hanami::Action.accept` to use Rack `CONTENT_TYPE` for the _before callback_ check
### Changed
- [Luca Guidi] Drop support for Ruby: MRI 2.5.
- [Tim Riley] Removed `Hanami::Action.handle_exception` in favor of `Hanami::Action.config.handle_exception`
- [Tim Riley] Rewritten `Hanami::Action::Flash`, based on Roda's `FlashHash`
## v2.0.0.alpha1 - 2019-01-30
### Added
- [Luca Guidi] `Hanami::Action::Request#session` to access the HTTP session as it was originally sent
- [Luca Guidi] `Hanami::Action::Request#cookies` to access the HTTP cookies as they were originally sent
- [Luca Guidi & Tim Riley] Allow to build a deep inheritance chain for actions
### Changed
- [Luca Guidi] Drop support for Ruby: MRI 2.3, and 2.4.
- [Luca Guidi] `Hanami::Action` is a superclass
- [Luca Guidi] `Hanami::Action#initialize` requires a `configuration:` keyword argument
- [Luca Guidi] `Hanami::Action#initialize` returns a frozen action instance
- [Tim Riley] `Hanami::Action` subclasses must implement `#handle` instead of `#call`
- [Luca Guidi] `Hanami::Action#handle` accepts `Hanami::Action::Request` and `Hanami::Action::Response`
- [Luca Guidi] `Hanami::Action#handle` returns `Hanami::Action::Response`
- [Luca Guidi] Removed `Hanami::Controller.configure`, `.configuration`, `.duplicate`, and `.load!`
- [Luca Guidi] Removed `Hanami::Action.use` to mount Rack middleware at the action level
- [Luca Guidi] `Hanami::Controller::Configuration` changed syntax from DSL style to setters (eg. `Hanami::Controller::Configuration.new { |c| c.default_request_format = :html }`)
- [Luca Guidi] `Hanami::Controller::Configuration#initialize` returns a frozen configuration instance
- [Luca Guidi] Removed `Hanami::Controller::Configuration#prepare`
- [Luca Guidi] Removed `Hanami::Action.configuration`
- [Luca Guidi] Removed `Hanami::Action.configuration.handle_exceptions`
- [Luca Guidi] Removed `Hanami::Action.configuration.default_request_format` in favor of `#default_request_format`
- [Luca Guidi] Removed `Hanami::Action.configuration.default_charset` in favor of `#default_charset`
- [Luca Guidi] Removed `Hanami::Action.configuration.format` to register a MIME Type for a single action. Please use the configuration.
- [Luca Guidi] Removed `Hanami::Action.expose` in favor of `Hanami::Action::Response#[]=` and `#[]`
- [Luca Guidi] Removed `Hanami::Action#status=` in favor of `Hanami::Action::Response#status=`
- [Luca Guidi] Removed `Hanami::Action#body=` in favor of `Hanami::Action::Response#body=`
- [Luca Guidi] Removed `Hanami::Action#headers` in favor of `Hanami::Action::Response#headers`
- [Luca Guidi] Removed `Hanami::Action#accept?` in favor of `Hanami::Action::Request#accept?`
- [Luca Guidi] Removed `Hanami::Action#format` in favor of `Hanami::Action::Response#format`
- [Luca Guidi] Introduced `Hanami::Action#format` as factory to assign response format: `res.format = format(:json)` or `res.format = format("application/json")`
- [Luca Guidi] Removed `Hanami::Action#format=` in favor of `Hanami::Action::Response#format=`
- [Gustavo Caso] `Hanami::Action.accept` now looks at request `Content-Type` header to accept/deny a request
- [Luca Guidi] Removed `Hanami::Action#request_id` in favor of `Hanami::Action::Request#id`
- [Gustavo Caso] Removed `Hanami::Action#parsed_request_body` in favor of `Hanami::Action::Request#parsed_body`
- [Luca Guidi] Removed `Hanami::Action#head?` in favor of `Hanami::Action::Request#head?`
- [Luca Guidi] Removed `Hanami::Action#status` in favor of `Hanami::Action::Response#status=` and `#body=`
- [Luca Guidi] Removed `Hanami::Action#session` in favor of `Hanami::Action::Response#session`
- [Luca Guidi] Removed `Hanami::Action#cookies` in favor of `Hanami::Action::Response#cookies`
- [Luca Guidi] Removed `Hanami::Action#flash` in favor of `Hanami::Action::Response#flash`
- [Luca Guidi] Removed `Hanami::Action#redirect_to` in favor of `Hanami::Action::Response#redirect_to`
- [Luca Guidi] Removed `Hanami::Action#cache_control`, `#expires`, and `#fresh` in favor of `Hanami::Action::Response#cache_control`, `#expires`, and `#fresh`, respectively
- [Luca Guidi] Removed `Hanami::Action#send_file` and `#unsafe_send_file` in favor of `Hanami::Action::Response#send_file` and `#unsafe_send_file`, respectively
- [Luca Guidi] Removed `Hanami::Action#errors`
- [Gustavo Caso] Removed body cleanup for `HEAD` requests
- [Luca Guidi] `Hanami::Action` callback hooks now accept `Hanami::Action::Request` and `Hanami::Action::Response` arguments
- [Luca Guidi] When an exception is raised, it won't be caught, unless it's handled
- [Luca Guidi] `Hanami::Action` exception handlers now accept `Hanami::Action::Request`, `Hanami::Action::Response`, and exception arguments
## v1.3.3 - 2020-01-14
### Added
- [Luca Guidi] Official support for Ruby: MRI 2.7
- [Luca Guidi] Support `rack` 2.1
- [Luca Guidi] Support for both `hanami-validations` 1 and 2
## v1.3.2 - 2019-06-28
### Fixed
- [Ian Ker-Seymer] Ensure `Etag` to work when `If-Modified-Since` is sent from browser and upstream proxy sets `Last-Modified` automatically.
## v1.3.1 - 2019-01-18
### Added
- [Luca Guidi] Official support for Ruby: MRI 2.6
- [Luca Guidi] Support `bundler` 2.0+
## v1.3.0 - 2018-10-24
### Added
- [Gustavo Caso] Swappable JSON backed for `Hanami::Action::Flash` based on `Hanami::Utils::Json`
## v1.3.0.beta1 - 2018-08-08
### Added
- [Luca Guidi] Official support for JRuby 9.2.0.0
### Fixed
- [Yuji Ueki] Ensure that if `If-None-Match` or `If-Modified-Since` response HTTP headers are missing, `Etag` or `Last-Modified` headers will be in response HTTP headers.
- [Gustavo Caso] Don't show flash message for the request after a HTTP redirect.
- [Gustavo Caso] Ensure `Hanami::Action::Flash#each`, `#map`, and `#empty?` to not reference stale flash data.
### Deprecated
- [Gustavo Caso] Deprecate `Hanami::Action#parsed_request_body`
## v1.2.0 - 2018-04-11
## v1.2.0.rc2 - 2018-04-06
### Added
- [Gustavo Caso] Introduce `Hanami::Action::Flash#each` and `#map`
## v1.2.0.rc1 - 2018-03-30
## v1.2.0.beta2 - 2018-03-23
## v1.2.0.beta1 - 2018-02-28
### Added
- [Luca Guidi] Official support for Ruby: MRI 2.5
- [Sergey Fedorov] Introduce `Hanami::Action.content_type` to accept/reject requests according to their `Content-Type` header.
### Fixed
- [wheresmyjetpack] Raise meaningful exception when trying to access `session` or `flash` and `Hanami::Action::Session` wasn't included.
## v1.1.1 - 2017-11-22
### Fixed
- [Luca Guidi] Ensure `Hanami::Action#send_file` and `#unsafe_send_file` to run `after` action callbacks
- [Luca Guidi] Ensure Rack env to have the `REQUEST_METHOD` key set to `GET` during actions unit tests
## v1.1.0 - 2017-10-25
### Added
- [Luca Guidi] Introduce `Hanami::Action::CookieJar#each` to iterate through action's `cookies`
## v1.1.0.rc1 - 2017-10-16
## v1.1.0.beta3 - 2017-10-04
## v1.1.0.beta2 - 2017-10-03
### Added
- [Luca Guidi] Introduce `Hanami::Action::Params::Errors#add` to add errors not generated by params validations
## v1.1.0.beta1 - 2017-08-11
## v1.0.1 - 2017-07-10
### Fixed
- [Marcello Rocha] Ensure validation params to be symbolized in all the environments
- [Marcello Rocha] Fix regression (`1.0.0`) about MIME type priority, during the evaluation of a weighted `Accept` HTTP header
## v1.0.0 - 2017-04-06
## v1.0.0.rc1 - 2017-03-31
## v1.0.0.beta3 - 2017-03-17
### Changed
- [Luca Guidi] `Action#flash` is now public API
## v1.0.0.beta2 - 2017-03-02
### Added
- [Marcello Rocha] Add `Action#unsafe_send_file` to send files outside of the public directory of a project
### Fixed
- [Anton Davydov] Ensure HTTP Cache to not crash when `HTTP_IF_MODIFIED_SINCE` and `HTTP_IF_NONE_MATCH` have blank values
- [Luca Guidi] Keep flash values after a redirect
- [Craig M. Wellington & Luca Guidi] Ensure to return 404 when `Action#send_file` cannot find a file with a globbed route
- [Luca Guidi] Don't mutate Rack env when sending files
## v1.0.0.beta1 - 2017-02-14
### Added
- [Luca Guidi] Official support for Ruby: MRI 2.4
### Fixed
- [Marcello Rocha & Luca Guidi] Avoid MIME type conflicts for `Action#format` detection
- [Matias H. Leidemer & Luca Guidi] Ensure `Flash` to return only fresh data
- [Luca Guidi] Ensure `session` keys to be accessed as symbols in action unit tests
### Changed
- [Anton Davydov & Luca Guidi] Make it work only with Rack 2.0
## v0.8.1 - 2016-12-19
### Fixed
- [Thorbjørn Hermansen] Don't pollute Rack env's `rack.exception` key if an exception is handled
- [Luca Guidi] Add `flash` to the default exposures
## v0.8.0 - 2016-11-15
### Added
- [Marion Duprey] Allow `BaseParams#get` to read (nested) arrays
### Fixed
- [Russell Cloak] Respect custom formats when referenced by HTTP `Accept`
- [Kyle Chong] Don't symbolize raw params
### Changed
- [Luca Guidi] Let `BaseParams#get` to accept a list of keys (symbols) instead of string with dot notation (`params.get(:customer, :address, :city)` instead of `params.get('customer.address.city')`)
## v0.7.1 - 2016-10-06
### Added
- [Kyle Chong] Introduced `parsed_request_body` for action
- [Luca Guidi] Introduced `Hanami::Action::BaseParams#each`
### Fixed
- [Ayleen McCann] Use default content type when `HTTP_ACCEPT` is `*/*`
- [Kyle Chong] Don't stringify uploaded files
- [Kyle Chong] Don't stringify params values when not necessary
### Changed
- [akhramov & Luca Guidi] Raise `Hanami::Controller::IllegalExposureError` when try to expose reserved words: `params`, and `flash`.
## v0.7.0 - 2016-07-22
### Added
- [Luca Guidi] Introduced `Hanami::Action::Params#error_messages` which returns a flat collection of full error messages
### Fixed
- [Luca Guidi] Params are deeply symbolized
- [Artem Nistratov] Send only changed cookies in HTTP response
### Changed
- [Luca Guidi] Drop support for Ruby 2.0 and 2.1. Official support for JRuby 9.0.5.0+.
- [Luca Guidi] Param validations now require you to add `hanami-validations` in `Gemfile`.
- [Luca Guidi] Removed "_indifferent access_" for params. Since now on, only symbols are allowed.
- [Luca Guidi] Params are immutable
- [Luca Guidi] Params validations syntax has changed
- [Luca Guidi] `Hanami::Action::Params#errors` now returns a Hash. Keys are symbols representing invalid params, while values are arrays of strings with a message of the failure.
- [Vasilis Spilka] Made `Hanami::Action::Session#errors` public
## v0.6.1 - 2016-02-05
### Changed
- [Anatolii Didukh] Optimise memory usage by freezing MIME types constant
## v0.6.0 - 2016-01-22
### Changed
- [Luca Guidi] Renamed the project
## v0.5.1 - 2016-01-19
### Fixed
- [Alfonso Uceda] Ensure `rack.session` cookie to not be sent twice when both `Lotus::Action::Cookies` and `Rack::Session::Cookie` are used together
## v0.5.0 - 2016-01-12
### Added
- [Luca Guidi] Reference a raised exception in Rack env's `rack.exception`. Compatibility with exception reporting SaaS.
### Fixed
- [Cainã Costa] Ensure Rack environment to be always available for sessions unit tests
- [Luca Guidi] Ensure superclass exceptions to not shadow subclasses during exception handling (eg. `CustomError` handler will take precedence over `StandardError`)
### Changed
- [Luca Guidi] Removed `Lotus::Controller::Configuration#default_format`
- [Cainã Costa] Made `Lotus::Action#session` a public method for improved unit testing
- [Karim Tarek] Introduced `Lotus::Controller::Error` and let all the framework exceptions to inherit from it.
## v0.4.6 - 2015-12-04
### Added
- [Luca Guidi] Allow to force custom headers for responses that according to RFC shouldn't include them (eg 204). Override `#keep_response_header?(header)` in action
## v0.4.5 - 2015-09-30
### Added
- [Theo Felippe] Added configuration entries: `#default_request_format` and `default_response_format`.
- [Wellington Santos] Error handling to take account of inherited exceptions.
### Changed
- [Theo Felippe] Deprecated `#default_format` in favor of: `#default_request_format`.
## v0.4.4 - 2015-06-23
### Added
- [Luca Guidi] Security protection against Cross Site Request Forgery (CSRF).
### Fixed
- [Matthew Bellantoni] Ensure nested params to be correctly coerced to Hash.
## v0.4.3 - 2015-05-22
### Added
- [Alfonso Uceda Pompa & Luca Guidi] Introduced `Lotus::Action#send_file`
- [Alfonso Uceda Pompa] Set automatically `Expires` option for cookies when it's missing but `Max-Age` is present. Compatibility with old browsers.
## v0.4.2 - 2015-05-15
### Fixed
- [Luca Guidi] Ensure `Lotus::Action::Params#to_h` to return `::Hash` at the top level
## v0.4.1 - 2015-05-15
### Fixed
- [Luca Guidi] Ensure proper automatic `Content-Type` working well with Internet Explorer.
- [Luca Guidi] Ensure `Lotus::Action#redirect_to` to return `::String` for Rack servers compatibility.
### Changed
- [Alfonso Uceda Pompa] Prevent `Content-Type` and `Content-Lenght` to be sent when status code requires no body (eg. `204`).
This is for compatibility with `Rack::Lint`, not with RFC 2016.
- [Luca Guidi] Ensure `Lotus::Action::Params#to_h` to return `::Hash`
## v0.4.0 - 2015-03-23
### Added
- [Erol Fornoles] `Action.use` now accepts a block
- [Alfonso Uceda Pompa] Introduced `Lotus::Controller::Configuration#cookies` as default cookie options.
- [Alfonso Uceda Pompa] Introduced `Lotus::Controller::Configuration#default_headers` as default HTTP headers to return in all the responses.
- [Luca Guidi] Introduced `Lotus::Action::Params#get` as a safe API to access nested params.
### Changed
- [Alfonso Uceda Pompa] `redirect_to` now is a flow control method: it terminates the execution of an action, including the callbacks.
## v0.3.2 - 2015-01-30
### Added
- [Alfonso Uceda Pompa] Callbacks: introduced `append_before` (alias of `before`), `append_after` (alias of `after`), `prepend_before` and `prepend_after`.
- [Alfonso Uceda Pompa] Introduced `Lotus::Action::Params#raw` which returns unfiltered data as it comes from an HTTP request.
- [Alfonso Uceda Pompa] `Lotus::Action::Rack.use` now fully supports Rack middleware, by mounting an internal `Rack::Builder` instance.
- [Simone Carletti] `Lotus::Action::Throwable#halt` now accepts an optional message. If missing it falls back to the corresponding HTTP status message.
- [Steve Hodgkiss] Nested params validation
### Fixed
- [Luca Guidi] Ensure HEAD requests will return empty body
- [Stefano Verna] Ensure HTTP status codes with empty body won't send body and non-entity headers.
- [Luca Guidi] Only dump exceptions in `rack.errors` if handling is turned off, or the raised exception is not managed.
- [Luca Guidi] Ensure params will return coerced values
## v0.3.1 - 2015-01-08
### Added
- [Lasse Skindstad Ebert] Introduced `Action#request` which returns an instance a `Rack::Request` compliant object: `Lotus::Action::Request`.
### Fixed
- [Steve Hodgkiss] Ensure params to return coerced values
## v0.3.0 - 2014-12-23
### Added
- [Luca Guidi] Introduced `Action#request_id` as unique identifier for an incoming HTTP request
- [Luca Guidi] Introduced `Lotus::Controller.load!` as loading framework entry point
- [Kir Shatrov] Allow to define a default charset (`default_charset` configuration)
- [Kir Shatrov] Automatic content type with charset (eg `Content-Type: text/html; charset=utf-8`)
- [Michał Krzyżanowski] Allow to specify custom exception handlers: procs or methods (`exception_handler` configuration)
- [Karl Freeman & Lucas Souza] Introduced HTTP caching (`Cache-Control`, `Last-Modified`, ETAG, Conditional GET, expires)
- [Satoshi Amemiya] Introduced `Action::Params#to_h` and `#to_hash`
- [Luca Guidi] Added `#params` and `#errors` as default exposures
- [Luca Guidi] Introduced complete params validations
- [Luca Guidi & Matthew Bellantoni] Allow to whitelist params
- [Luca Guidi & Matthew Bellantoni] Allow to define custom classes for params via `Action.params`
- [Krzysztof Zalewski] Introduced `Action#format` as query method to introspect the requested mime type
- [Luca Guidi] Official support for Ruby 2.2
### Changed
- [Trung Lê] Renamed `Configuration#modules` to `#prepare`
- [Luca Guidi] Update HTTP status codes to IETF RFC 7231
- [Luca Guidi] When `Lotus::Controller` is included, don't inject code
- [Luca Guidi] Removed `Controller.action` as a DSL to define actions
- [Krzysztof Zalewski] Removed `Action#content_type` in favor of `#format=` which accepts a symbol (eg. `:json`)
- [Fuad Saud] Reduce method visibility where possible (Ruby `private` and `protected`)
### Fixed
- [Luca Guidi] Don't let exposures definition to override existing methods
## v0.2.0 - 2014-06-23
### Added
- [Luca Guidi] Introduced `Controller.configure` and `Controller.duplicate`
- [Luca Guidi] Introduced `Action.use`, that let to use a Rack middleware as a before callback
[Luca Guidi] Allow to define a default mime type when the request is `Accept: */*` (`default_format` configuration)
[Luca Guidi] Allow to register custom mime types and associate them to a symbol (`format` configuration)
- [Luca Guidi] Introduced `Configuration#handle_exceptions` to associate exceptions to HTTP statuses
- [Damir Zekic] Allow developers to toggle exception handling (`handle_exceptions` configuration)
- [Luca Guidi] Introduced `Controller::Configuration`
- [Luca Guidi] Official support for Ruby 2.1
### Changed
- [Luca Guidi] `Lotus::Action::Params` doesn't inherit from `Lotus::Utils::Hash` anymore
- [Luca Guidi] `Lotus::Action::CookieJar` doesn't inherit from `Lotus::Utils::Hash` anymore
- [Luca Guidi] Make HTTP status messages compliant with IANA and Rack
- [Damir Zekic] Moved `#throw` override logic into `#halt`, which keeps the same semantic
### Fixed
- [Krzysztof Zalewski] Reference exception in `rack.errors`
## v0.1.0 - 2014-02-23
### Added
- [Luca Guidi] Introduced `Action.accept` to whitelist accepted mime types
- [Luca Guidi] Introduced `Action#accept?` as a query method for the current request
- [Luca Guidi] Allow to whitelist handled exceptions and associate them to an HTTP status
- [Luca Guidi] Automatic `Content-Type`
- [Luca Guidi] Use `throw` as a control flow which understands HTTP status
- [Luca Guidi] Introduced opt-in support for HTTP/Rack cookies
- [Luca Guidi] Introduced opt-in support for HTTP/Rack sessions
- [Luca Guidi] Introduced HTTP redirect API
- [Luca Guidi] Introduced callbacks for actions: before and after
- [Luca Guidi] Introduced exceptions handling with HTTP statuses
- [Luca Guidi] Introduced exposures
- [Luca Guidi] Introduced basic actions compatible with Rack
- [Luca Guidi] Official support for Ruby 2.0