Как использовать HTTP-прокси с асинхронным Hyper 0.11 в Rust?

Как отправить HTTP-запрос через прокси с Hyper 0.11? У меня есть следующий рабочий код, который отправляет HTTP-запрос без прокси:

extern crate hyper;
extern crate tokio_core;
extern crate futures;

use futures::Future;
use hyper::Client;
use tokio_core::reactor::Core;

fn main() {
    let mut core = Core::new().unwrap();
    let client = Client::new(&core.handle());

    let uri = "http://stackoverflow.com".parse().unwrap();
    let work = client.get(uri).map(|res| {
        res.status()
    });

    match core.run(work) {
        Ok(status) => println!("Status: {}", status),
        Err(e) => println!("Error: {:?}", e)
    }
}

Это не дубликат Как перейти на сайт HTTPS через прокси с Hyper?, потому что я спрашиваю о новой версии Hyper 0.11, которая имеет совершенно другой API, несовместимый с предыдущими версиями.


person Sergey Potapov    schedule 26.07.2017    source источник
comment
Вы, вероятно, найдете много вдохновения в отдельном интерфейсе авторов более высокого уровня, созданном на основе Hyper 0.11, который называется reqwest github.com/seanmonstar/reqwest/blob/master/src/proxy.rs   -  person softprops    schedule 08.08.2017
comment
Сергей, может помочь приведенный выше пример?   -  person Mario Idival    schedule 17.01.2018
comment
Я изобиловал этой темой и еще не пробовал их.   -  person Sergey Potapov    schedule 20.01.2018


Ответы (1)


Вы можете использовать метод Client::configure() для создания соединителя прокси, а затем создать его с помощью handle, см. Фрагмент кода ниже.

let handle = core.handle();
let proxy = {
    let proxy_uri ="http://<your proxy>:port".parse().unwrap();
    let mut proxy = Proxy::new(Intercept::All, proxy_uri);
    proxy.set_authorization(Basic{
        username: "your username",
        password: Some("your passwd"),
    }); 
    let http_connector = HttpConnector::new(4, &handle);
    ProxyConnector::from_proxy(http_connector, proxy).unwrap()
};
let client = Client::configure().connector(proxy).build(&handle)

Теперь вы можете использовать объект client для выполнения любых вызовов REST.

person Fei    schedule 09.02.2019