- Enhancements
- Add more entries to .formatter.exs
- Enhancements
- Optimize query decoding
- Provide per parser limit in Plug.Parsers
- Limit query string size and urlencoded POST body to 1MB by default
- Bug fixes
- Also validate headers on
merge_resp_headers/2
- Ensure
Plug.Upload
does not crash on termination
- Also validate headers on
- Bug fixes
- Ensure Plug.Debugger does not fail to handle undefined function errors on nil
- Bug fixes
- Ensure body_params is properly filled during test
This version requires Elixir v1.3 and deprecates unsafe Plug.Crypto APIs.
-
Enhancements
- Log error if Cowboy discards headers due to protocol limits
- Add
Plug.Conn.read_part_headers/2
andPlug.Conn.read_part_body/2
for built-in multipart parsing. This also adds support for multipart requests in tests - Introduce
Plug.HTML.html_escape_to_iodata/1
- Add HSTS "preload" flag to
Plug.SSL
options - Add support for custom content-types in
Plug.Static
- Support range request queries in
Plug.Static
to support resumable downloads and videos - Allow custom key in
Plug.CSRFProtection
- Raise
Plug.AlreadyChunkedError
when setting headers on chunked conn - Perform
Exception.blame/3
and argument listing when possible on Plug.Debugger - Add
:set_file
state in Plug.Conn, used bysend_file/3
-
Bug fixes
- Fix issue with file uploads containing
;
s in filenames - Ensure
plug.init/1
is called inPlug.Router.forward
- Do not send empty iodata chunks
- Do not convert throws and exits into errors in
Plug.Conn.WrapperError
- Increase randomness in
Plug.Upload.path/0
- Fix issue with file uploads containing
- Bug fixes
- Validate cookie headers
- Bug fixes
- Do not convert exits into errors
- Bug fixes
- Support improper lists, bitstrings and structs in safe_binary_to_term
- Bug fixes
- [Plug.Crypto] Provide safer deserialization mechanisms
- [Plug.Static] Properly handle null bytes
-
Enhancements
- [Plug.Conn] Support arbitrary cookie attributes
- [Plug.SSL] Support tuple hosts in Plug.SSL
- [Plug.Static] Add ability to generate etags via a user defined function
-
Bug fixes
- [Plug.ErrorHandler] Do not unwrap errors wrapped in
Plug.Conn.WrapperError
when reraising
- [Plug.ErrorHandler] Do not unwrap errors wrapped in
-
Enhancements
- [Plug.Adapters.Cowboy] Support tuples with other than 2 elements in the adapter options
- [Plug.Adapters.Cowboy] Support controlling how multipart headers are parsed
- [Plug.Conn] Add the
:path_params
field to access path params apart from theparams
field - [Plug.Conn.Status] Allow custom status codes to be configured and dynamically inflect their atom name
- [Plug.Debugger] Support content negotiation and defaults to Markdown when HTML cannot be served
- [Plug.Router] Extend
match/2
macros to accept a plug and options - [Plug.Router] Make path parameters available in
conn.params
- [Plug.Router] Add
:init_opts
option toforward
macro for plug options - [Plug.Router] Add
:assigns
option to router macros to assign values toconn.assigns
-
Bug fixes
- [Plug.Debugger] Do not show query parameters when debugging a page with bad query string
- [Plug.Parsers] Keep
body_params
unfetched if the content-type is allowed to pass through the parser
- Bug fix
- Do not generate AST with line -1 on OTP >= 19
- Enhancements
- Raise proper bad request and timeout exceptions on parse errors
- Support environment hosts on Plug.SSL
- Do not raise when nothing is plugged in a Plug.Builder
-
Enhancements
- Introduce new error page
- Set default max connections to 16k instead of 1k
-
Bug fixes
- Ensure that
Plug.Conn
's public API is consistent about not sending empty chunks
- Ensure that
-
Deprecations
- Use the new
MIME
project instead ofPlug.MIME
- Introduce safer algorithms in
Plug.MessageEncryptor
andPlug.MessageVerifier
. The previous ones will be supported for a year allowing safe migration.
- Use the new
-
Backwards incompatible changes
- Depend on Elixir ~> 1.2.3 or ~> 1.3
-
Bug fixes
- Fix
:only
and:only_matching
which were not bypassing requests unless both were enabled
- Fix
-
Enhancements
- Support reading of
conn.host
inPlug.Test
- Add normalization of
:dhfile
for Cowboy's SSL options - Import error reporting and performance of
Plug.Static
- Support reading of
-
Enhancements
- Add
:only_matching
option toPlug.Static
- Add
-
Bug fixes
- Return 400 from
Plug.Static
on invalid paths - Ensure
Plug.Upload
does not error out on invalid access - Ensure query string errors return 400
- Return 400 from
-
Enhancements
- Raise on cookie overflow
- Log (with :debug level) when session cookie cannot be decoded
-
Bug fixes
- Ensure Plug.Parsers fail with request too large even when read_length > length
-
Enhancements
- Add
:brotli
toPlug.Static
- Add
-
Bug fixes
- Fixed session verification when token may have the
--
separator
- Fixed session verification when token may have the
- Enhancements
- Only log errors if the exception has 5xx status code
- Warn when rendering non 5xx status code in Plug.Debugger
- Use URL safe variant on crypto (old tokens are still valid but new ones will be generated)
- Allow custom content-type when passing a map body in
Plug.Test
-
Enhancements
- Raise if new lines are used in header values
-
Bug fix
- Allow mime type lookup of uppercase extensions
- Do not validate uppercase headers in production to avoid performance hits
- Prevent Plug.Parsers from clobbering existing conn.params when part of it is unfetched
- Bug fix
- Ensure cookie store returns a Session ID so they can be dropped
- Enhancements
- Allow configuring all options supported by the underlying transport (i.e. cowboy)
-
Enhancements
- Allow custom headers in
Plug.Static
- Allow custom headers in
-
Bug fix
- No longer automatically assume "priv" for cert and key files for Cowboy SSL
- Raise if response has been sent more than once in test connection
- Raise when body is nil on
Plug.Conn.resp/3
- Show more info and escape messages in
Plug.Debugger
-
Enhancements
- Support
:rewrite_on
onPlug.SSL
- Add
Plug.Conn.merge_resp_headers/2
- Support
-
Bug fix
- Ensure message encryptor and verifier do not error on bad data
-
Enhancements
- Add
conn.request_path
- Raise if
put_session/3
is invoked when response is sent
- Add
-
Bug fixes
- Fix empty params being encoded into query string as '&'
-
Deprecations
Plug.Conn.full_path/2
is deprecated in favor ofconn.request_path
Plug.Test.put_req_header/3
andPlug.Test.delete_req_header/3
is deprecated in favor of similarly named functions inPlug.Conn
-
Enhancements
- Raise if a header in upcase is given
- Store timestamps in sessions ETS table and document each entry format
- Allow private options when specifying routes in
Plug.Router
- Allow the session to be cleared and ignored when an invalid CSRF token is given
- Allow log level to be configured in
Plug.Logger
- Generate masked CSRF tokens to avoid BREACH attacks
-
Backwards incompatible changes
Plug.Logger
no longer sets the request id. UsePlug.RequestId
instead
-
Enhancements
- Add
Plug.HTML
- Add
-
Bug fixes
- Do not crash on poorly encoded cookies
- Decode parameters before matching on the router
-
Enhancements
- Add
Plug.SSL
with redirection from HTTP and HSTS support - Remove the need for
:encrypt
option fromPlug.Session.COOKIE
. The need for encryption can be fully specified by passing:encrypted_salt
option. This improvement is backwards compatible.
- Add
-
Bug fixes
- Ensure we don't parse body params if they were already parsed
-
Enhancements
- Add
query_params
andbody_params
to keep query and body parameters apart fromparams
- Allow custom encoders when encoding query parameters
- Assert valid utf-8 on url encoded and multipart bodies
- Add
-
Bug fixes
- Use only body parameters when detecting method override
- Add Vary header when serving gzipped content in Plug.Static
-
Deprecations
fetch_params/2
is deprecated in favor offetch_query_params/2
-
Bug fixes
- Ensure test adapter reuses the given connection
-
Deprecations
- The
:headers
option inPlug.Test.conn/4
is deprecated in favor ofput_req_header/3
- The
-
Enhancements
- Add
:log_on_halt
option toPlug.Builder
andPlug.Router
- Use raw files and delayed writes on upload
- Add
-
Bug fixes
- Do not read the whole request body at once
- Improve performance of url encoded params
-
Deprecations
Plug.Builder.compile/1
andPlug.Builder.compile/2
are deprecated in favor of explicitPlug.Builder.compile/3
-
Enhancements
- Allow Plug mimes to be configured via application environment
- Extend JSON parser to be compatible with all json compatible content types. This includes types with suffix
+json
- Add
Plug.Conn.clear_session/1
-
Bug fixes
- Do not require cowboy at compile time
- Also parse request bodies on DELETE requests
-
Enhancements
- Add
Plug.Conn.async_assign/3
andPlug.Conn.await_assign/3
to start and await for assigns asynchronously, mimic'ingTask.async/1
andTask.await/2
behaviour - Add
Plug.Conn.WrapperError
to propagate an error with the connection for better debugging by eitherPlug.Debugger
orPlug.ErrorHandler
- Add
Plug.Conn.update_resp_header/4
to update a response header or set its initial value if not present
- Add
-
Bug fixes
- Skip parsing of files when no filename is sent
- Fix how script_name are accumulated with multiple calls to
Plug.Router.forward/2
-
Backwards incompatible changes
Plug.CSRFProtection
now uses a session to store tokens. Tokens are now generated on demand and can be accessed viaPlug.CSRFProtection.get_csrf_token/0
-
Enhancements
- Add
:only
option toPlug.Static
to avoid all requests triggering file system queries - Add ETag management to
Plug.Static
when requests to not contain a versioned query string - Enforce atom or string keys in
Plug.Conn.put_session/3
and friends and normalize keys to strings
- Add
-
Bug fixes
- Add UTF-8 tag to debugger templates
-
Backwards incompatible changes
Plug.CSRFProtection
now uses a cookie instead of session and expects a"_csrf_token"
parameter instead of"csrf_token"
-
Enhancements
- Add
Plug.Conn.full_path/1
- Add
Plug.CSRFProtection
that adds cross-forgery protection - Add
Plug.ErrorHandler
that allows an error page to be sent on crashes (instead of a blank one) - Support host option in
Plug.Router
- Add
-
Backwards incompatible changes
- Add
Plug.Router.Utils.build_match/1
was renamed tobuild_path_match/1
- Add
-
Bug fixes
- Clean up
{:plug_conn, :sent}
messages from listener inbox and ensure connection works accross processes
- Clean up
-
Deprecations
- Deprecate
recycle/2
in favor ofrecycle_cookies
in Plug.Test
- Deprecate
-
Enhancements
- Use PKCS7 padding in MessageEncryptor (the same as OpenSSL)
- Add support for custom serializers in cookie session store
- Allow customization of key generation in cookie session store
- Automatically import
Plug.Conn
in Plug builder - Render errors from Plug when using Ranch/Cowboy nicely
- Provide
Plug.Crypto.secure_compare/2
for comparing binaries - Add
Plug.Debugger
for helpful pages whenever there is a failure during a request
-
Deprecations
- Deprecate
:accept
in favor of:pass
in Plug.Parsers
- Deprecate
-
Enhancements
- Add
Plug.Conn.Utils.media_type/1
to provide media type parsing with wildcard support - Do not print adapter data by default when inspecting the connection
- Allow plug_status to simplify the definition of plug aware exceptions
- Allow cache headers in
Plug.Static
to be turned off
- Add
-
Bug fix
- Support dots on header parameter parsing
-
Enhancements
- Add a
Plug.Parsers.JSON
that expects a JSON decoder as argument
- Add a
-
Bug fix
- Properly populate
params
field for test connections - Fix
Plug.Logger
not reporting the proper path
- Properly populate
-
Enhancements
- Add
fetch_session/2
,fetch_params/2
andfetch_cookies/2
so they can be pluggable - Raise an error message on invalid router indentifiers
- Add
put_status/2
and support atom status codes - Add
secret_key_base
field to the connection
- Add
-
Backwards incompatible changes
- Add
encryption_salt
andsigning_salt
to the CookieStore and derive actual keys fromsecret_key_base
- Add
-
Enhancements
- Support Elixir 1.0.0-rc1
- Support haltable pipelines with
Plug.Conn.halt/2
- Ensure both Plug.Builder and Plug.Router's
call/2
are overridable
-
Bug fix
- Properly report times in Logger
-
Backwards incompatible changes
- Remove support for Plug wrappers
- Enhancements
- Add
Plug.Logger
- Add
conn.peer
andconn.remote_ip
- Add
Plug.Conn.sendfile/5
- Allow
call/2
fromPlug.Builder
to be overridable
- Add
- Enhancements
- Update to Cowboy v1.0.0
- Update mime types list
- Update to Elixir v0.15.0
- Enhancements
- Update to Elixir v0.14.3
- Cowboy adapter now returns
{:error,:eaddrinuse}
when port is already in use - Add
Plug.Test.recycle/2
that copies relevant data between connections for future requests
-
Enhancements
- Add ability to configure when
Plug.Parsers
raisesUnsupportedMediaTypeError
- Add
Plug.Conn.Query.encode/1
- Add
CookieStore
for session
- Add ability to configure when
-
Bug fixes
- Ensure plug parses content-type with CRLF as LWS
-
Enhancements
- Update to Elixir v0.14.0
- Update Cowboy adapter to v0.10.0
- Add
Plug.Conn.read_body/2
-
Backwards incompatible changes
Plug.Parsers
now expect:length
instead of:limit
and also accept:read_length
and:read_timeout
- Enhancements
- Update to Elixir v0.13.3
- Enhancements
- Update to Elixir v0.13.2
- Enhancements
- Update to Elixir v0.13.1
- Enhancements
- Remove
:mime
dependency in favor ofPlug.MIME
- Improve errors when Cowboy is not available
- First hex package release
- Remove
-
Enhancements
- Support
before_send/1
callbacks - Add
Plug.Static
- Allow iodata as the body
- Do not allow response headers to be set if the response was already sent
- Add
Plug.Conn.private
to be used as storage by libraries/frameworks - Add
get_req_header
andget_resp_header
for fetching request and response headers
- Support
-
Backwards incompatible changes
Plug.Connection
was removed in favor ofPlug.Conn
Plug.Conn
is now a struct- assigns, cookies, params and sessions have been converted to maps
- Definition of the Plug specification