- Expose
new_ssl
feature forrustls
support fromtiny-http
. - Switch to
sha1-smol
for a smaller footprint, more stable hash library. - Remove dependency on
num_cpus
usingstd::thread::available_parallelism
instead.
Reverts Added a number of default features as it breaks any downstreams
who were specifying default-features = false
.
- Added
rustls
support (viatiny-http
), if you're currently using thessl
feature you can switch from OpenSSL to Rustls by instead enabling therustls
feature in yourCargo.toml
. - Added a number of default features to allow users to reduce
their dependency graph where they don't need all the functionality Rouille provides.
logging
,assets
,post
andsession
are now optional, but enabled by default for backwards compatibility. - Correctly support 'flag' type query parameters where the parameter has no
associated value. Previously a query like
GET /?foo
would returnNone
fromget_param
, instead ofSome("")
. - Updated
tiny-http
to 0.12.0, further reducing the dependency tree by breaking our hard requirement ontime-rs
. This version oftiny-http
also enables Unix socket listeners, which will be exposed in a future release of Rouille.
- Replaced our use of the
brotli2
crate with the alternative pure Rust implementationbrotli
. This removes Rouille's vulnerability to RUSTSEC-2021-0131, which existed due tobrotli-sys
bundling a vulnerable version of the underlying C library. - Unpinned
time-rs
and as a result increased our MSRV to 1.51, we don't have a formal MSRV policy and the ecosystem is making it more and more difficult to support compiler versions more than about 6 months old.
- Resolved a number of cleanup & refactoring TODOs
- Correctly identify non-lowercase content types as text (e.g.
text/JSON
would be incorrectly identified as non-text). - Pinned
time-rs
to 0.3.2 to avoid a semver-breaking change in their MSRV. - Bumped
chrono
to 0.4.19 and disabled their default feature set to avoid warnings aboutRUSTSEC-2020-0071
(Rouille was never vulnerable, but used a vulnerable version ofchrono
).
- Use
.strip_prefix
in place of.starts_with
where appropriate, this stops a Clippy lint from leaking out of ourrouter!
macro and into downstream code.
- Bumped minimum supported Rust version to 1.48
- Added module-level documentation for
rouille::content_encoding
- Updated
time
dependency to0.3
andpostgres
to0.19
to fix a compile failure due to a yanked version ofsha1
. - Fixed numerous typos in the crate documentation.
- Removed unused dependency
term
and updatedrand
,multipart
,deflate
andtime
to latest supported versions.
- Add
ResponseBody::from_reader_and_size
for constructing aResponseBody
from aReader
and an already known size such thatContent-Length
may be set on the response.
- Replace all uses of deprecated
try!
with?
to suppress warnings that can leak out of macro contexts.
- Add
Server::poll_timeout()
for polling more efficiently. - Add
Server::stoppable()
for running a single, cancellable server thread. - Add
Server::join()
for finalising all in-flight requests before shutting down. - Prevent infinite loop on Websocket EOF
- Update
tiny-http
to 0.8.1 containing fixes for:- HTTPS deadlock where one request holds a locked resource while another is attempting HTTPS negotiation
- Fix RUSTSEC-2020-0031
- Don't set
Transfer-Encoding: chunked
on 1xx or 204 responses (which can lead to clients hanging).
- Bump minimum support Rust version to 1.41.1
- Bump minimum supported Rust version to 1.34.2
- embedded, exposed
url
version increased to 2.0 - Don't use deprecated
Error::description()
- Bump minimum supported Rust version to 1.20.0.
- Expose that the
Request
body (accessible withrequest.data()
) has aSend
bound.
- Replace
flate2
withdeflate
- Fixed handling of url-encoded path components in route!() macro. Previously, URL was eagerly decoded and thus would fail to match intended routes if special characters were used (such as ? or /). Now, individual matched components are decoded after matching.
- Added
Response::empty_204
. - Added ssl feature and new_ssl constructor to Server, for https support. The certificate and private key must be supplied by user.
- Dropped the use of rustc-serialize in favor of using serde.
- Updated
multipart
to 0.13. Theinput::multipart::get_multipart_input
function returns types reexported frommultipart
which have small but breaking API changes. - Update
Server
with an option to use a thread pool to process requests
input::cookies
changed to return an iterator that yields(&str, &str)
.
- The
content_encoding
module now supports brotli. - Added an
accept!
macro similar to amatch
expression that chooses a block depending on the value of theAccept
header of the request. - Added
proxy::full_proxy
. It behaves the same asproxy
but returns more status codes and less errors. - Added
Response::from_data
,from_file
,with_content_disposition_attachment
,empty_406
,with_public_cache
,with_private_cache
,with_no_cache
,without_header
,with_additional_header
andwith_unique_header
for easier response manipulation. - Added
Request::headers()
that provides an iterator to the list of headers. - Added
input::priority_header_preferred
andinput::parse_priority_header
to easily parse request headers such asAccept
orAccept-Language
. - MIME types that contain "font" are now also compressed by the
content_encoding
module. - Changed
text/xml
toapplication/xml
in the MIME types auto-determination.
- Added a
Server
struct as an alternative tostart_server
for manual control over the behavior. - Added a
content_encoding::apply
function that appliesContent-Encoding
to a response. - The
try_or_400!
macro now returns a response whose body describes the error in JSON. - The
try_or_400!
macro now requires the error to implement thestd::error::Error
trait.
- Added support for websockets with the
websocket
module. - Added
Request::do_not_track()
to query the DNT header. - Renamed
get_json_input()
tojson_input()
. - Renamed
get_cookies()
tocookies()
. - Renamed
get_basic_http_auth()
tobasic_http_auth()
. - The logs now show the time of the start of the request processing.
Request::header()
now returns aOption<&str>
instead ofOption<String>
.Response::svg()
andResponse::html()
now take aInto<String>
instead of aInto<Vec<u8>>
.- Renamed
Response::error()
andsuccess()
tois_error()
andis_success()
. - The
headers
field ofResponse
are nowVec<(Cow<'static, str>, Cow<'static, str>)>
instead ofVec<(String, String)>
. - Removed
Response::redirect
and replaced it withredirect_301
,redirect_302
, etc. - Added
Response::with_etag()
to add an ETag header to a response. - Added an
upgrade
field toResponse
, necessary for websockets. - Fixed being able to set the value of the Content-Length and Transfer-Encoding headers.
plain_text_body
now has a limit of 1 MB of data before returning an error.- Added
plain_text_body_with_limit
which does the same asplain_text_body
but with a customizable limit. - Implemented the
std::error::Error
trait on all error types. - Added
Response::into_reader_and_size()
to retrieve aRead
object from aResponseBody
. - Fixed issue with static files not being found on Windows because of
/
and\
mismatch.
- Added the
proxy
module with basic reverse proxy.
- Added the
rouille::input::plain_text_body
function.
- Empty Vecs are now allowed for POST input.
- Reworked POST input. You can now use the
post_input!
macro instead of creating a decodable struct. - Removed the
input::session
module and replaced it with thesession
module. Sessions no longer store data in a hashmap, but instead only provide a way to generate a unique ID per client.
- Fixed the
+
character in the query string not being replaced with a space as it should. Request::data()
now returns anOption<impl Read>
instead of aVec<u8>
. Ifdata()
is called twice, the second call will returnNone
.RouteError
has been removed. You are now encouraged to return aResponse
everywhere instead of aResult<Response, RouteError>
.- The
try_or_400!
,find_route!
andassert_or_4OO!
macros and thematch_assets
function have been adjusted for the previous change. - Added a
try_or_404!
macro similar totry_or_400!
. - In the case of a panic, the response with status code 500 that the server answers now contains a small text in its body, indicating the user that an internal server error occured.
- Added
Response::empty_400()
,Response::empty_404()
,Response::success()
andResponse::error()
.