Commit Graph

2367 Commits

Author SHA1 Message Date
Sergio Benitez b34085392d Add 'Method' variants for all registered methods.
This commit allow routes to be declared for methods outside of the
standard HTTP method set. Specifically, it enables declaring routes for
any method in the IANA Method Registry:

```rust
#[route(LINK, uri = "/<foo>")]
fn link() { ... }

#[route("VERSION-CONTROL", uri = "/<foo>")]
fn version_control() { ... }
```

The `Method` type has gained variants for each registered method.

Breaking changes:

  - `Method::from_str()` no longer parses mixed-case method names.
  - `Method` is marked as non-exhaustive.
  - `Method::supports_payload()` removed in favor of
    `Method::allows_request_body()`.

Resolves #232.
2024-04-24 19:22:03 -07:00
Sergio Benitez 7c50a58c99 Fix TLS example for updated bind interface. 2024-04-22 17:57:34 -07:00
Sergio Benitez 85ca2bc01c Refactor internal ignite sequencing. 2024-04-22 17:27:01 -07:00
Sergio Benitez 3bfc4ca644 Simplify 'Bind'. Allow try-launching on Futures. 2024-04-22 17:26:51 -07:00
Sergio Benitez 7cc818cd85 Introduce dynamic TLS resolvers.
This commit introduces the ability to dynamically select a TLS
configuration based on the client's TLS hello via the new `Resolver`
trait. In support of this, it also makes the following changes:

  * Added `Authority::set_port()`.
  * `UdsListener` is now `UnixListener`.
  * `Bindable` removed in favor of new `Bind`.
  * All built-in listeners now implement `Bind<&Rocket>`.
  * `Connection` requires `AsyncRead + AsyncWrite`.
  * The `Debug` impl for `Endpoint` displays the underlying address.
  * `Listener` must be `Sized`.
  * The TLS listener was moved to `tls::TlsListener`.
  * The preview `quic` listener no longer implements `Listener`.
  * Added `TlsConfig::server_config()`.
  * Added `race` future helpers.
  * Added `Rocket::launch_with()`, `Rocket::bind_launch()`.
  * Added a default `client.pem` to the TLS example.
  * Various unnecessary listener `Config` structures removed.

In addition, the testbench was revamped to support more scenarios. This
resulted in the following issues being found and fixed:

  * Fix an issue where the logger would ignore color requests.
  * Clarified docs for `mtls::Certificate` guard.
  * Improved error messages on listener misconfiguration.

Resolves #2730.
Resolves #2363.
Closes #2748.
Closes #2683.
Closes #2577.
2024-04-16 23:50:28 -07:00
Sergio Benitez 60f3cd57b0 Add end-to-end testbench.
Resolves #1509.
2024-04-12 03:15:44 -07:00
Sergio Benitez eec5c08179 Make all nightly CI jobs fallible. 2024-04-11 19:17:06 -07:00
Sergio Benitez 8831d47aad Restrict CI trigger job to 'rwf2/Rocket'. 2024-04-11 18:22:28 -07:00
Rong "Mantle" Bao ff12b1d4bc Update allowed lints for MSRV of 1.75. 2024-04-11 18:13:37 -07:00
Sergio Benitez dcde224648 Update dependencies and fix nightly warnings. 2024-04-11 18:09:21 -07:00
Sergio Benitez 17eca5bcc6 Allow CI on nightly to fail. 2024-04-11 18:08:56 -07:00
Wesley Rosenblum 07e4170b72 Use 's2n-quic' TLS server builder. 2024-04-10 14:06:58 -07:00
Łukasz Wojniłowicz a742d3da4f Symlink license files in all crate directories.
Resolves #2760.
2024-04-06 20:46:07 -07:00
Sergio Benitez 8614a7fece Support minijinja in 'dyn_templates'. 2024-04-03 14:54:01 -07:00
Sergio Benitez 0edbb6dad5 Document changeable TLS 'CryptoProvider's. 2024-03-31 11:46:56 -07:00
Sergio Benitez edce8bd656 Use default 'CryptoProvider' for all TLS ops.
Prior to this commit, some TLS related operations used 'ring' even when
a different default 'CryptoProvider' was installed. This commit fixes
that by refactoring 'TlsConfig' such that all utility methods are
required to use the default 'CryptoProvider'.

This commit also cleans up code related to the rustls 0.23 update.
2024-03-31 11:46:56 -07:00
Abdullah Alyan ce92c5dd76 Update rustls to 0.23. Support 'CryptoProvider's.
This commit updates rustls to 0.23 and adds support for custom
'CryptoProvider's installable via 'CryptoProvider::install_default()'.
In particular, this enables using `aws-lc-rs` for cryptography related
operation in TLS. The 'TLS' example was updated to test use of
'aws-lc-rs' on Unix.
2024-03-31 11:46:56 -07:00
Sergio Benitez bd26ca462a Introduce #[suppress]: suppress Rocket lints.
Adding `#[suppress(lint)]` for a known `lint` suppresses the
corresponding warning generated by Rocket's codegen. The lints are:

  * `unknown_format`
  * `dubious_payload`
  * `segment_chars`
  * `arbitrary_main`
  * `sync_spawn`

For example, the following works as expected to suppress the warning
generated by the unknown media type "application/foo":

```rust
fn post_foo() -> &'static str { "post_foo" }
```

Resolves #1188.
2024-03-21 20:24:53 -07:00
Tau 35a1cf12b6 Fix and always set Content-Length header.
Previously, the header was erroneously set as 'Content-Type' and not
visible to local clients. This commit fixes both of these issues.
2024-03-21 16:42:09 -07:00
Sergio Benitez 8f3061ba40 Rename 'candidate_endpoint()', 'bind_endpoint()'. 2024-03-20 14:29:32 -07:00
高奕GaoYi 19dd627a7c Add 'WebSocket::accept_key()'. 2024-03-20 14:18:39 -07:00
Sergio Benitez 225655817a Update 'x509-parser' to 0.16. 2024-03-20 01:37:31 -07:00
Sergio Benitez 02011a1307 Clean up codebase: fix reasonable clippy warnings.
This commit is a codebase-wide cleanup driven by clippy warnings. In
addition to fixing every reasonable warning, the following new
functionality was introduced:

  * `Accept::new()` now takes any `T: Into<QMediaType>` iterator.
  * `TempFile::is_empty()` was added.
  * `HeaderMap` now implements `IntoIterator`.

This commit makes the following breaking changes:

  * The `IntoCollection` trait is gone. Generics previously bound by the
    trait are now bound by `IntoIterator`. This affects:
    - `Accept::new()`
    - `ContentType::with_params()`
    - `Permission::{allow, allowed}()`
  * `MediaType`, `QMediaType`, and `Allow` implement `IntoIterator`,
    enabling most existing code to continue working without change.
  * The inherent `HeaderMap::into_iter()` method was removed.
  * The `Ok` variant in ErrorKind::Liftoff` is now `Box<Rocket<Orbit>>`.
2024-03-20 00:47:38 -07:00
Sergio Benitez d9249db6d6 Address new nightly compiler warnings. 2024-03-19 14:08:14 -07:00
Sergio Benitez 1619bbbddc Support QUIC and HTTP/3.
This commit adds support for HTTP/3 and QUIC under a disabled-by-default
feature `http3-preview`. The current implementation depends on modified
versions of h3 and s2n-quic-h3 which will need to be upstreamed and
published before a release is possible.

During the course of development various facets of Rocket's internal
connection handling and recent listener APIs were improved. The complete
list of changes included in this PR is:

  * A `shutdown` module was introduced.
  * `config::Shutdown` was renamed to `ShutdownConfig` and moved to
    `shutdown` while being re-exported from `config`.
  * `ListenerAddr` is now called `Endpoint`. Various methods which
    previously referred to "addresses" now refer to "endpoints".
  * `Rocket::endpoint()` was renamed to `Rocket::endpoints()` and now
    returns an iterator over the endpoints Rocket is listening on.
  * `Endpoint` acquired various query utility methods.
  * The `{set_}remote()` methods now take/produce `Endpoint`s.
  * `TlsBindable` only accepts single-phase internal interfaces.
  * Bind error messages include candidate endpoint info when possible.
  * The warning message when a secret key is not configured now includes
    information about its effect on private cookies.

Internal changes include:

  * Config module tests were moved to `config/tests.rs`.
  * The cancellable I/O implementation was significantly simplified.
  * The `TripWire` implementation was simplified.
  * Individual shutdown stages can now be awaited on via `Stages`.
  * The `Shield` implementation was simplified.

Resolves #2723.
2024-03-18 20:23:22 -07:00
Sergio Benitez 50c44e8fdc Allow displaying [T; N], Vec<T>, [u8] via 'uri!'.
Resolves #2750.
2024-03-14 15:26:03 -07:00
Sergio Benitez 7c702a5b01 Update yansi to 1.0.1. 2024-03-14 15:26:03 -07:00
Sergio Benitez 3927c931b2 Fix various typos in rustdocs. 2024-03-14 15:25:53 -07:00
Sergio Benitez d7bcef6cf3 Fix incorrect 'Accept' swap in rustdocs.
Resolves #2743.
2024-03-04 21:42:01 -08:00
Sergio Benitez 4f12bfb633 Update vcpkg blob URL in Windows CI step. 2024-03-04 19:20:21 -08:00
Sergio Benitez 001815889d Update README link to API docs. 2024-03-04 12:56:19 -08:00
John Bampton fd739bab4e Fix WebSocket FAQ entry, typos. 2024-03-04 12:37:29 -08:00
Sergio Benitez b15dc700aa Add action to trigger API docs deploy. 2024-03-01 20:50:33 -08:00
Sergio Benitez 6b0760b83d Remove redirect creation in mk-docs.sh. 2024-02-29 23:43:47 -08:00
Sergio Benitez 32c8199499 Trim unneeded code in scripts. 2024-02-28 23:49:02 -08:00
Sergio Benitez 8d3f1d65ac Reorganize and upgrade markup in site docs.
The guide is now in docs/guide. All other site assets are being migrated
to a separate repository.

The guide markup has been upgraded to take advantages of improvements in
the static site generator used to build the Rocket website.
2024-02-28 23:41:02 -08:00
Sergio Benitez a866134212 Avoid generating unused docs index page.
The unstable flag also results in rustdoc emitting absolute links, which
breaks versioned documentation.
2024-02-21 09:54:12 -08:00
Sergio Benitez ee59f26ec8 Improve doc building scripts.
Also removes unused 'bump_version' script.
2024-02-20 23:33:36 -08:00
Sergio Benitez f75fb63689
Add code of conduct. 2024-02-12 02:16:40 -08:00
Sergio Benitez 53c5166b6c Fix '#[async_bound]' for fns with no return type. 2024-01-30 20:36:40 -08:00
Sergio Benitez fde9cde8d7 Update "Getting Help" guide subsection.
- Remove mention of IRC channel: it is no longer bridged on Matrix.
  - Mention and link to GitHub discussions.

Closes #2692.

Co-authored-by: Siddharth1605 <Siddhashokan@gmail.com>
2024-01-30 20:10:21 -08:00
Sergio Benitez 38dbab8dd3 Bump MSRV to 1.75 for `async fn` in traits. 2024-01-30 09:18:43 -08:00
Sergio Benitez fd294049c7 Update to hyper 1. Enable custom + unix listeners.
This commit completely rewrites Rocket's HTTP serving. In addition to
significant internal cleanup, this commit introduces the following major
features:

  * Support for custom, external listeners in the `listener` module.

    The new `listener` module contains new `Bindable`, `Listener`, and
    `Connection` traits which enable composable, external
    implementations of connection listeners. Rocket can launch on any
    `Listener`, or anything that can be used to create a listener
    (`Bindable`), via a new `launch_on()` method.

  * Support for Unix domain socket listeners out of the box.

    The default listener backwards compatibly supports listening on Unix
    domain sockets. To do so, configure an `address` of
    `unix:path/to/socket` and optional set `reuse` to `true` (the
    default) or `false` which controls whether Rocket will handle
    creating and deleting the unix domain socket.

In addition to these new features, this commit makes the following major
improvements:

  * Rocket now depends on hyper 1.

  * Rocket no longer depends on hyper to handle connections. This allows
    us to handle more connection failure conditions which results in an
    overall more robust server with fewer dependencies.

  * Logic to work around hyper's inability to reference incoming request
    data in the response results in a 15% performance improvement.

  * `Client`s can be marked secure with `Client::{un}tracked_secure()`,
    allowing Rocket to treat local connections as running under TLS.

  * The `macros` feature of `tokio` is no longer used by Rocket itself.
    Dependencies can take advantage of this reduction in compile-time
    cost by disabling the new default feature `tokio-macros`.

  * A new `TlsConfig::validate()` method allows checking a TLS config.

  * New `TlsConfig::{certs,key}_reader()`,
    `MtlsConfig::ca_certs_reader()` methods return `BufReader`s, which
    allow reading the configured certs and key directly.

  * A new `NamedFile::open_with()` constructor allows specifying
    `OpenOptions`.

These improvements resulted in the following breaking changes:

  * The MSRV is now 1.74.
  * `hyper` is no longer exported from `rocket::http`.
  * `IoHandler::io` takes `Box<Self>` instead of `Pin<Box<Self>>`.
    - Use `Box::into_pin(self)` to recover the previous type.
  * `Response::upgrade()` now returns an `&mut dyn IoHandler`, not
    `Pin<& mut _>`.
  * `Config::{address,port,tls,mtls}` methods have been removed.
    - Use methods on `Rocket::endpoint()` instead.
  * `TlsConfig` was moved to `tls::TlsConfig`.
  * `MutualTls` was renamed and moved to `mtls::MtlsConfig`.
  * `ErrorKind::TlsBind` was removed.
  * The second field of `ErrorKind::Shutdown` was removed.
  * `{Local}Request::{set_}remote()` methods take/return an `Endpoint`.
  * `Client::new()` was removed; it was previously deprecated.

Internally, the following major changes were made:

  * A new `async_bound` attribute macro was introduced to allow setting
    bounds on futures returned by `async fn`s in traits while
    maintaining good docs.

  * All utility functionality was moved to a new `util` module.

Resolves #2671.
Resolves #1070.
2024-01-29 22:38:55 -08:00
Sergio Benitez e9b568d9b2 Fixup docs for 'proxy_proto_header'. 2024-01-22 18:41:20 -08:00
Arjen 5c85ea3db5 Support configurable 'X-Forwarded-Proto'.
Co-authored-by: Sergio Benitez <sb@sergio.bz>
2024-01-22 18:41:20 -08:00
Sergio Benitez 5034ff0d1a Update handlebars version in dyn_templates docs. 2024-01-17 21:41:25 -08:00
Alessandro Campeis dca3afcd77 Update 'handlebars' to v5.1. 2024-01-17 21:41:25 -08:00
Sergio Benitez 105f058e9d Update project sponsors. 2024-01-17 21:41:25 -08:00
Sergio Benitez 915c1181da Forward whole-form errors in 'FromForm' derive.
Resolves #2672.
2024-01-17 12:15:01 -08:00
Sergio Benitez de6a4c50ec Clarify route ranking in requests guide.
Closes #2687.
2024-01-17 10:52:00 -08:00