2017-05-15 04:46:01 +00:00
|
|
|
use std::ops::BitOr;
|
|
|
|
|
2019-06-13 01:48:02 +00:00
|
|
|
/// Information about a [`Fairing`](crate::fairing::Fairing).
|
2017-05-15 04:46:01 +00:00
|
|
|
///
|
|
|
|
/// The `name` field is an arbitrary name for a fairing. The `kind` field is a
|
2018-10-06 13:25:17 +00:00
|
|
|
/// is an `or`d set of [`Kind`] structures. Rocket uses the values set in `Kind`
|
|
|
|
/// to determine which callbacks from a given `Fairing` implementation to
|
|
|
|
/// actually call.
|
2017-05-15 04:46:01 +00:00
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A simple `Info` structure that can be used for a `Fairing` that implements
|
2017-05-17 08:39:36 +00:00
|
|
|
/// all four callbacks:
|
2017-05-15 04:46:01 +00:00
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// use rocket::fairing::{Info, Kind};
|
|
|
|
///
|
|
|
|
/// # let _unused_info =
|
|
|
|
/// Info {
|
|
|
|
/// name: "Example Fairing",
|
2017-05-17 08:39:36 +00:00
|
|
|
/// kind: Kind::Attach | Kind::Launch | Kind::Request | Kind::Response
|
2017-05-15 04:46:01 +00:00
|
|
|
/// }
|
|
|
|
/// # ;
|
|
|
|
/// ```
|
Test 'secret_key' validation, now on pre-launch.
Prior to this commit, it was not possible to test Rocket crates in
production mode without setting a global secret key or bypassing secret
key checking - the testing script did the latter. The consequence is
that it became impossible to test secret key related failures because
the tests passed regardless.
This commit undoes this. As a consequence, all tests are now aware of
the difference between debug and release configurations, the latter of
which validates 'secret_key' by default. New 'Client::debug()' and
'Client::debug_with()' simplify creating an instance of 'Client' with
configuration in debug mode to avoid undesired test failures.
The summary of changes in this commit are:
* Config 'secret_key' success and failure are now tested.
* 'secret_key' validation was moved to pre-launch from 'Config:from()'.
* 'Config::from()' only extracts the config.
* Added 'Config::try_from()' for non-panicking extraction.
* 'Config' now knows the profile it was extracted from.
* The 'Config' provider sets a profile of 'Config.profile'.
* 'Rocket', 'Client', 'Fairings', implement 'Debug'.
* 'fairing::Info' implements 'Copy', 'Clone'.
* 'Fairings' keeps track of, logs attach fairings.
* 'Rocket::reconfigure()' was added to allow modifying a config.
Internally, the testing script was refactored to properly test the
codebase with the new changes. In particular, it no longer sets a rustc
'cfg' to avoid secret-key checking.
Resolves #1543.
Fixes #1564.
2021-03-09 08:07:43 +00:00
|
|
|
#[derive(Debug, Copy, Clone)]
|
2017-05-15 04:46:01 +00:00
|
|
|
pub struct Info {
|
|
|
|
/// The name of the fairing.
|
|
|
|
pub name: &'static str,
|
|
|
|
/// A set representing the callbacks the fairing wishes to receive.
|
|
|
|
pub kind: Kind
|
|
|
|
}
|
|
|
|
|
|
|
|
/// A bitset representing the kinds of callbacks a
|
2019-06-13 01:48:02 +00:00
|
|
|
/// [`Fairing`](crate::fairing::Fairing) wishes to receive.
|
2017-05-15 04:46:01 +00:00
|
|
|
///
|
|
|
|
/// A fairing can request any combination of any of the following kinds of
|
|
|
|
/// callbacks:
|
|
|
|
///
|
2017-05-17 08:39:36 +00:00
|
|
|
/// * Attach
|
2017-05-15 04:46:01 +00:00
|
|
|
/// * Launch
|
|
|
|
/// * Request
|
|
|
|
/// * Response
|
|
|
|
///
|
|
|
|
/// Two `Kind` structures can be `or`d together to represent a combination. For
|
|
|
|
/// instance, to represent a fairing that is both a launch and request fairing,
|
|
|
|
/// use `Kind::Launch | Kind::Request`. Similarly, to represent a fairing that
|
2017-05-17 08:39:36 +00:00
|
|
|
/// is only an attach fairing, use `Kind::Attach`.
|
2017-05-15 04:46:01 +00:00
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
|
|
pub struct Kind(usize);
|
|
|
|
|
|
|
|
#[allow(non_upper_case_globals)]
|
|
|
|
impl Kind {
|
2017-05-17 08:39:36 +00:00
|
|
|
/// `Kind` flag representing a request for an 'attach' callback.
|
|
|
|
pub const Attach: Kind = Kind(0b0001);
|
2017-05-15 04:46:01 +00:00
|
|
|
/// `Kind` flag representing a request for a 'launch' callback.
|
2017-05-17 08:39:36 +00:00
|
|
|
pub const Launch: Kind = Kind(0b0010);
|
2017-05-15 04:46:01 +00:00
|
|
|
/// `Kind` flag representing a request for a 'request' callback.
|
2017-05-17 08:39:36 +00:00
|
|
|
pub const Request: Kind = Kind(0b0100);
|
2017-05-15 04:46:01 +00:00
|
|
|
/// `Kind` flag representing a request for a 'response' callback.
|
2017-05-17 08:39:36 +00:00
|
|
|
pub const Response: Kind = Kind(0b1000);
|
2017-05-15 04:46:01 +00:00
|
|
|
|
|
|
|
/// Returns `true` if `self` is a superset of `other`. In other words,
|
|
|
|
/// returns `true` if all of the kinds in `other` are also in `self`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// use rocket::fairing::Kind;
|
|
|
|
///
|
|
|
|
/// let launch_and_req = Kind::Launch | Kind::Request;
|
|
|
|
/// assert!(launch_and_req.is(Kind::Launch | Kind::Request));
|
|
|
|
///
|
|
|
|
/// assert!(launch_and_req.is(Kind::Launch));
|
|
|
|
/// assert!(launch_and_req.is(Kind::Request));
|
|
|
|
///
|
|
|
|
/// assert!(!launch_and_req.is(Kind::Response));
|
|
|
|
/// assert!(!launch_and_req.is(Kind::Launch | Kind::Response));
|
|
|
|
/// assert!(!launch_and_req.is(Kind::Launch | Kind::Request | Kind::Response));
|
|
|
|
/// ```
|
|
|
|
#[inline]
|
|
|
|
pub fn is(self, other: Kind) -> bool {
|
|
|
|
(other.0 & self.0) == other.0
|
|
|
|
}
|
2017-05-17 08:39:36 +00:00
|
|
|
|
|
|
|
/// Returns `true` if `self` is exactly `other`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// use rocket::fairing::Kind;
|
|
|
|
///
|
|
|
|
/// let launch_and_req = Kind::Launch | Kind::Request;
|
|
|
|
/// assert!(launch_and_req.is_exactly(Kind::Launch | Kind::Request));
|
|
|
|
///
|
|
|
|
/// assert!(!launch_and_req.is_exactly(Kind::Launch));
|
|
|
|
/// assert!(!launch_and_req.is_exactly(Kind::Request));
|
|
|
|
/// assert!(!launch_and_req.is_exactly(Kind::Response));
|
|
|
|
/// assert!(!launch_and_req.is_exactly(Kind::Launch | Kind::Response));
|
|
|
|
/// ```
|
|
|
|
#[inline]
|
|
|
|
pub fn is_exactly(self, other: Kind) -> bool {
|
|
|
|
self.0 == other.0
|
|
|
|
}
|
2017-05-15 04:46:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl BitOr for Kind {
|
|
|
|
type Output = Self;
|
|
|
|
|
|
|
|
#[inline(always)]
|
|
|
|
fn bitor(self, rhs: Self) -> Self {
|
|
|
|
Kind(self.0 | rhs.0)
|
|
|
|
}
|
|
|
|
}
|