#[non_exhaustive]pub enum Error {
Show 15 variants
InvalidProxyServer {
input: String,
reason: String,
},
InvalidBypassPattern {
input: String,
reason: String,
},
InvalidProxyUrl {
input: String,
source: ParseError,
},
UnsupportedProxyScheme(String),
CgiHttpProxy {
variable: String,
},
Io {
context: String,
source: Error,
},
Sandboxed {
sandbox: String,
reason: String,
},
Unsupported,
PacNotSupported {
mode: &'static str,
},
ProxyEntryUnusable {
scheme: Scheme,
rejected: RejectedValue,
},
PacFetchRequired {
url: Url,
},
PacEvaluation {
reason: String,
},
PacTimeout {
timeout: Duration,
},
PacInvalidResult {
result: String,
},
PacEngineUnavailable,
}Expand description
Errors from reading OS proxy configuration, and from routing a URL through what was read.
#[non_exhaustive]. No #[from] io::Error — I/O is always wrapped with context.
Hand-written Debug: PacFetchRequired’s url::Url
would print credentials; other payloads are masked at construction or safe.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
InvalidProxyServer
A Windows ProxyServer style specification could not be parsed.
Fields
InvalidBypassPattern
A single bypass / no_proxy / ProxyOverride entry could not be parsed.
Fields
input: StringOffending entry, masked like InvalidProxyServer’s.
InvalidProxyUrl
An AutoConfigURL-style setting read from the OS is malformed.
Not the environment: *_proxy values go through
ProxyEndpoint::parse, which answers with
InvalidProxyServer instead.
Fields
input: StringOffending input, masked like InvalidProxyServer’s.
source: ParseErrorUnderlying parse error.
UnsupportedProxyScheme(String)
The proxy URL carried a scheme this crate does not understand.
Recognised schemes are listed on ProxyScheme.
CgiHttpProxy
http_proxy under CGI: a non-empty REQUEST_METHOD ⇒ forged Proxy: header
(httpoxy, CVE-2016-5385). Refused like Go’s httpproxy; not applied to
https_proxy/no_proxy, whose names no request header can produce.
KDE’s ProxyType = 4 raises the same error on a wider rule, because there the
file names the variable each slot reads: any name a request header could have set
— RFC 3875 §4.1.18’s HTTP_ prefix — is refused whichever slot named it, including
the one holding the bypass list. variable is that name as written.
Io
An I/O failure, annotated with the operation that caused it.
OS error codes are carried as std::io::Error, built by from_raw_os_error.
Fields
Sandboxed
Linux sandbox: desktop settings unreadable (Flatpak without dconf → keyfile defaults). Portal fallback when possible; else this error — not a false Direct.
Unsupported
No store to read. Off Windows/macOS/Linux there is no backend at all; on Linux it is
a reading and not a property of the build — neither desktop store answered, which
both desktop features being off guarantees and which a build with one of them on also
reaches whenever the schema and kioslaverc are both missing from the machine.
Not the answer inside a sandbox: that route is chosen before either store is
consulted and reports Sandboxed, including when the feature that
would carry the portal fallback is off.
PacNotSupported
resolve() needs PAC/WPAD evaluation (resolve_with_pac / pac feature).
Deliberately an error, not silent Direct.
resolve_with_pac answers with it too, for
WpadAutoDetect handed no script body:
discovery is a non-goal, so the fix there is to supply the script rather than to
change entry point. mode is "wpad" either way and does not tell the two apart.
ProxyEntryUnusable
The system configured a proxy for this scheme, the value could not be used, and no other entry covers it.
Returning ProxyStep::Direct here would assert something
the platform does not do: KDE expands a [$e] value from the session environment and
proxies the request, and this crate deliberately does not expand it. Only a scheme
with no catch-all reaches this — a live socksProxy covers the drop first, exactly as
Chromium’s fallback_proxies does. Where this reports, Chromium goes direct instead:
its ProxyList::AddProxyChain drops a malformed entry with “Silently discard
malformed inputs”, leaving MapUrlSchemeToProxyList to answer nullptr.
Fields
scheme: SchemeWhich requests lost an answer — read off the drop’s own attribution, not off the
slot it was found under. In every mode this crate builds the two are the same
value, because each backend files its record against the slot it dropped, so this
is the slot, and the slot is what decides coverage rather than the request’s own
scheme: a lost catch-all reports Scheme::All whatever was asked for, and a
ws/wss request reports whichever of the chain it lost. A caller who hands
ProxyMode::manual a record attributed to one scheme
under the key of another gets the attribution back rather than the key. Nothing
normalises the pair: the record is the caller’s, and the same value is what
ProxyMode::rejected hands back.
rejected: RejectedValueFirst drop naming that scheme; masked at construction. The rest stay reachable
through ProxyMode::rejected on the mode this
error was resolved against, which is the caller’s own config.effective
wherever the caller supplied it. Where a resolver builds a mode of its own it is
not: WinHttpPacResolver::resolve_config answers a WPAD miss by re-reading the
registry into a Manual and resolving against that, and the mode goes out of
scope with the call while the caller still holds WpadAutoDetect, which has no
list. This field is what survives that.
PacFetchRequired
resolve_with_pac + ProxyMode::Pac without script body.
Fetch is caller’s job; url stored verbatim, masked only in {}/{:?}.
PacEvaluation
PAC run failed (syntax, throw, limits). reason masked/sanitized at construction.
PacTimeout
Evaluating a PAC script overran PacPolicy::timeout.
PacInvalidResult
FindProxyForURL returned nothing usable (malformed candidates skipped first).
result masked at construction.
pac on but no engine (pac-boa or a custom pac::PacEvaluator).
Not linked: the item exists only with the pac feature on, and this variant does not.
Trait Implementations§
Source§impl Error for Error
impl Error for Error
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()
Auto Trait Implementations§
impl !RefUnwindSafe for Error
impl !UnwindSafe for Error
impl Freeze for Error
impl Send for Error
impl Sync for Error
impl Unpin for Error
impl UnsafeUnpin for Error
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
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.