#[non_exhaustive]pub enum ProxyMode {
Direct,
#[non_exhaustive] Manual {
per_scheme: HashMap<Scheme, ProxyEntry>,
bypass: BypassRules,
rejected: Vec<RejectedValue>,
},
#[non_exhaustive] Pac {
url: Url,
rejected: Vec<RejectedValue>,
},
#[non_exhaustive] PacInline {
script: String,
rejected: Vec<RejectedValue>,
},
WpadAutoDetect,
}Expand description
What a single configuration source says about proxying.
Hand-written Debug, because ProxyConfig’s is derived and would
otherwise print whatever this one does. What each variant withholds is not the same thing:
a Pac URL is printed, minus its userinfo — the location is what makes a
report actionable, and only the credentials are the secret — while a
PacInline body is withheld whole and stands in as length plus
hash, because a script is not a locator and any part of it may be one.
Manual delegates — ProxyEntry masks auth.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Direct
No proxy at all (Windows ProxyEnable=0, GNOME mode=none, macOS all
*Enable keys zero). This is the Default.
#[non_exhaustive]Manual
Static per-scheme proxies plus bypass rules.
Sealed, like the other variants that carry fields: build it with
ProxyMode::manual, which is what keeps the rejected list
and the per_scheme entries mirroring it in step — the constructor reads the list
back out of the map, so the two cannot be handed in disagreeing. The enum’s own
#[non_exhaustive] does not seal a variant — it only forces a _ arm in a match —
so without this a caller could assemble a Manual whose two halves disagree, and
resolve answers from the mirror. (Not linked: resolve is behind its own feature,
and this variant is not.)
Fields
This variant is marked as non-exhaustive
per_scheme: HashMap<Scheme, ProxyEntry>Per-scheme proxy entries.
bypass: BypassRulesBypass rules.
rejected: Vec<RejectedValue>Fail-open drops (redacted); opposite of BypassRules::rejected.
#[non_exhaustive]Pac
PAC script at a URL (fetch/evaluate via pac / resolve_with_pac).
Sealed; build it with ProxyMode::pac.
Fields
This variant is marked as non-exhaustive
rejected: Vec<RejectedValue>Fail-open drops (redacted), as in Manual — a source can
reach a PAC answer having already lost an unrelated key on the way to it. There
is no per_scheme to mirror them into here, so they are reachable only through
ProxyMode::rejected.
#[non_exhaustive]PacInline
Inline PAC script body.
Sealed; build it with ProxyMode::pac_inline.
Fields
This variant is marked as non-exhaustive
rejected: Vec<RejectedValue>Fail-open drops (redacted); see Pac’s field of the same name.
WpadAutoDetect
WPAD enabled (no DHCP/DNS probe in this crate).
Not sealed, and neither is Direct: a sealed unit variant
cannot be named by another crate, not merely constructed by one, so sealing these
two would cost every caller mode == ProxyMode::Direct. Direct could not be
sealed in any case — it is this enum’s Default, and a default variant must be
exhaustive. Neither carries fields, and neither ever will: a backend that dropped a
setting answers Manual so the record has somewhere to go
(proxy_dict.rs’ “reject-only stays Manual”), which is why the pair that cannot
be sealed is also the pair with nothing to add.
Implementations§
Source§impl ProxyMode
impl ProxyMode
Sourcepub fn manual(
per_scheme: HashMap<Scheme, ProxyEntry>,
bypass: BypassRules,
) -> Self
pub fn manual( per_scheme: HashMap<Scheme, ProxyEntry>, bypass: BypassRules, ) -> Self
Build a ProxyMode::Manual value, taking the
rejected list from whatever drops per_scheme already holds.
Empty for the map a backend builds, which records its drops separately and attaches
them with with_rejected (private) once the map is complete. It is a caller filtering
or merging a parsed Manual that hands one back already carrying
ProxyEntry::Unusable entries, because that is where with_rejected put them, and
the list has to be recovered from there rather than left empty — an empty list beside
a lookup that answers Unusable says nothing was lost about a request that cannot be
routed. Read in Scheme::ALL’s order, not the map’s, which is seeded per instance.
A record that named no scheme was never in the map and cannot come back this way.
Sourcepub fn pac(url: Url) -> Self
pub fn pac(url: Url) -> Self
Build a ProxyMode::Pac value with an empty rejected list.
Sourcepub fn pac_inline(script: String) -> Self
pub fn pac_inline(script: String) -> Self
Build a ProxyMode::PacInline value with an empty rejected list.
Sourcepub fn bypass(&self) -> Option<&BypassRules>
pub fn bypass(&self) -> Option<&BypassRules>
The bypass rules, when the mode has any.
Sourcepub fn rejected(&self) -> Option<&[RejectedValue]>
pub fn rejected(&self) -> Option<&[RejectedValue]>
The redacted text of every scheme-endpoint entry the source dropped, when the
mode has any. See ProxyMode::Manual’s rejected field for what this
records and why.
Sourcepub fn entry_for(&self, scheme: Scheme) -> Option<&ProxyEntry>
pub fn entry_for(&self, scheme: Scheme) -> Option<&ProxyEntry>
Entry for scheme. Concrete schemes beat Scheme::All; All has no fallback.
None outside Manual or with no entry; Some(Disabled) suppresses All.
Unusable does not: a drop is the last resort, so a live
All still answers and the record surfaces only when nothing else covers scheme.
Backends may substitute before the map is built (macOS SOCKS fallback, Windows
socks= fill) — this applies to the finished map.
Sourcepub fn endpoint_for(&self, scheme: Scheme) -> Option<&ProxyEndpoint>
pub fn endpoint_for(&self, scheme: Scheme) -> Option<&ProxyEndpoint>
The proxy endpoint that applies to scheme, or None.
None is “no endpoint to hand out”. Inside Manual that is
direct access when nothing covers the scheme and when what does is
Disabled — but not when it is
Unusable, a setting that was lost rather than an answer,
which resolve reports as
Error::ProxyEntryUnusable. A caller that has to
tell those two apart asks entry_for, which is the same lookup
with the entry left intact. Every other mode returns None for every scheme,
including the PAC and WPAD ones that keep their answer in a script this method cannot
run; that is Error::PacNotSupported, not direct.
let per_scheme = parse::proxy_server("http=a:8080;https=b:8443");
let mode = ProxyMode::manual(per_scheme, BypassRules::new());
assert_eq!(mode.endpoint_for(Scheme::Http).unwrap().port, 8080);
// No `ftp=` and no catch-all entry: nothing applies.
assert!(mode.endpoint_for(Scheme::Ftp).is_none());Sourcepub fn websocket_entry(&self) -> Option<&ProxyEntry>
pub fn websocket_entry(&self) -> Option<&ProxyEntry>
Entry for ws/wss: socks → https → http (RFC 6455 §4.1.3, as Chromium reads it),
then all — a step this crate adds.
Unlike entry_for, intermediate Disabled entries do not stop
the chain — only terminal Scheme::All is returned as-is (e.g. empty all_proxy=).
An intermediate Unusable does not stop it either, but is
remembered, and the earliest one is the answer when no step has a real one.
// Only `socks=` and `http=`: the WebSocket chain prefers the SOCKS proxy.
let per_scheme = parse::proxy_server("http=h:80;socks=s:1080");
let mode = ProxyMode::manual(per_scheme, BypassRules::new());
assert_eq!(mode.websocket_endpoint().unwrap().authority(), "s:1080");
// `https=` explicitly disabled: the chain keeps going to `http=` rather than
// stopping the way `entry_for(Scheme::Https)` would for an actual `https`
// request.
let per_scheme = parse::proxy_server("https=;http=h:80");
let mode = ProxyMode::manual(per_scheme, BypassRules::new());
assert_eq!(mode.websocket_endpoint().unwrap().authority(), "h:80");Sourcepub fn websocket_endpoint(&self) -> Option<&ProxyEndpoint>
pub fn websocket_endpoint(&self) -> Option<&ProxyEndpoint>
The proxy endpoint for a ws:///wss:// request; see
websocket_entry for the resolution order.
Trait Implementations§
impl Eq for ProxyMode
impl StructuralPartialEq for ProxyMode
Auto Trait Implementations§
impl Freeze for ProxyMode
impl RefUnwindSafe for ProxyMode
impl Send for ProxyMode
impl Sync for ProxyMode
impl Unpin for ProxyMode
impl UnsafeUnpin for ProxyMode
impl UnwindSafe for ProxyMode
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.