- Expose
new_sslfeature forrustlssupport fromtiny-http. - Switch to
sha1-smolfor a smaller footprint, more stable hash library. - Remove dependency on
num_cpususingstd::thread::available_parallelisminstead.
Reverts Added a number of default features as it breaks any downstreams
who were specifying default-features = false.
- Added
rustlssupport (viatiny-http), if you're currently using thesslfeature you can switch from OpenSSL to Rustls by instead enabling therustlsfeature 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,postandsessionare 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 /?foowould returnNonefromget_param, instead ofSome(""). - Updated
tiny-httpto 0.12.0, further reducing the dependency tree by breaking our hard requirement ontime-rs. This version oftiny-httpalso enables Unix socket listeners, which will be exposed in a future release of Rouille.
- Replaced our use of the
brotli2crate with the alternative pure Rust implementationbrotli. This removes Rouille's vulnerability to RUSTSEC-2021-0131, which existed due tobrotli-sysbundling a vulnerable version of the underlying C library. - Unpinned
time-rsand 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/JSONwould be incorrectly identified as non-text). - Pinned
time-rsto 0.3.2 to avoid a semver-breaking change in their MSRV. - Bumped
chronoto 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_prefixin place of.starts_withwhere 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
timedependency to0.3andpostgresto0.19to fix a compile failure due to a yanked version ofsha1. - Fixed numerous typos in the crate documentation.
- Removed unused dependency
termand updatedrand,multipart,deflateandtimeto latest supported versions.
- Add
ResponseBody::from_reader_and_sizefor constructing aResponseBodyfrom aReaderand an already known size such thatContent-Lengthmay 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-httpto 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: chunkedon 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
urlversion increased to 2.0 - Don't use deprecated
Error::description()
- Bump minimum supported Rust version to 1.20.0.
- Expose that the
Requestbody (accessible withrequest.data()) has aSendbound.
- Replace
flate2withdeflate - 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
multipartto 0.13. Theinput::multipart::get_multipart_inputfunction returns types reexported frommultipartwhich have small but breaking API changes. - Update
Serverwith an option to use a thread pool to process requests
input::cookieschanged to return an iterator that yields(&str, &str).
- The
content_encodingmodule now supports brotli. - Added an
accept!macro similar to amatchexpression that chooses a block depending on the value of theAcceptheader of the request. - Added
proxy::full_proxy. It behaves the same asproxybut 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_headerandwith_unique_headerfor easier response manipulation. - Added
Request::headers()that provides an iterator to the list of headers. - Added
input::priority_header_preferredandinput::parse_priority_headerto easily parse request headers such asAcceptorAccept-Language. - MIME types that contain "font" are now also compressed by the
content_encodingmodule. - Changed
text/xmltoapplication/xmlin the MIME types auto-determination.
- Added a
Serverstruct as an alternative tostart_serverfor manual control over the behavior. - Added a
content_encoding::applyfunction that appliesContent-Encodingto 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::Errortrait.
- Added support for websockets with the
websocketmodule. - 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
headersfield ofResponseare nowVec<(Cow<'static, str>, Cow<'static, str>)>instead ofVec<(String, String)>. - Removed
Response::redirectand replaced it withredirect_301,redirect_302, etc. - Added
Response::with_etag()to add an ETag header to a response. - Added an
upgradefield toResponse, necessary for websockets. - Fixed being able to set the value of the Content-Length and Transfer-Encoding headers.
plain_text_bodynow has a limit of 1 MB of data before returning an error.- Added
plain_text_body_with_limitwhich does the same asplain_text_bodybut with a customizable limit. - Implemented the
std::error::Errortrait on all error types. - Added
Response::into_reader_and_size()to retrieve aReadobject from aResponseBody. - Fixed issue with static files not being found on Windows because of
/and\mismatch.
- Added the
proxymodule with basic reverse proxy.
- Added the
rouille::input::plain_text_bodyfunction.
- 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::sessionmodule and replaced it with thesessionmodule. 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.RouteErrorhas been removed. You are now encouraged to return aResponseeverywhere instead of aResult<Response, RouteError>.- The
try_or_400!,find_route!andassert_or_4OO!macros and thematch_assetsfunction 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().