Struct ProxyFactory

Source
pub struct ProxyFactory(/* private fields */);
Expand description

A ProxyFactory is used to query the system for potential proxies to use in order to reach a given URL.

A ProxyFactory should be kept around as long as possible as it contains cached data to increase performance. Memory usage should be minimal (cache is small) and the cache lifespan is handled automatically.

Implementations§

Source§

impl ProxyFactory

Source

pub fn new() -> Option<ProxyFactory>

Creates a new ProxyFactory.

Examples found in repository?
examples/proxy.rs (line 14)
7fn main() {
8    let mut args = std::env::args();
9    if args.len() != 2 {
10        println!("Usage: proxy <url>");
11        return;
12    }
13
14    let factory = ProxyFactory::new().unwrap();
15
16    for proxy in factory.get_proxies(&args.nth(1).unwrap()).unwrap() {
17        print!("{} ", proxy);
18    }
19    println!();
20}
Source

pub fn get_proxies(&self, url: &str) -> Result<Vec<String>, Error>

Get which proxies to use for the specified URL.

If the first proxy fails, the second should be tried, etc…

This method always blocks. In most cases, the time required to complete this function call is simply the time required to read the configuration (i.e. from gconf, kconfig, etc).

In the case of PAC, if no valid PAC is found in the cache (i.e. configuration has changed, cache is invalid, etc), the PAC file is downloaded and inserted into the cache. This is the most expensive operation as the PAC is retrieved over the network. Once a PAC exists in the cache, it is merely a javascript invocation to evaluate the PAC. One should note that DNS can be called from within a PAC during javascript invocation.

In the case of WPAD, WPAD is used to automatically locate a PAC on the network. Currently, we only use DNS for this, but other methods may be implemented in the future. Once the PAC is located, normal PAC performance (described above) applies.

The format of the returned proxy strings are as follows:

  • http://[username:password@]proxy:port
  • socks://[username:password@]proxy:port
  • socks5://[username:password@]proxy:port
  • socks4://[username:password@]proxy:port
  • <procotol>://[username:password@]proxy:port
  • direct://

Please note that the username and password in the above URLs are optional and should be use to authenticate the connection if present.

For SOCKS proxies, when the protocol version is specified (socks4:// or sock5://), it is expected that only this version is used. When only socks:// is set, the client MUST try SOCKS version 5 protocol and, on connection failure, fallback to SOCKS version 4.

Other proxying protocols may exist. It is expected that the returned configuration scheme shall match the network service name of the proxy protocol or the service name of the protocol being proxied if the previous does not exist. As an example, on Mac OS X you can configure a RTSP streaming proxy. The expected returned configuration would be:

  • rtsp://[username:password@]proxy:port

Example:

let url = "http://example.com/";
let factory = ProxyFactory::new().unwrap();

println!("Proxies to try for {:?}:", url);
for proxy in &factory.get_proxies(url).unwrap() {
    println!(" * {:?}", proxy);
}
Examples found in repository?
examples/proxy.rs (line 16)
7fn main() {
8    let mut args = std::env::args();
9    if args.len() != 2 {
10        println!("Usage: proxy <url>");
11        return;
12    }
13
14    let factory = ProxyFactory::new().unwrap();
15
16    for proxy in factory.get_proxies(&args.nth(1).unwrap()).unwrap() {
17        print!("{} ", proxy);
18    }
19    println!();
20}
Source

pub fn get_proxies_raw( &self, url: &CStr, ) -> Result<Proxies, ProxyResolutionError>

Get which proxies to use for the specified URL.

This is the lower-level version of get_proxies. Instead of allocating a Vec like get_proxies, it returns a wrapper type that allows safe access to the array returned by the C API.

Example:

let url = CString::new("http://example.com/").unwrap();
let factory = ProxyFactory::new().unwrap();

println!("Proxies to try for {:?}:", url);
for proxy in &factory.get_proxies_raw(&url).unwrap() {
    println!(" * {:?}", proxy.as_c_str());
}

Trait Implementations§

Source§

impl Drop for ProxyFactory

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl Send for ProxyFactory

Source§

impl Sync for ProxyFactory

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<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.