Skip to main content

ProxyMode

Enum ProxyMode 

Source
#[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
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

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
Non-exhaustive enum variants could have additional fields added in future. Therefore, non-exhaustive enum variants cannot be constructed in external crates and cannot be matched against.
§per_scheme: HashMap<Scheme, ProxyEntry>

Per-scheme proxy entries.

§bypass: BypassRules

Bypass 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
Non-exhaustive enum variants could have additional fields added in future. Therefore, non-exhaustive enum variants cannot be constructed in external crates and cannot be matched against.
§url: Url

Script URL.

§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
Non-exhaustive enum variants could have additional fields added in future. Therefore, non-exhaustive enum variants cannot be constructed in external crates and cannot be matched against.
§script: String

JavaScript source.

§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

Source

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.

Source

pub fn pac(url: Url) -> Self

Build a ProxyMode::Pac value with an empty rejected list.

Source

pub fn pac_inline(script: String) -> Self

Build a ProxyMode::PacInline value with an empty rejected list.

Source

pub fn is_direct(&self) -> bool

Whether the mode means “connect directly”.

Source

pub fn bypass(&self) -> Option<&BypassRules>

The bypass rules, when the mode has any.

Source

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.

Source

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.

Source

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());
Source

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");
Source

pub fn websocket_endpoint(&self) -> Option<&ProxyEndpoint>

The proxy endpoint for a ws:///wss:// request; see websocket_entry for the resolution order.

Trait Implementations§

Source§

impl Clone for ProxyMode

Source§

fn clone(&self) -> ProxyMode

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ProxyMode

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ProxyMode

Source§

fn default() -> ProxyMode

Returns the “default value” for a type. Read more
Source§

impl Eq for ProxyMode

Source§

impl PartialEq for ProxyMode

Source§

fn eq(&self, other: &ProxyMode) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for ProxyMode

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more