This release introduces the following major features and improvements:
- Support for compilation on Rust's stable release channel.
- A rewritten, fully asynchronous core with support for
async
/await
. - Feature-complete forms support including multipart, collections, ad-hoc validation, and context.
- Sentinels: automatic verification of application state at start-up to prevent runtime errors.
- Graceful shutdown with configurable signaling, grace periods, notification via
Shutdown
. - An entirely new, flexible and robust configuration system based on Figment.
- Typed asynchronous streams and Server-Sent Events with generator syntax.
- Graduation of
json
,msgpack
, anduuid
rocket_contrib
features into core. - An automatically enabled
Shield
: security and privacy headers for all responses. - Type-system enforced incoming data limits to mitigate memory-based DoS attacks.
- Compile-time URI literals via a fully revamped
uri!
macro. - Full support for UTF-8 characters in routes and catchers.
- Precise detection of unmanaged state and missing database, template fairings with sentinels.
- Typed build phases with strict application-level guarantees.
- Ignorable segments: wildcard route matching with no typing restrictions.
- First-class support for
serde
for built-in guards and types. - New application launch attributes:
#[launch]
and#[rocket::main]
. - Default catchers via
#[catch(default)]
, which handle any status code. - Catcher scoping to narrow the scope of a catcher to a URI prefix.
- Built-in libraries and support for asynchronous testing.
- A
TempFile
data and form guard for automatic uploading to a temporary file. - A
Capped<T>
data and form guard which enables detecting truncation due to data limits. - Support for dynamic and static prefixing and suffixing of route URIs in
uri!
. - Support for custom config profiles and automatic typed config extraction.
- Rewritten, zero-copy, RFC compliant URI parsers with support for URI-
Reference
s. - Multi-segment parameters (
<param..>
) which match zero segments. - A
request::local_cache!
macro for request-local storage of non-uniquely typed values. - A
CookieJar
without "one-at-a-time" limitations. - Singleton fairings with replacement and guaranteed uniqueness.
- Data limit declaration in SI units: "2 MiB",
2.mebibytes()
. - Optimistic responding even when data is left unread or limits are exceeded.
- Fully decoded borrowed strings as dynamic parameters, form and data guards.
- Borrowed byte slices as data and form guards.
- Fail-fast behavior for misconfigured secrets, file serving paths.
- Support for generics and custom generic bounds in
#[derive(Responder)]
. - Default ranking colors, which prevent more routing collisions automatically.
- Improved error logging with suggestions when common errors are detected.
- Completely rewritten examples including a new real-time
chat
application. - Automatic support for HTTP/2 including
h2
ALPN.
As a result of support for the stable release channel, the #![feature(..)]
crate attribute is no longer required for Rocket applications. The complete
canonical example with a single hello
route becomes:
#[macro_use] extern crate rocket;
#[get("/<name>/<age>")]
fn hello(name: &str, age: u8) -> String {
format!("Hello, {} year old named {}!", age, name)
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/hello", routes![hello])
}
See a diff
of the changes from v0.4.
- #![feature(proc_macro_hygiene, decl_macro)]
-
#[macro_use] extern crate rocket;
#[get("/<name>/<age>")]
- fn hello(name: String, age: u8) -> String {
+ fn hello(name: &str, age: u8) -> String {
format!("Hello, {} year old named {}!", age, name)
}
- fn main() {
- rocket::ignite().mount("/hello", routes![hello]).launch();
- }
+ #[launch]
+ fn rocket() -> _ {
+ rocket::build().mount("/hello", routes![hello])
+ }
This release includes many breaking changes. The most significant changes are listed below.
These changes are invisible to the compiler and will not yield errors or warnings at compile-time. We strongly advise all application authors to review this list carefully.
- Blocking I/O (long running compute, synchronous
sleep()
,Mutex
,RwLock
, etc.) may prevent the server from making progress and should be avoided, replaced with anasync
variant, or performed in a worker thread. This is a consequence of Rust's cooperativeasync
multitasking. For details, see the new multitasking section of the guide. ROCKET_ENV
is nowROCKET_PROFILE
. A warning is emitted a launch time if the former is set.- The default profile for debug builds is now
debug
, notdev
. - The default profile for release builds is now
release
, notprod
. ROCKET_LOG
is nowROCKET_LOG_LEVEL
. A warning is emitted a launch time if the former is set.- It is a launch-time error if
secrets
is enabled in non-debug
profiles without a configuredsecret_key
. - A misconfigured
template_dir
is reported as an error at launch time. FileServer::new()
fails immediately if the provided directory does not exist.- Catcher collisions result in a launch failure as opposed to a warning.
- Default ranks now range from
-12
to-1
. There is no breaking change if only code generated routes are used. Manually configured routes with negative ranks may collide or be considered in a different order than before. - The order of execution of path and query guards relative to each other is now unspecified.
- URIs beginning with
:
are properly recognized as invalid and rejected. - URI normalization now normalizes the query part as well.
- The
Segments
iterator now returns percent-decoded&str
s. - Forms are now parsed leniently by the
Form
guard. UseStrict
for the previous behavior. - The
Option<T>
form guard defaults toNone
instead of the default value forT
. - When data limits are exceeded, a
413 Payload Too Large
status is returned to the client. - The default catcher now returns JSON when the client indicates preference via the
Accept
header. - Empty boolean form values parse as
true
: the query string?f
is the same as?f=true
. Created<R>
does not automatically send anETag
header ifR: Hash
. UseCreated::tagged_body
instead.FileServer
now forwards when a file is not found instead of failing with404 Not Found
.Shield
is enabled by default. You may need to disable or change policies if your application depends on typically insecure browser features or if you wish to opt-in to different policies than the defaults.CookieJar
get()
s do not return cookies added during request handling. SeeCookieJar
#pending.
Rocket
is now generic over a phase marker:- APIs operate on
Rocket<Build>
,Rocket<Ignite>
,Rocket<Orbit>
, orRocket<P: Phase>
as needed. - The phase marker statically enforces state transitions in
Build
,Ignite
,Orbit
order. rocket::ignite()
is nowrocket::build()
, returns aRocket<Build>
.Rocket::ignite()
transitions to theIgnite
phase. This is run automatically on launch as needed.- Ignition finalizes configuration, runs
ignite
fairings, and verifies sentinels. Rocket::launch()
transitions into theOrbit
phase and starts the server.- Methods like
Request::rocket()
that refer to a live Rocket instance return an&Rocket<Orbit>
.
- APIs operate on
- Fairings have been reorganized and restructured for
async
:- Replaced
attach
fairings withignite
fairings. Unlikeattach
fairings, which ran immediately at the time of attachment,ignite
fairings are run when transitioning into theIgnite
phase. - Replaced
launch
fairings withliftoff
fairings.liftoff
fairings are always run, even in local clients, after the server begins listening and the concrete port is known.
- Replaced
- Introduced a new configuration system based on Figment:
- The concept of "environments" is replaced with "profiles".
ROCKET_ENV
is superseded byROCKET_PROFILE
.ROCKET_LOG
is superseded byROCKET_LOG_LEVEL
.- Profile names can now be arbitrarily chosen. The
dev
,stage
, andprod
profiles carry no special meaning. - The
debug
andrelease
profiles are the default profiles for the debug and release compilation profiles. - A new specially recognized
default
profile specifies defaults for all profiles. - The
global
profile has highest precedence, followed by the selected profile, followed bydefault
. - Added support for limits specified in SI units: "1 MiB".
- Renamed
LoggingLevel
toLogLevel
. - Inlined error variants into the
Error
structure. - Changed the type of
workers
tousize
fromu16
. - Changed accepted values for
keep_alive
: it is disabled with0
, notfalse
oroff
. - Disabled the
secrets
feature (for private cookies) by default. - Removed APIs related to "extras". Typed values can be extracted from the configured
Figment
. - Removed
ConfigBuilder
: all fields ofConfig
are public with constructors for each field type.
- Many functions, traits, and trait bounds have been modified for
async
:FromRequest
,Fairing
,catcher::Handler
,route::Handler
, andFromData
use#[async_trait]
.NamedFile::open
is now anasync
function.- Added
Request::local_cache_async()
for use in async request guards. - Unsized
Response
bodies must beAsyncRead
instead ofRead
. - Automatically sized
Response
bodies must beAsyncSeek
instead ofSeek
. - The
local
module is split into two:rocket::local::asynchronous
androcket::local::blocking
.
- Functionality and features requiring Rust nightly were removed:
- Removed the
Try
implementation onOutcome
which allowed using?
withOutcome
s. The recommended replacement is therocket::outcome::try_outcome!
macro or the various combinator functions onOutcome
. Result<T, E>
implementsResponder
only when bothT
andE
implementResponder
. The newDebug
wrapping responder replacesResult<T: Responder, E: Debug>
.- APIs which used the
!
type to now usestd::convert::Infallible
.
- Removed the
Rocket::register()
now takes a base path to scope catchers under as its first argument.ErrorKind::Collision
has been renamed toErrorKind::Collisions
.
- In
#[route(GET, path = "...")]
,path
is nowuri
:#[route(GET, uri = "...")]
. - Multi-segment paths (
/<p..>
) now match zero or more segments. - A route URI like (
/<a>/<p..>
) now collides with (/<a>
), requires arank
to resolve. - All catcher related types and traits moved to
rocket::catcher
. - All route related types and traits moved to
rocket::route
. - URI formatting types and traits moved to
rocket::http::uri::fmt
. T
no longer converts toOption<T>
orResult<T, _>
foruri!
query parameters.- For optional query parameters,
uri!
requires using a wrapped value or_
. &RawStr
no longer implementsFromParam
: use&str
instead.- Percent-decoding is performed before calling
FromParam
implementations. RawStr::url_decode()
andRawStr::url_decode_lossy()
allocate as necessary, returnCow
.RawStr::from_str()
was replaced withRawStr::new()
.Origin::segments()
was replaced withOrigin.path().segments()
.Origin::path()
andOrigin::query()
return&RawStr
instead of&str
.- The type of
Route::name
is nowOption<Cow<'static, str>>
. Route::set_uri
was replaced withRoute::map_base()
.Route::uri()
returns a newRouteUri
type.Route::base
was removed in favor ofRoute.uri().base()
.
- Removed
FromDataSimple
. UseFromData
andrequest::local_cache!
. Data
now has a lifetime:Data<'r>
.Data::open()
indelibly requires a data limit.- All
DataStream
APIs require limits and returnCapped<T>
types. - Form types and traits were moved from
rocket::request
torocket::form
. - Removed
FromQuery
. Dynamic query parameters (#[get("/?<param>")]
) useFromForm
instead. - Replaced
FromFormValue
withFromFormField
. AllT: FromFormField
implementFromForm
. - Form field values are percent-decoded before calling
FromFormField
implementations. - Renamed the
#[form(field = ...)]
attribute to#[field(name = ...)]
.
- Renamed
Cookies
toCookieJar
. Its methods take&self
. - Renamed
Flash.name
toFlash.kind
,Flash.msg
toFlash.message
. - Replaced
Request::get_param()
withRequest::param()
. - Replaced
Request::get_segments()
toRequest::segments()
. - Replaced
Request::get_query_value()
withRequest::query_value()
. - Replaced
Segments::into_path_buf()
withSegments::to_path_buf()
. - Replaced
Segments
andQuerySegments
withSegments<Path>
andSegments<Query>
. Flash
constructors to takeInto<String>
instead ofAsRef<str>
.- The
State<'_, T>
request guard is now&State<T>
. - Removed a lifetime from
FromRequest
:FromRequest<'r>
. - Removed a lifetime from
FlashMessage
:FlashMessage<'_>
. - Removed all
State
reexports exceptrocket::State
.
- Moved
NamedFile
torocket::fs::NamedFile
- Replaced
Content
withcontent::Custom
. Response::body
andResponse::body_mut
are now infallible methods.- Renamed
ResponseBuilder
toBuilder
. - Removed direct
Response
body reading methods. Use methods onr.body_mut()
instead. - Removed inaccurate "chunked body" types and variants.
- Removed
Responder
impl
forResponse
. Prefer custom responders with#[derive(Responder)]
. - Removed the unused reason phrase from
Status
.
- The
rocket_contrib
crate has been deprecated and should no longer be used. - Several features previously in
rocket_contrib
were merged intorocket
itself:json
,msgpack
, anduuid
are now features ofrocket
.- Moved
rocket_contrib::json
torocket::serde::json
. - Moved
rocket_contrib::msgpack
torocket::serde::msgpack
. - Moved
rocket_contrib::uuid
torocket::serde::uuid
. - Moved
rocket_contrib::helmet
torocket::shield
.Shield
is enabled by default. - Moved
rocket_contrib::serve
torocket::fs
,StaticFiles
torocket::fs::FileServer
. - Removed the now unnecessary
Uuid
andJsonValue
wrapper types. - Removed headers in
Shield
that are no longer respected by browsers.
- The remaining features from
rocket_contrib
are now provided by separate crates:- Replaced
rocket_contrib::templates
withrocket_dyn_templates
. - Replaced
rocket_contrib::databases
withrocket_sync_db_pools
. - These crates are versioned and released independently of
rocket
. rocket_contrib::databases::DbError
is nowrocket_sync_db_pools::Error
.- Removed
redis
,mongodb
, andmysql
integrations which have upstreamasync
drivers. - The
#[database]
attribute generates anasync run()
method instead ofDeref
implementations.
- Replaced
In addition to new features and major improvements, Rocket saw the following improvements:
- Added support for raw identifiers in the
FromForm
derive,#[route]
macros, anduri!
. - Added support for uncased derived form fields:
#[field(name = uncased(...))]
. - Added support for default form field values:
#[field(default = expr())]
. - Added support for multiple
#[field]
attributes on struct fields. - Added support for base16-encoded (a.k.a. hex-encoded) secret keys.
- Added
Config::ident
for configuring or removing the globalServer
header. - Added
Rocket::figment()
andRocket::catchers()
. - Added
LocalRequest::json()
andLocalResponse::json()
. - Added
LocalRequest::msgpack()
andLocalResponse::msgpack()
. - Added support for
use m::route; routes![route]
instead of needingroutes![m::route]
. - Added support for hierarchical data limits: a limit of
a/b/c
falls back toa/b
thena
. - Added
LocalRequest::inner_mut()
.LocalRequest
implementsDerefMut
toRequest
. - Added support for ECDSA and EdDSA TLS keys.
- Added associated constants in
Config
for all config parameter names. - Added
ErrorKind::Config
to represent errors in configuration at runtime. - Added
rocket::fairing::Result
type alias, returned byFairing::on_ignite()
. - All guard failures are logged at runtime.
Rocket::mount()
now accepts a base value of any type that implementsTryInto<Origin<'_>>
.- The default error catcher's HTML has been compacted.
- The default error catcher returns JSON if requested by the client.
- Panics in routes or catchers are caught and forwarded to
500
error catcher. - A detailed warning is emitted if a route or catcher panics.
- Emoji characters are no longer output on Windows.
- Fixed
Error
to not panic if a panic is already in progress. - Introduced
Reference
andAsterisk
URI types. - Added support to
UriDisplayQuery
for C-like enums. - The
UriDisplayQuery
derive now recognizes the#[field]
attribute for field renaming. Client
method builders acceptTryInto<Origin>
allowing auri!()
to be used directly.Redirect
now accepts aTryFrom<Reference>
, allowing fragment parts.
- Added support for HTTP/2.
- Added AVIF (
image/avif
) as a known media type. - Added
EventStream
(text/event-stream
) as a known media type. - Added a
const
constructor forMediaType
. - Added aliases
Text
,Bytes
for thePlain
,Binary
media types, respectively. - Introduced
RawStrBuf
, an ownedRawStr
. - Added many new "pattern" methods to
RawStr
. - Added
RawStr::percent_encode()
andRawStr::strip()
. - Added support for unencoded query characters in URIs that are frequently sent by browsers.
- Added support for all UTF-8 characters in route paths.
- Added support for percent-encoded
:
in socket or IP address values inFromFormValue
. - Added
Request::rocket()
to access the activeRocket
instance. Request::uri()
now returns an&Origin<'r>
instead of&Origin<'_>
.Request::accept()
,Request::content_type()
reflect changes toAccept
,Content-Type
.Json<T>
,MsgPack<T>
acceptT: Deserialize
, not onlyT: DeserializeOwned
.- Diesel SQLite connections in
rocket_sync_db_pools
use better defaults. - The default number of workers for synchronous database pools is now
workers * 4
.
- Added
Template::try_custom()
for fallible template engine customization. - Manually registered templates can now be rendered with
Template::render()
. - Added support for the
X-DNS-Prefetch-Control
header toShield
. - Added support for manually-set
expires
values for private cookies. - Added support for type generics and custom generic bounds to
#[derive(Responder)]
. - The
Server
header is only set if one isn't already set. - Accurate
Content-Length
headers are sent even for partially readBody
s.
- Implemented
Clone
forState
. - Implemented
Copy
andClone
forfairing::Info
. - Implemented
Debug
forRocket
andClient
. - Implemented
Default
forStatus
(returnsStatus::Ok
). - Implemented
PartialEq
,Eq
,Hash
,PartialOrd
, andOrd
forStatus
. - Implemented
Eq
,Hash
, andPartialEq<&str>
forOrigin
. - Implemented
PartialEq<Cow<'_, RawStr>>>
forRawStr
. - Implemented
std::error::Error
forError
. - Implemented
Deref
andDerefMut
forLocalRequest
(toRequest
). - Implemented
DerefMut
forForm
,LenientForm
. - Implemented
From<T>
forJson<T>
,MsgPack<T>
. - Implemented
TryFrom<String>
andTryFrom<&str>
forOrigin
. - Implemented
TryFrom<Uri>
for each of the specific URI variants. - Implemented
FromRequest
for&Config
. - Implemented
FromRequest
forIpAddr
. - Implemented
FromParam
forPathBuf
- Implemented
FromParam
,FromData
, andFromForm
for&str
. - Implemented
FromForm
forJson<T>
,MsgPack<T>
. - Implemented
FromFormField
forCow
andCapped<Cow>>
- Implemented
Responder
fortokio::fs::File
. - Implemented
Responder
for(ContentType, R) where R: Responder
. - Implemented
Responder
for(Status, R) where R: Responder
which overridesR
's status. - Implemented
Responder
forstd::io::Error
(behaves asDebug<std::io::Error>
). - Implemented
Responder
forEither<T, E>
, equivalently toResult<T, E>
. - Implemented
Serialize
forFlash
. - Implemented
Serialize
,Deserialize
,UriDisplay
andFromUriParam
foruuid::Uuid
- Implemented
Serialize
,Deserialize
forRawStr
. - Implemented
Serialize
,Deserialize
for all URI types.
- The
serde
dependency was introduced (1.0
). - The
futures
dependency was introduced (0.3
). - The
state
dependency was updated toTODO: unreleased
. - The
time
dependency was updated to0.2
. - The
binascii
dependency was introduced (0.1
). - The
ref-cast
dependency was introduced (1.0
). - The
atomic
dependency was introduced (0.5
). - The
parking_lot
dependency was introduced (0.11
). - The
ubtye
dependency was introduced (0.10
). - The
figment
dependency was introduced (0.10
). - The
rand
dependency was introduced (0.8
). - The
either
dependency was introduced (1.0
). - The
pin-project-lite
dependency was introduced (0.2
). - The
indexmap
dependency was introduced (1.0
). - The
tempfile
dependency was introduced (3.0
). - The
async-trait
dependency was introduced (0.1
). - The
async-stream
dependency was introduced (0.3
). - The
multer
dependency was introduced (2.0
). - The
tokio
dependency was introduced (1.6.1
). - The
tokio-util
dependency was introduced (0.6
). - The
tokio-stream
dependency was introduced (0.1.6
). - The
bytes
dependency was introduced (1.0
). - The
rmp-serde
dependency was updated to0.15
. - The
uuid
dependency was updated to0.8
. - The
tera
dependency was updated to1.10
. - The
handlebars
dependency was updated to3.0
. - The
normpath
dependency was introduced (0.3
). - The
postgres
dependency was updated to0.19
. - The
rusqlite
dependency was updated to0.25
. - The
r2d2_sqlite
dependency was updated to0.18
. - The
memcache
dependency was updated to0.15
.
- Rocket now uses the 2018 edition of Rust.
- Added visible
use
statements to examples in the guide. - Split examples into a separate workspace from the non-example crates.
- Updated documentation for all changes.
- Fixed many typos, errors, and broken links throughout documentation and examples.
- Improved the general robustness of macros, and the quality and frequency of error messages.
- Benchmarks now use
criterion
and datasets extracted from real-world projects. - Fixed the SPDX license expressions in
Cargo.toml
files. - Added support to
test.sh
for a+
flag (e.g.+stable
) to pass tocargo
. - Added support to
test.sh
for extra flags to be passed on tocargo
. - Migrated CI to Github Actions.
- [
3276b8
] Removed used ofunsafe
inOrigin::parse_owned()
, fixing a soundness issue.
- [
#1548
,93e88b0
] Fixed an issue that prevented compilation under Windows Subsystem for Linux v1. - Updated
Outcome
Try
implementation to v2 in latest nightly. - Minimum required
rustc
is1.54.0-nightly (2021-05-18)
.
- Updated
base64
dependency to0.13
.
- [
86bd7c
] Added default and configurable read/write timeouts:read_timeout
andwrite_timeout
. - [
c24a96
] Added thesse
feature, which enables flushing by returningio::ErrorKind::WouldBlock
.
- Fixed broken doc links in
contrib
. - Fixed database library versions in
contrib
docs.
- Updated source code for Rust 2018.
- UI tests now use
trybuild
instead ofcompiletest-rs
.
- [#1312,
89150f
] Fixed a low-severity, minimal impact soundness issue inLocalRequest::clone()
. - [#1263,
376f74
] Fixed a cookie serialization issue that led to incorrect cookie deserialization in certain cases. - Removed dependency on
ring
for private cookies and thus Rocket, by default. - Added
Origin::map_path()
for manipulatingOrigin
paths. - Added
handler::Outcome::from_or_forward()
. - Added
Options::NormalizeDirs
option toStaticFiles
. - Improved accessibility of default error HTML.
- Fixed various typos.
- Removed use of unsupported
cfg(debug_assertions)
inCargo.toml
, allowing for builds on latest nightlies.
- Fixed various broken links.
- Added a new
Debug
500
Responder
thatDebug
-prints its contents on response. - Specialization on
Result
was deprecated.Debug
can be used in place of non-Responder
errors. - Fixed an issue that resulted in cookies not being set on error responses.
- Various
Debug
implementations on Rocket types now respect formatting options. - Added
Responder
s for various HTTP status codes:NoContent
,Unauthorized
,Forbidden
, andConflict
. FromParam
is implemented forNonZero
core types.
- Docs for Rocket-generated macros are now hidden.
- Generated code now works even when prelude imports like
Some
,Ok
, andErr
are shadowed. - Error messages referring to responder types in routes now point to the type correctly.
- All code examples in the guide are now tested and guaranteed to compile.
- All macros are documented in the
core
crate;rocket_codegen
makes no appearances.
- CI was moved from Travis to Azure Pipelines; Windows support is tested.
- Rocket's chat moved to Matrix and Freenode.
- Replaced use of
FnBox
withBox<dyn FnOnce>
. - Removed the stable feature gates
try_from
andtranspose_result
. - Derive macros are reexported alongside their respective traits.
- Minimum required
rustc
is1.35.0-nightly (2019-04-05)
.
JsonValue
now implementsFromIterator
.non_snake_case
errors are silenced in generated code.- Minimum required
rustc
is1.33.0-nightly (2019-01-03)
.
- Allow setting custom ranks on
StaticFiles
viaStaticFiles::rank()
. MsgPack
correctly sets a MessagePack Content-Type on responses.
- Fixed typos across rustdocs and guide.
- Documented library versions in contrib database documentation.
- Updated internal dependencies to their latest versions.
- Rocket's default
Server
HTTP header no longer overrides a user-set header. - Fixed encoding and decoding of certain URI characters.
- Compiler diagnostic information is more reliably produced.
- Database pool types now implement
DerefMut
. - Added support for memcache connection pools.
- Stopped depending on default features from core.
- Fixed many typos across the rustdocs and guide.
- Added guide documentation on mounting more than one route at once.
- Testing no longer requires "bootstrapping".
- Removed deprecated
isatty
dependency in favor ofatty
.
This release includes the following new features:
- Introduced Typed URIs.
- Introduced ORM agnostic database support.
- Introduced Request-Local State.
- Introduced mountable static-file serving via
StaticFiles
. - Introduced automatic live template reloading.
- Introduced custom stateful handlers via
Handler
. - Introduced transforming data guards via
FromData::transform()
. - Introduced revamped query string handling.
- Introduced the
SpaceHelmet
security and privacy headers fairing. - Private cookies are gated behind a
private-cookies
default feature. - Added derive for
FromFormValue
. - Added derive for
Responder
. - Added
Template::custom()
for customizing templating engines including registering filters and helpers. - Cookies are automatically tracked and propagated by
Client
. - Private cookies can be added to local requests with
LocalRequest::private_cookie()
. - Release builds default to the
production
environment. - Keep-alive can be configured via the
keep_alive
configuration parameter. - Allow CLI colors and emoji to be disabled with
ROCKET_CLI_COLORS=off
. - Route
format
accepts shorthands such asjson
andhtml
. - Implemented
Responder
forStatus
. - Added
Response::cookies()
for retrieving response cookies. - All logging is disabled when
log
is set tooff
. - Added
Metadata
guard for retrieving templating information. - The
Uri
type parses URIs according to RFC 7230 into one ofOrigin
,Absolute
, orAuthority
. - Added
Outcome::and_then()
,Outcome::failure_then()
, andOutcome::forward_then()
. - Implemented
Responder
for&[u8]
. - Any
T: Into<Vec<Route>>
can bemount()
ed. - Default rankings range from -6 to -1, differentiating on static query strings.
- Added
Request::get_query_value()
for retrieving a query value by key. - Applications can launch without a working directory.
- Added
State::from()
for constructingState
values.
The rocket_codegen
crate has been entirely rewritten using to-be-stable
procedural macro APIs. We expect nightly breakages to drop dramatically, likely
to zero, as a result. The new prelude import for Rocket applications is:
- #![feature(plugin)]
- #![plugin(rocket_codegen)]
+ #![feature(proc_macro_hygiene, decl_macro)]
- extern crate rocket;
+ #[macro_use] extern crate rocket;
The rocket_codegen
crate should not be a direct dependency. Remove it
from your Cargo.toml
:
[dependencies]
- rocket = "0.3"
+ rocket = "0.4"
- rocket_codegen = "0.3"
This release includes many breaking changes. These changes are listed below along with a short note about how to handle the breaking change in existing applications when applicable.
-
Route and catcher attributes respect function privacy.
To mount a route or register a catcher outside of the module it is declared, ensure that the handler function is marked
pub
orcrate
. -
Query handling syntax has been completely revamped.
A query parameter of
<param>
is now<param..>
. Consider whether your application benefits from the revamped query string handling. -
The
#[error]
attribute anderrors!
macro were removed.Use
#[catch]
andcatchers!
instead. -
Rocket::catch()
was renamed toRocket::register()
.Change calls of the form
.catch(errors![..])
to.register(catchers![..])
. -
The
#[catch]
attribute only accepts functions with 0 or 1 argument.Ensure the argument to the catcher, if any, is of type
&Request
. -
json!
returns aJsonValue
, no longer needs wrapping.Change instances of
Json(json!(..))
tojson!
and change the corresponding type toJsonValue
. -
All environments default to port 8000.
Manually configure a port of
80
for thestage
andproduction
environments for the previous behavior. -
Release builds default to the production environment.
Manually set the environment to
debug
withROCKET_ENV=debug
for the previous behavior. -
Form
andLenientForm
lost a lifetime parameter,get()
method.Change a type of
Form<'a, T<'a>>
toForm<T>
orForm<T<'a>>
.Form<T>
andLenientForm<T>
now implementDeref<Target = T>
, allowing for calls to.get()
to be removed. -
ring
was updated to 0.13.Ensure all transitive dependencies to
ring
refer to version0.13
. -
Uri
was largely replaced byOrigin
.In general, replace the type
Uri
withOrigin
. Thebase
anduri
fields ofRoute
are now of typeOrigin
. The&Uri
guard is now&Origin
.Request::uri()
now returns anOrigin
. -
All items in
rocket_contrib
are namespaced behind modules.Json
is nowjson::Json
MsgPack
is nowmsgpack::MsgPack
MsgPackError
is nowmsgpack::Error
Template
is nowtemplates::Template
UUID
is nowuuid::Uuid
Value
is replaced byjson::JsonValue
-
TLS certificates require the
subjectAltName
extension.Ensure that your TLS certificates contain the
subjectAltName
extension with a value set to your domain. -
Route paths, mount points, and
LocalRequest
URIs are strictly checked.Ensure your mount points are absolute paths with no parameters, ensure your route paths are absolute paths with proper parameter syntax, and ensure that paths passed to
LocalRequest
are valid. -
Template::show()
takes an&Rocket
, doesn't accept aroot
.Use
client.rocket()
to get a reference to an instance ofRocket
when testing. UseTemplate::render()
in routes. -
Request::remote()
returns the actual remote IP, doesn't rewrite.Use
Request::real_ip()
orRequest::client_ip()
to retrieve the IP address from the "X-Real-IP" header if it is present. -
Bind
variant was added toLaunchErrorKind
.Ensure matches on
LaunchErrorKind
include or ignore theBind
variant. -
Cookies are automatically tracked and propagated by
Client
.For the previous behavior, construct a
Client
withClient::untracked()
. -
UUID
was renamed toUuid
.Use
Uuid
instead ofUUID
. -
LocalRequest::cloned_dispatch()
was removed.Chain calls to
.clone().dispatch()
for the previous behavior. -
Redirect
constructors take a generic type ofT: TryInto<Uri<'static>>
.A call to a
Redirect
constructor with a non-'static
&str
of the formRedirect::to(string)
should becomeRedirect::to(string.to_string())
, heap-allocating the string before being passed to the constructor. -
The
FromData
impl forForm
andLenientForm
now return an error of typeFormDataError
.On non-I/O errors, the form string is stored in the variant as an
&'f str
. -
Missing
variant was added toConfigError
.Ensure matches on
ConfigError
include or ignore theMissing
variant. -
The
FromData
impl forJson
now returns an error of typeJsonError
.The previous
SerdeError
is now the.1
member of theJsonError
enum
. Match and destruct the variant for the previous behavior. -
FromData
is now emulated byFromDataSimple
.Change implementations, not uses, of
FromData
toFromDataSimple
. Consider whether your implementation could benefit from transformations. -
FormItems
iterates over values of typeFormItem
.Map using
.map(|item| item.key_value())
for the previous behavior. -
LaunchErrorKind::Collision
contains a vector of the colliding routes.Destruct using
LaunchErrorKind::Collision(..)
to ignore the vector. -
Request::get_param()
andRequest::get_segments()
are indexed by segment, not dynamic parameter.Modify the
n
argument in calls to these functions appropriately. -
Method-based route attributes no longer accept a keyed
path
parameter.Change an attribute of the form
#[get(path = "..")]
to#[get("..")]
. -
Json
andMsgPack
data guards no longer reject requests with an unexpected Content-TypeTo approximate the previous behavior, add a
format = "json"
route parameter when usingJson
orformat = "msgpack"
when usingMsgPack
. -
Implemented
Responder
forStatus
. RemovedFailure
,status::NoContent
, andstatus::Reset
responders.Replace uses of
Failure(status)
withstatus
directly. Replacestatus::NoContent
withStatus::NoContent
. Replacestatus::Reset
withStatus::ResetContent
. -
Config::root()
returns anOption<&Path>
instead of an&Path
.For the previous behavior, use
config.root().unwrap()
. -
Status::new()
is no longerconst
.Construct a
Status
directly. -
Config
constructors return aConfig
instead of aResult<Config>
. -
ConfigError::BadCWD
,Config.config_path
were removed. -
Json
no longer has a default value for its type parameter. -
Using
data
on a non-payload method route is a warning instead of error. -
The
raw_form_string
method ofForm
andLenientForm
was removed. -
Various impossible
Error
associated types are now set to!
. -
All
AdHoc
constructors require a name as the first parameter. -
The top-level
Error
type was removed.
In addition to new features, Rocket saw the following improvements:
- Log messages now refer to routes by name.
- Collision errors on launch name the colliding routes.
- Launch fairing failures refer to the failing fairing by name.
- The default
403
catcher now references authorization, not authentication. - Private cookies are set to
HttpOnly
and are given an expiration date of 1 week by default. - A Tera templates example was added.
- All macros, derives, and attributes are individually documented in
rocket_codegen
. - Invalid client requests receive a response of
400
instead of500
. - Response bodies are reliably stripped on
HEAD
requests. - Added a default catcher for
504: Gateway Timeout
. - Configuration information is logged in all environments.
- Use of
unsafe
was reduced from 9 to 2 in core library. FormItems
now parses empty keys and values as well as keys without values.- Added
Config::active()
as a shorthand forConfig::new(Environment::active()?)
. - Address/port binding errors at launch are detected and explicitly emitted.
Flash
cookies are cleared only after they are inspected.Sync
bound onAdHoc::on_attach()
,AdHoc::on_launch()
was removed.AdHoc::on_attach()
,AdHoc::on_launch()
accept anFnOnce
.- Added
Config::root_relative()
for retrieving paths relative to the configuration file. - Added
Config::tls_enabled()
for determining whether TLS is actively enabled. - ASCII color codes are not emitted on versions of Windows that do not support them.
- Added FLAC (
audio/flac
), Icon (image/x-icon
), WEBA (audio/webm
), TIFF (image/tiff
), AAC (audio/aac
), Calendar (text/calendar
), MPEG (video/mpeg
), TAR (application/x-tar
), GZIP (application/gzip
), MOV (video/quicktime
), MP4 (video/mp4
), ZIP (application/zip
) as known media types. - Added
.weba
(WEBA
),.ogv
(OGG
),.mp4
(MP4
),.mpeg4
(MP4
),.aac
(AAC
),.ics
(Calendar
),.bin
(Binary
),.mpg
(MPEG
),.mpeg
(MPEG
),.tar
(TAR
),.gz
(GZIP
),.tif
(TIFF
),.tiff
(TIFF
),.mov
(MOV
) as known extensions. - Interaction between route attributes and declarative macros has been improved.
- Generated code now logs through logging infrastructures as opposed to using
println!
. - Routing has been optimized by caching routing metadata.
Form
andLenientForm
can be publicly constructed.- Console coloring uses default terminal colors instead of white.
- Console coloring is consistent across all messages.
i128
andu128
now implementFromParam
,FromFormValue
.- The
base64
dependency was updated to0.10
. - The
log
dependency was updated to0.4
. - The
handlebars
dependency was updated to1.0
. - The
tera
dependency was updated to0.11
. - The
uuid
dependency was updated to0.7
. - The
rustls
dependency was updated to0.14
. - The
cookie
dependency was updated to0.11
.
- All documentation is versioned.
- Previous, current, and development versions of all documentation are hosted.
- The repository was reorganized with top-level directories of
core
andcontrib
. - The
http
module was split into its ownrocket_http
crate. This is an internal change only. - All uses of
unsafe
are documented with informal proofs of correctness.
- Codegen was updated for
2018-08-23
nightly. - Minimum required
rustc
is1.30.0-nightly 2018-08-23
.
- Force close only the read end of connections. This allows responses to be sent even when the client transmits more data than expected.
- Add details on retrieving configuration extras to guide.
- The
#[catch]
decorator andcatchers!
macro were introduced, replacing#[error]
anderrors!
. - The
#[error]
decorator anderrors!
macro were deprecated. - Codegen was updated for
2018-07-15
nightly. - Minimum required
rustc
is1.29.0-nightly 2018-07-15
.
- Codegen was updated for
2018-06-22
nightly. - Minimum required
rustc
is1.28.0-nightly 2018-06-22
.
- Codegen was updated for
2018-06-12
nightly. - Minimum required
rustc
is1.28.0-nightly 2018-06-12
.
- Codegen was updated for
2018-05-30
nightly. - Minimum required
rustc
is1.28.0-nightly 2018-05-30
.
- Core was updated for
2018-05-18
nightly.
- Fixed injection of dependencies for codegen compile-fail tests.
- Fixed parsing of nested TOML structures in config environment variables.
- Codegen was updated for
2018-05-03
nightly. - Minimum required
rustc
is1.27.0-nightly 2018-05-04
.
- Contrib was updated for
2018-05-03
nightly.
- Fixed database pool type in state guide.
- Core was updated for
2018-04-26
nightly. - Minimum required
rustc
is1.27.0-nightly 2018-04-26
. - Managed state retrieval cost was reduced to an unsynchronized
HashMap
lookup.
- Codegen was updated for
2018-04-26
nightly. - Minimum required
rustc
is1.27.0-nightly 2018-04-26
.
- A 512-byte buffer is preallocated when deserializing JSON, improving performance.
- Fixed various typos in rustdocs and guide.
- Codegen was updated for
2018-04-06
nightly. - Minimum required
rustc
is1.27.0-nightly 2018-04-06
.
- Fixed a bug where incoming request URIs would match routes with the same path prefix and suffix and ignore the rest.
- Added known media types for WASM, WEBM, OGG, and WAV.
- Fixed fragment URI parsing.
- Codegen was updated for
2018-04-03
nightly. - Minimum required
rustc
is1.27.0-nightly 2018-04-03
.
- JSON data is read eagerly, improving deserialization performance.
- Database example and docs were updated for Diesel 1.1.
- Removed outdated README performance section.
- Fixed various typos in rustdocs and guide.
- Removed gates for stabilized features:
iterator_for_each
,i128_type
,conservative_impl_trait
,never_type
. - Travis now tests in both debug and release mode.
Rocket.state()
method was added to retrieve managed state fromRocket
instances.- Nested calls to
Rocket.attach()
are now handled correctly. - JSON API (
application/vnd.api+json
) is now a known media type. - Uncached markers for
ContentType
andAccept
headers are properly preserved onRequest.clone()
. - Minimum required
rustc
is1.25.0-nightly 2018-01-12
.
- Codegen was updated for
2017-12-22
nightly. - Minimum required
rustc
is1.24.0-nightly 2017-12-22
.
- Fixed typo in state guide:
simplesimply. - Database example and docs were updated for Diesel 1.0.
- Shell scripts now use
git grep
instead ofegrep
for faster searching.
- Codegen was updated for
2017-12-17
nightly. - Minimum required
rustc
is1.24.0-nightly 2017-12-17
.
NamedFile
'sResponder
implementation now uses a sized body when the file's length is known.#[repr(C)]
is used onstr
wrappers to guarantee correct structure layout across platforms.- A
status::BadRequest
Responder
was added.
- Codegen was updated for
2017-12-13
nightly. - Minimum required
rustc
is1.24.0-nightly 2017-12-13
.
- The rustdoc
html_root_url
now points to the correct address. - Fixed typo in fairings guide:
eventevents. - Fixed typo in
Outcome
docs:usersUsers.
Config
'sDebug
implementation now respects formatting options.Cow<str>
now implementsFromParam
.Vec<u8>
now implementsResponder
.- Added a
Binary
media type forapplication/octet-stream
. - Empty fairing collections are no longer logged.
- Emojis are no longer emitted to non-terminals.
- Minimum required
rustc
is1.22.0-nightly 2017-09-13
.
- Improved "missing argument in handler" compile-time error message.
- Codegen was updated for
2017-09-25
nightly. - Minimum required
rustc
is1.22.0-nightly 2017-09-25
.
- Fixed typos in site overview:
bybe,Reponder
Responder
. - Markdown indenting was adjusted for CommonMark.
- Shell scripts handle paths with spaces.
- Added conversion methods from and to
Box<UncasedStr>
.
- Lints were removed due to compiler instability. Lints will likely return as
a separate
rocket_lints
crate.
- Added support for ASCII colors on modern Windows consoles.
- Form field renames can now include any valid characters, not just idents.
- Ignored named route parameters are now allowed (
_ident
). - Fixed issue where certain paths would cause a lint
assert!
to fail (#367). - Lints were updated for
2017-08-10
nightly. - Minimum required
rustc
is1.21.0-nightly (2017-08-10)
.
- Tera errors that were previously skipped internally are now emitted.
- Typos were fixed across the board.
This release includes the following new features:
- Fairings, Rocket's structure middleware, were introduced.
- Native TLS support was introduced.
- Private cookies were introduced.
- A
MsgPack
type has been added tocontrib
for simple consumption and returning of MessagePack data. - Launch failures (
LaunchError
) fromRocket::launch()
are now returned for inspection without panicking. - Routes without query parameters now match requests with or without query parameters.
- Default rankings range from -4 to -1, preferring static paths and routes with query string matches.
- A native
Accept
header structure was added. - The
Accept
request header can be retrieved viaRequest::accept()
. - Incoming form fields can be renamed via a new
#[form(field = "name")]
structure field attribute. - All active routes can be retrieved via
Rocket::routes()
. Response::body_string()
was added to retrieve the response body as aString
.Response::body_bytes()
was added to retrieve the response body as aVec<u8>
.Response::content_type()
was added to easily retrieve the Content-Type header of a response.- Size limits on incoming data are now configurable.
Request::limits()
was added to retrieve incoming data limits.- Responders may dynamically adjust their response based on the incoming request.
Request::guard()
was added for simple retrieval of request guards.Request::route()
was added to retrieve the active route, if any.&Route
is now a request guard.- The base mount path of a
Route
can be retrieved viaRoute::base
orRoute::base()
. Cookies
supports private (authenticated encryption) cookies, encrypted with thesecret_key
config key.Config::{development, staging, production}
constructors were added forConfig
.Config::get_datetime()
was added to retrieve an extra as aDatetime
.- Forms can be now parsed leniently via the new
LenientForm
data guard. - The
?
operator can now be used withOutcome
. - Quoted string, array, and table based configuration parameters can be set via environment variables.
- Log coloring is disabled when
stdout
is not a TTY. FromForm
is implemented forOption<T: FromForm>
,Result<T: FromForm, T::Error>
.- The
NotFound
responder was added for simple 404 response construction.
This release includes many breaking changes. These changes are listed below along with a short note about how to handle the breaking change in existing applications.
-
session_key
was renamed tosecret_key
, requires a 256-bit base64 keyIt's unlikely that
session_key
was previously used. If it was, renamesession_key
tosecret_key
. Generate a random 256-bit base64 key using a tool like openssl:openssl rand -base64 32
. -
The
&Cookies
request guard has been removed in favor ofCookies
Change
&Cookies
in a request guard position toCookies
. -
Rocket::launch()
now returns aLaunchError
, doesn't panic.For the old behavior, suffix a call to
.launch()
with a semicolon:.launch();
. -
Routes without query parameters match requests with or without query parameters.
There is no workaround, but this change may allow manual ranks from routes to be removed.
-
The
format
route attribute on non-payload requests matches against the Accept header.Excepting a custom request guard, there is no workaround. Previously,
format
always matched against the Content-Type header, regardless of whether the request method indicated a payload or not. -
A type of
&str
can no longer be used in form structures or parameters.Use the new
&RawStr
type instead. -
ContentType
is no longer a request guard.Use
&ContentType
instead. -
Request::content_type()
returns&ContentType
instead ofContentType
.Use
.clone()
on&ContentType
if a type ofContentType
is required. -
Response::header_values()
was removed.Response::headers()
now returns an&HeaderMap
.A call to
Response::headers()
can be replaced withResponse::headers().iter()
. A call toResponse::header_values(name)
can be replaced withResponse::headers().get(name)
. -
Route collisions result in a hard error and panic.
There is no workaround. Previously, route collisions were a warning.
-
The
IntoOutcome
trait has been expanded and made more flexible.There is no workaround.
IntoOutcome::into_outcome()
now takes aFailure
value to use.IntoOutcome::or_forward()
was added to return aForward
outcome ifself
indicates an error. -
The 'testing' feature was removed.
Remove
features = ["testing"]
fromCargo.toml
. Use the newlocal
module for testing. -
serde
was updated to 1.0.There is no workaround. Ensure all dependencies rely on
serde
1.0
. -
config::active()
was removed.Use
Rocket::config()
to retrieve the configuration before launch. If needed, use managed state to store config information for later use. -
The
Responder
trait has changed.Responder::respond(self)
was removed in favor ofResponder::respond_to(self, &Request)
. Responders may dynamically adjust their response based on the incoming request. -
Outcome::of(Responder)
was removed whileOutcome::from(&Request, Responder)
was added.Use
Outcome::from(..)
instead ofOutcome::of(..)
. -
Usage of templates requires
Template::fairing()
to be attached.Call
.attach(Template::fairing())
on the application's Rocket instance before launching. -
The
Display
implementation ofTemplate
was removed.Use
Template::show()
to render a template directly. -
Request::new()
is no longer exported.There is no workaround.
-
The
FromForm
trait has changed.Responder::from_form_items(&mut FormItems)
was removed in favor ofResponder::from_form(&mut FormItems, bool)
. The second parameter indicates whether parsing should be strict (iftrue
) or lenient (iffalse
). -
LoggingLevel
was removed as a root reexport.It can now be imported from
rocket::config::LoggingLevel
. -
An
Io
variant was added toConfigError
.Ensure
match
es onConfigError
include anIo
variant. -
ContentType::from_extension()
returns anOption<ContentType>
.For the old behavior, use
.unwrap_or(ContentType::Any)
. -
The
IntoValue
config trait was removed in favor ofInto<Value>
.There is no workaround. Use
Into<Value>
as necessary. -
The
rocket_contrib::JSON
type has been renamed torocket_contrib::Json
.Use
Json
instead ofJSON
. -
All structs in the
content
module use TitleCase names.Use
Json
,Xml
,Html
, andCss
instead ofJSON
,XML
,HTML
, andCSS
, respectively.
In addition to new features, Rocket saw the following improvements:
- "Rocket" is now capitalized in the
Server
HTTP header. - The generic parameter of
rocket_contrib::Json
defaults tojson::Value
. - The trailing '...' in the launch message was removed.
- The launch message prints regardless of the config environment.
- For debugging,
FromData
is implemented forVec<u8>
andString
. - The port displayed on launch is the port resolved, not the one configured.
- The
uuid
dependency was updated to0.5
. - The
base64
dependency was updated to0.6
. - The
toml
dependency was updated to0.4
. - The
handlebars
dependency was updated to0.27
. - The
tera
dependency was updated to0.10
. yansi
is now used for all terminal coloring.- The
dev
rustc
release channel is supported during builds. Config
is now exported from the root.Request
implementsClone
andDebug
.- The
workers
config parameter now defaults tonum_cpus * 2
. - Console logging for table-based config values is improved.
PartialOrd
,Ord
, andHash
are now implemented forState
.- The format of a request is always logged when available.
- Route matching on
format
now functions as documented.
- All examples include a test suite.
- The
master
branch now uses a-dev
version number.
- Lints were updated for
2017-06-01
nightly. - Minimum required
rustc
is1.19.0-nightly (2017-06-01)
.
- Codegen was updated for
2017-05-26
nightly.
- Allow
k
andv
to be used as fields inFromForm
structures by avoiding identifier collisions (#265).
- Lints were updated for
2017-04-15
nightly. - Minimum required
rustc
is1.18.0-nightly (2017-04-15)
.
- Codegen was updated for
2017-03-30
nightly. - Minimum required
rustc
is1.18.0-nightly (2017-03-30)
.
- Multiple header values for the same header name are now properly preserved (#223).
- The
get_slice
andget_table
methods were added toConfig
. - The
pub_restricted
feature has been stabilized!
- Lints were updated for
2017-03-20
nightly. - Minimum required
rustc
is1.17.0-nightly (2017-03-22)
.
- The test script now denies trailing whitespace.
- Lints were updated for
2017-02-25
and2017-02-26
nightlies. - Minimum required
rustc
is1.17.0-nightly (2017-02-26)
.
Flash
cookie deletion functions as expected regardless of the path.config
properly accepts IPv6 addresses.- Multiple
Set-Cookie
headers are properly set.
Display
andError
were implemented forConfigError
.webp
,ttf
,otf
,woff
, andwoff2
were added as known content types.- Routes are presorted for faster routing.
into_bytes
andinto_inner
methods were added toBody
.
- Fixed
unmanaged_state
lint so that it works with prefilled type aliases.
- Better errors are emitted on Tera template parse errors.
- Fixed typos in
manage
andJSON
docs.
- Updated doctests for latest Cargo nightly.
Detailed release notes for v0.2 can also be found on rocket.rs.
This release includes the following new features:
- Introduced managed state.
- Added lints that warn on unmanaged state and unmounted routes.
- Added the ability to set configuration parameters via environment variables.
Config
structures can be built viaConfigBuilder
, which follows the builder pattern.- Logging can be enabled or disabled on custom configuration via a second
parameter to the
Rocket::custom
method. name
andvalue
methods were added toHeader
to retrieve the name and value of a header.- A new configuration parameter,
workers
, can be used to set the number of threads Rocket uses. - The address of the remote connection is available via
Request.remote()
. Request preprocessing overrides remote IP with value from theX-Real-IP
header, if present. - During testing, the remote address can be set via
MockRequest.remote()
. - The
SocketAddr
request guard retrieves the remote address. - A
UUID
type has been added tocontrib
. rocket
androcket_codegen
will refuse to build with an incompatible nightly version and emit nice error messages.- Major performance and usability improvements were upstreamed to the
cookie
crate, including the addition of aCookieBuilder
. - When a checkbox isn't present in a form,
bool
types in aFromForm
structure will parse asfalse
. - The
FormItems
iterator can be queried for a complete parse viacompleted
andexhausted
. - Routes for
OPTIONS
requests can be declared via theoptions
decorator. - Strings can be percent-encoded via
URI::percent_encode()
.
This release includes several breaking changes. These changes are listed below along with a short note about how to handle the breaking change in existing applications.
-
Rocket::custom
takes two parameters, the first beingConfig
by value.A call in v0.1 of the form
Rocket::custom(&config)
is nowRocket::custom(config, false)
. -
Tera templates are named without their extension.
A templated named
name.html.tera
is now simplyname
. -
JSON
unwrap
method has been renamed tointo_inner
.A call to
.unwrap()
should be changed to.into_inner()
. -
The
map!
macro was removed in favor of thejson!
macro.A call of the form
map!{ "a" => b }
can be written as:json!({ "a": b })
. -
The
hyper::SetCookie
header is no longer exported.Use the
Cookie
type as anInto<Header>
type directly. -
The
Content-Type
forString
is nowtext/plain
.Use
content::HTML<String>
for HTML-basedString
responses. -
Request.content_type()
returns anOption<ContentType>
.Use
.unwrap_or(ContentType::Any)
to get the old behavior. -
The
ContentType
request guard forwards when the request has noContent-Type
header.Use an
Option<ContentType>
and.unwrap_or(ContentType::Any)
for the old behavior. -
A
Rocket
instance must be declared before aMockRequest
.Change the order of the
rocket::ignite()
andMockRequest::new()
calls. -
A route with
format
specified only matches requests with the same format.Previously, a route with a
format
would match requests without a format specified. There is no workaround to this change; simply specify formats when required. -
FormItems
can no longer be constructed directly.Instead of constructing as
FormItems(string)
, construct asFormItems::from(string)
. -
from_from_string(&str)
inFromForm
removed in favor offrom_form_items(&mut FormItems)
.Most implementation should be using
FormItems
internally; simply use the passed inFormItems
. In other cases, the form string can be retrieved via theinner_str
method ofFormItems
. -
Config::{set, default_for}
are deprecated.Use the
set_{param}
methods instead ofset
, andnew
orbuild
in place ofdefault_for
. -
Route paths must be absolute.
Prepend a
/
to convert a relative path into an absolute one. -
Route paths cannot contain empty segments.
Remove any empty segments, including trailing ones, from a route path.
A couple of bugs were fixed in this release:
- Handlebars partials were not properly registered (#122).
Rocket::custom
did not set the custom configuration as theactive
configuration.- Route path segments containing more than one dynamic parameter were allowed.
In addition to new features, Rocket saw the following smaller improvements:
- Rocket no longer overwrites a catcher's response status.
- The
port
Config
type is now a properu16
. - Clippy issues injected by codegen are resolved.
- Handlebars was updated to
0.25
. - The
PartialEq
implementation ofConfig
doesn't consider the path or secret key. - Hyper dependency updated to
0.10
. - The
Error
type forJSON as FromData
has been exposed asSerdeError
. - SVG was added as a known Content-Type.
- Serde was updated to
0.9
. - Form parse failure now results in a 422 error code.
- Tera has been updated to
0.7
. pub(crate)
is used throughout to enforce visibility rules.- Query parameters in routes (
/path?<param>
) are now logged. - Routes with and without query parameters no longer collide.
- Testing was parallelized, resulting in 3x faster Travis builds.
- Hyper version pinned to 0.9.14 due to upstream non-semver breaking change.
- Fixed security checks in
FromSegments
implementation forPathBuf
.
proc_macro
feature removed from examples due to stability.
- Header names are treated as case-preserving.
- Minimum supported nightly is
2017-01-03
.
- Typo in
Outcome
formatting fixed (Succcess -> Success). - Added
ContentType::CSV
. - Dynamic segments parameters are properly resolved, even when mounted.
- Request methods are only overridden via
_method
field on POST. - Form value
String
s are properly decoded.
- The
_method
field is now properly ignored inFromForm
derivation. - Unknown Content-Types in
format
no longer result in an error. - Deriving
FromForm
no longer results in a deprecation warning. - Codegen will refuse to build with incompatible rustc, presenting error message and suggestion.
- Added
head
as a valid decorator forHEAD
requests. - Added
route(OPTIONS)
as a valid decorator forOPTIONS
requests.
- Templates with the
.tera
extension are properly autoescaped. - Nested template names are properly resolved on Windows.
- Template implements
Display
. - Tera dependency updated to version 0.6.
- Todo example requirements clarified in its
README
.
- Tests added for
config
,optional_result
,optional_redirect
, andquery_params
examples. - Testing script checks for and disallows tab characters.
- New script (
bump_version.sh
) automates version bumps. - Config script emits error when readlink/readpath support is bad.
- Travis badge points to public builds.
- Fix
get_raw_segments
index argument in route codegen (#41). - Segments params (
<param..>
) respect prefixes.
- Fix nested template name resolution (#42).
- New script (
publish.sh
) automates publishing to crates.io. - New script (
bump_version.sh
) automates version bumps.
NamedFile
Responder
lost its body in the shuffle; it's back!
This is the first public release of Rocket!
All of the mentions to hyper
types in core Rocket types are no more. Rocket
now implements its own Request
and Response
types.
ContentType
uses associated constants instead of static methods.StatusCode
removed in favor of newStatus
type.Response
type alias superseded byResponse
type.Responder::respond
no longer takes in hyper type.Responder::respond
returnsResponse
, takesself
by move.Handler
returnsOutcome
instead ofResponse
type alias.ErrorHandler
returnsResult
.- All
Hyper*
types were moved to unprefixed versions inhyper::
. MockRequest::dispatch
now returns aResponse
type.URIBuf
removed in favor of unifiedURI
.- Rocket panics when an illegal, dynamic mount point is used.
- Rocket handles
HEAD
requests automatically. - New
Response
andResponseBuilder
types. - New
Request
,Header
,Status
, andContentType
types.
MockRequest
allows any type of header.MockRequest
allows cookies.
- Debug output disabled by default.
- The
ROCKET_CODEGEN_DEBUG
environment variables enables codegen logging.
All incoming request data is now streamed. This resulted in a major change to the Rocket APIs. They are summarized through the following API changes:
- The
form
route parameter has been removed. - The
data
route parameter has been introduced. - Forms are now handled via the
data
parameter andForm
type. - Removed the
data
parameter fromRequest
. - Added
FromData
conversion trait and default implementation. FromData
is used to automatically derive thedata
parameter.Responder
s are now final: they cannot forward to other requests.Responser
s may only forward to catchers.
- Request
uri
parameter is private. Useuri()
method instead. form
module moved underrequest
module.response::data
was renamed toresponse::content
.- Introduced
Outcome
withSuccess
,Failure
, andForward
variants. outcome
module moved to top-level.Response
is now a type alias toOutcome
.Empty
Responder
was removed.StatusResponder
removed in favor ofresponse::status
module.
- Error handlers can now take 0, 1, or 2 parameters.
FromForm
derive now works on empty structs.- Lifetimes are now properly stripped in code generation.
- Any valid ident is now allowed in single-parameter route parameters.
- Route is now cloneable.
Request
no longer has any lifetime parameters.Handler
type now includes aData
parameter.http
module is public.Responder
implemented for()
type as an empty response.- Add
config::get()
for global config access. - Introduced
testing
module. Rocket.toml
allows global configuration via[global]
table.
- Added a
raw_upload
example. - Added a
pastebin
example. - Documented all public APIs.
- Now building and running tests with
--all-features
flag. - Added appveyor config for Windows CI testing.
- Remove
Rocket::new
in favor ofignite
method. - Remove
Rocket::mount_and_launch
in favor of chainingmount(..).launch()
. mount
andcatch
takeRocket
type by value.- All types related to HTTP have been moved into
http
module. Template::render
incontrib
now takes context by reference.
- Rocket now parses option
Rocket.toml
for configuration, defaulting to sane values. ROCKET_ENV
environment variable can be used to specify running environment.
- Document
ContentType
. - Document
Request
. - Add script that builds docs.
- Scripts can now be run from any directory.
- Cache Cargo directories in Travis for faster testing.
- Check that library version numbers match in testing script.
- Rename
response::data_type
toresponse::data
.
- Rocket interprets
_method
field in forms as the incoming request's method. - Add
Outcome::Bad
to signify responses that failed internally. - Add a
NamedFile
Responder
type that uses a file's extension for the response's content type. - Add a
Stream
Responder
for streaming responses.
- Introduce the
contrib
crate. - Add JSON support via
JSON
, which implementsFromRequest
andResponder
. - Add templating support via
Template
which implementsResponder
.
- Initial guide-like documentation.
- Add documentation, testing, and contributing sections to README.
- Add a significant number of codegen tests.