Add more docs
This commit is contained in:
parent
6ac56f54c6
commit
f00b1f9a38
|
@ -13,7 +13,8 @@ fn main() {
|
||||||
// The default demonstrates the "All" serialization of several of the settings
|
// The default demonstrates the "All" serialization of several of the settings
|
||||||
let default: CorsOptions = Default::default();
|
let default: CorsOptions = Default::default();
|
||||||
|
|
||||||
let allowed_origins = AllowedOrigins::some_exact(&["https://www.acme.com"]);
|
let allowed_origins =
|
||||||
|
AllowedOrigins::some(&["https://www.acme.com"], &["^https://(.+).acme.com$"]);
|
||||||
|
|
||||||
let options = cors::CorsOptions {
|
let options = cors::CorsOptions {
|
||||||
allowed_origins,
|
allowed_origins,
|
||||||
|
|
102
src/lib.rs
102
src/lib.rs
|
@ -558,20 +558,59 @@ mod method_serde {
|
||||||
|
|
||||||
/// A list of allowed origins. Either Some origins are allowed, or all origins are allowed.
|
/// A list of allowed origins. Either Some origins are allowed, or all origins are allowed.
|
||||||
///
|
///
|
||||||
|
/// Exact matches are matched exactly with the
|
||||||
|
/// [ASCII Serialization](https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin)
|
||||||
|
/// of the origin.
|
||||||
|
///
|
||||||
|
/// Regular expressions are tested for matches against the
|
||||||
|
/// [ASCII Serialization](https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin)
|
||||||
|
/// of the origin.
|
||||||
|
///
|
||||||
|
/// # Warning about Regex expressions
|
||||||
|
/// By default, regex expressions are
|
||||||
|
/// [unanchored](https://docs.rs/regex/1.1.2/regex/struct.RegexSet.html#method.is_match).
|
||||||
|
///
|
||||||
|
/// This means that if the regex does not start with `^` or `\A`, or end with `$` or `\z`,
|
||||||
|
/// then it is permitted to match anywhere in the text. You are encouraged to use the anchors when
|
||||||
|
/// crafting your Regex expressions.
|
||||||
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use rocket_cors::AllowedOrigins;
|
/// use rocket_cors::AllowedOrigins;
|
||||||
///
|
///
|
||||||
|
/// let exact = ["https://www.acme.com"];
|
||||||
|
/// let regex = ["^https://(.+).acme.com$"];
|
||||||
|
///
|
||||||
/// let all_origins = AllowedOrigins::all();
|
/// let all_origins = AllowedOrigins::all();
|
||||||
/// let some_origins = AllowedOrigins::some_exact(&["https://www.acme.com"]);
|
/// let some_origins = AllowedOrigins::some_exact(&exact);
|
||||||
/// let null_origins = AllowedOrigins::some_null();
|
/// let null_origins = AllowedOrigins::some_null();
|
||||||
|
/// let regex_origins = AllowedOrigins::some_regex(®ex);
|
||||||
|
/// let mixed_origins = AllowedOrigins::some(&exact, ®ex);
|
||||||
/// ```
|
/// ```
|
||||||
|
///
|
||||||
pub type AllowedOrigins = AllOrSome<Origins>;
|
pub type AllowedOrigins = AllOrSome<Origins>;
|
||||||
|
|
||||||
impl AllowedOrigins {
|
impl AllowedOrigins {
|
||||||
/// Allows some origins
|
/// Allows some origins, with a mix of exact matches or regex matches
|
||||||
///
|
///
|
||||||
/// Validation is not performed at this stage, but at a later stage.
|
/// Validation is not performed at this stage, but at a later stage.
|
||||||
|
///
|
||||||
|
/// Exact matches are matched exactly with the
|
||||||
|
/// [ASCII Serialization](https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin)
|
||||||
|
/// of the origin.
|
||||||
|
///
|
||||||
|
/// Regular expressions are tested for matches against the
|
||||||
|
/// [ASCII Serialization](https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin)
|
||||||
|
/// of the origin.
|
||||||
|
///
|
||||||
|
/// # Warning about Regex expressions
|
||||||
|
/// By default, regex expressions are
|
||||||
|
/// [unanchored](https://docs.rs/regex/1.1.2/regex/struct.RegexSet.html#method.is_match).
|
||||||
|
///
|
||||||
|
/// This means that if the regex does not start with `^` or `\A`, or end with `$` or `\z`,
|
||||||
|
/// then it is permitted to match anywhere in the text. You are encouraged to use the anchors when
|
||||||
|
/// crafting your Regex expressions.
|
||||||
|
#[allow(clippy::needless_lifetimes)]
|
||||||
pub fn some<'a, 'b, S1: AsRef<str>, S2: AsRef<str>>(exact: &'a [S1], regex: &'b [S2]) -> Self {
|
pub fn some<'a, 'b, S1: AsRef<str>, S2: AsRef<str>>(exact: &'a [S1], regex: &'b [S2]) -> Self {
|
||||||
AllOrSome::Some(Origins {
|
AllOrSome::Some(Origins {
|
||||||
exact: Some(exact.iter().map(|s| s.as_ref().to_string()).collect()),
|
exact: Some(exact.iter().map(|s| s.as_ref().to_string()).collect()),
|
||||||
|
@ -583,6 +622,10 @@ impl AllowedOrigins {
|
||||||
/// Allows some _exact_ origins
|
/// Allows some _exact_ origins
|
||||||
///
|
///
|
||||||
/// Validation is not performed at this stage, but at a later stage.
|
/// Validation is not performed at this stage, but at a later stage.
|
||||||
|
///
|
||||||
|
/// Exact matches are matched exactly with the
|
||||||
|
/// [ASCII Serialization](https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin)
|
||||||
|
/// of the origin.
|
||||||
pub fn some_exact<S: AsRef<str>>(exact: &[S]) -> Self {
|
pub fn some_exact<S: AsRef<str>>(exact: &[S]) -> Self {
|
||||||
AllOrSome::Some(Origins {
|
AllOrSome::Some(Origins {
|
||||||
exact: Some(exact.iter().map(|s| s.as_ref().to_string()).collect()),
|
exact: Some(exact.iter().map(|s| s.as_ref().to_string()).collect()),
|
||||||
|
@ -590,7 +633,21 @@ impl AllowedOrigins {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allow some __regex__ origins
|
/// Allow some regular expression origins
|
||||||
|
///
|
||||||
|
/// Validation is not performed at this stage, but at a later stage.
|
||||||
|
///
|
||||||
|
/// Regular expressions are tested for matches against the
|
||||||
|
/// [ASCII Serialization](https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin)
|
||||||
|
/// of the origin.
|
||||||
|
///
|
||||||
|
/// # Warning about Regex expressions
|
||||||
|
/// By default, regex expressions are
|
||||||
|
/// [unanchored](https://docs.rs/regex/1.1.2/regex/struct.RegexSet.html#method.is_match).
|
||||||
|
///
|
||||||
|
/// This means that if the regex does not start with `^` or `\A`, or end with `$` or `\z`,
|
||||||
|
/// then it is permitted to match anywhere in the text. You are encouraged to use the anchors when
|
||||||
|
/// crafting your Regex expressions.
|
||||||
pub fn some_regex<S: AsRef<str>>(regex: &[S]) -> Self {
|
pub fn some_regex<S: AsRef<str>>(regex: &[S]) -> Self {
|
||||||
AllOrSome::Some(Origins {
|
AllOrSome::Some(Origins {
|
||||||
regex: Some(regex.iter().map(|s| s.as_ref().to_string()).collect()),
|
regex: Some(regex.iter().map(|s| s.as_ref().to_string()).collect()),
|
||||||
|
@ -621,6 +678,22 @@ impl AllowedOrigins {
|
||||||
///
|
///
|
||||||
/// These Origins are specified as logical `ORs`. That is, if any of the origins match, the entire
|
/// These Origins are specified as logical `ORs`. That is, if any of the origins match, the entire
|
||||||
/// request is considered to be valid.
|
/// request is considered to be valid.
|
||||||
|
///
|
||||||
|
/// Exact matches are matched exactly with the
|
||||||
|
/// [ASCII Serialization](https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin)
|
||||||
|
/// of the origin.
|
||||||
|
///
|
||||||
|
/// Regular expressions are tested for matches against the
|
||||||
|
/// [ASCII Serialization](https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin)
|
||||||
|
/// of the origin.
|
||||||
|
///
|
||||||
|
/// # Warning about Regex expressions
|
||||||
|
/// By default, regex expressions are
|
||||||
|
/// [unanchored](https://docs.rs/regex/1.1.2/regex/struct.RegexSet.html#method.is_match).
|
||||||
|
///
|
||||||
|
/// This means that if the regex does not start with `^` or `\A`, or end with `$` or `\z`,
|
||||||
|
/// then it is permitted to match anywhere in the text. You are encouraged to use the anchors when
|
||||||
|
/// crafting your Regex expressions.
|
||||||
#[derive(Clone, PartialEq, Eq, Debug, Default)]
|
#[derive(Clone, PartialEq, Eq, Debug, Default)]
|
||||||
#[cfg_attr(feature = "serialization", derive(Serialize, Deserialize))]
|
#[cfg_attr(feature = "serialization", derive(Serialize, Deserialize))]
|
||||||
#[cfg_attr(feature = "serialization", serde(default))]
|
#[cfg_attr(feature = "serialization", serde(default))]
|
||||||
|
@ -632,6 +705,10 @@ pub struct Origins {
|
||||||
///
|
///
|
||||||
/// These __must__ be valid URL strings that will be parsed and validated when
|
/// These __must__ be valid URL strings that will be parsed and validated when
|
||||||
/// creating [`Cors`].
|
/// creating [`Cors`].
|
||||||
|
///
|
||||||
|
/// Exact matches are matched exactly with the
|
||||||
|
/// [ASCII Serialization](https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin)
|
||||||
|
/// of the origin.
|
||||||
#[cfg_attr(feature = "serialization", serde(default))]
|
#[cfg_attr(feature = "serialization", serde(default))]
|
||||||
pub exact: Option<HashSet<String>>,
|
pub exact: Option<HashSet<String>>,
|
||||||
/// Origins that will be matched via __any__ regex in this list.
|
/// Origins that will be matched via __any__ regex in this list.
|
||||||
|
@ -644,6 +721,14 @@ pub struct Origins {
|
||||||
///
|
///
|
||||||
/// For more information on the syntax of Regex in Rust, see the
|
/// For more information on the syntax of Regex in Rust, see the
|
||||||
/// [documentation](https://docs.rs/regex).
|
/// [documentation](https://docs.rs/regex).
|
||||||
|
///
|
||||||
|
/// Regular expressions are tested for matches against the
|
||||||
|
/// [ASCII Serialization](https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin)
|
||||||
|
/// of the origin.
|
||||||
|
///
|
||||||
|
/// # Warning about Regex expressions
|
||||||
|
/// By default, regex expressions are
|
||||||
|
/// [unanchored](https://docs.rs/regex/1.1.2/regex/struct.RegexSet.html#method.is_match).
|
||||||
#[cfg_attr(feature = "serialization", serde(default))]
|
#[cfg_attr(feature = "serialization", serde(default))]
|
||||||
pub regex: Option<HashSet<String>>,
|
pub regex: Option<HashSet<String>>,
|
||||||
}
|
}
|
||||||
|
@ -2032,12 +2117,17 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn validate_origin_validates_regex() {
|
fn validate_origin_validates_regex() {
|
||||||
let url = "https://www.example-something.com";
|
|
||||||
let origin = not_err!(to_parsed_origin(&url));
|
|
||||||
let allowed_origins = not_err!(parse_allowed_origins(&AllowedOrigins::some_regex(&[
|
let allowed_origins = not_err!(parse_allowed_origins(&AllowedOrigins::some_regex(&[
|
||||||
"^https://www.example-[A-z0-9]+.com$"
|
"^https://www.example-[A-z0-9]+.com$",
|
||||||
|
"^https://(.+).acme.com$",
|
||||||
])));
|
])));
|
||||||
|
|
||||||
|
let url = "https://www.example-something.com";
|
||||||
|
let origin = not_err!(to_parsed_origin(&url));
|
||||||
|
not_err!(validate_origin(&origin, &allowed_origins));
|
||||||
|
|
||||||
|
let url = "https://subdomain.acme.com";
|
||||||
|
let origin = not_err!(to_parsed_origin(&url));
|
||||||
not_err!(validate_origin(&origin, &allowed_origins));
|
not_err!(validate_origin(&origin, &allowed_origins));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue