#[non_exhaustive]pub enum HostPattern {
All,
Cidr(IpNet),
Exact {
host: Host,
port: Option<u16>,
},
Domain {
suffix: String,
match_self: bool,
port: Option<u16>,
},
Wildcard {
pattern: String,
port: Option<u16>,
},
Local,
SubtractImplicit,
}Expand description
A single entry of a bypass list.
| Source | Variant |
|---|---|
* | HostPattern::All (not from a macOS or GNOME list, where it names nothing) |
| CIDR | HostPattern::Cidr |
IP / host:port | HostPattern::Exact |
example.com / .example.com / *.example.com | HostPattern::Domain |
192.168.* | HostPattern::Wildcard |
<local> | HostPattern::Local |
<-loopback> | HostPattern::SubtractImplicit |
The bare-name row is the one that depends on where the list came from: a Windows
list reads example.com as HostPattern::Exact, because that is what Windows
matches. parse::proxy_override has the readings.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
All
Matches every host: a bare * in the list disables proxying entirely.
Cidr(IpNet)
Matches any address inside an IP network.
Exact
Literal host, optionally port-restricted.
parse reaches it only for an address literal, but
parse::proxy_override reaches it for every bare
name: a bare entry in a Windows list matches that name and nothing under it.
Its Display is the name alone, which is also how a suffix
rule for the same domain is written. Reading that text back therefore gives this
variant through proxy_override and a Domain covering the
subdomains through parse::no_proxy — the same text,
two rules — so a pattern displayed and re-read through the other dialect widens.
Hold the value instead of its text if that matters.
Domain
Domain suffix (stored with a leading dot).
Fields
Wildcard
Windows-style glob with *.
A plain *.example.com is not one: it is the same rule as .example.com and parses
to Domain. A leading *. does reach this variant when the rest
still holds a glob (*.a*b.com), and so does the * this parse writes in front of a
leading-dot glob (.*.example.com is stored as *.*.example.com).
Matched as text against the destination’s canonical spelling, so a glob written
around a non-canonical address (*192.168.001.001, which arrives as 192.168.1.1)
matches nothing. Unlike the other variants, such a glob is not refused during
parsing and so does not reach BypassRules::rejected: * stands for the empty
string as well as for text, which leaves *10.0.0.1 live and every test that
separates the two cases open to a counterexample.
Fields
Local
Windows <local> / macOS ExcludeSimpleHostnames: any host name without a dot.
SubtractImplicit
Windows <-loopback>: the one entry that takes a bypass away instead of adding
one. It subtracts the implicit set — loopback and link-local, see
NO_LOOPBACK_TOKEN — from every entry written before it, and from none written
after it, which is why it is an entry in BypassRules::patterns and not a
switch beside them. BypassRules::matches has the evaluation order.
Implementations§
Source§impl HostPattern
impl HostPattern
Sourcepub fn parse(entry: &str) -> Result<Option<Self>, Error>
pub fn parse(entry: &str) -> Result<Option<Self>, Error>
Parse one bypass entry. Ok(None) for empty and for anything with no host left to
match on — :8080, ., .., *..
let p = HostPattern::parse("*.example.com").unwrap().unwrap();
assert!(matches!(p, HostPattern::Domain { match_self: false, .. }));A bare address entry is stored the way the destination side reads it, not the way it
was written: 010.0.0.1 is octal (8.0.0.1) and 192.168.1 is short-form
(192.168.0.1), because that is how the Host the destination carries would parse
the same text.
A CIDR entry does not follow that grammar, because it is not a host: ipnet reads
four decimal octets, so 010.0.0.0/8 is 10.0.0.0/8 — the block the writer meant,
but not the block the same text would denote as a destination — and 192.168.1/24
and 0x0a.0.0.0/8 are errors rather than addresses. What is shared is the mapped
reduction: ::ffff:10.0.0.0/104 is stored as 10.0.0.0/8, matching what
destinations 10.0.0.1 and [::ffff:10.0.0.1] both become.
§Errors
Error::InvalidBypassPattern for @, internal whitespace, a scheme:// prefix,
a character that cannot appear in a host name (WHATWG forbidden domain code points
not already rejected above), an empty label (a..b), a subdomain of an address
(.10.0.0.1), a name no destination could carry (example.123), bad CIDR /, bad
port, bad IPv6 brackets, or non-ASCII text with no punycode spelling.
Trait Implementations§
Source§impl Clone for HostPattern
impl Clone for HostPattern
Source§fn clone(&self) -> HostPattern
fn clone(&self) -> HostPattern
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for HostPattern
impl Debug for HostPattern
Source§impl Display for HostPattern
impl Display for HostPattern
impl Eq for HostPattern
Source§impl Hash for HostPattern
impl Hash for HostPattern
Source§impl PartialEq for HostPattern
impl PartialEq for HostPattern
impl StructuralPartialEq for HostPattern
Auto Trait Implementations§
impl Freeze for HostPattern
impl RefUnwindSafe for HostPattern
impl Send for HostPattern
impl Sync for HostPattern
impl Unpin for HostPattern
impl UnsafeUnpin for HostPattern
impl UnwindSafe for HostPattern
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.