我正试图通过迁移到:]来重写example书的代理Asynchronous Programming in Rust。>
futures-preview = { version = "0.3.0-alpha.19", features = ["async-await"]}` hyper = "0.13.0-alpha.4"`
来自:
futures-preview = { version = "=0.3.0-alpha.17", features = ["compat"] }` hyper = "0.12.9"
当前示例将返回的
Future
从futures 0.3
转换为futures 0.1
,因为hyper = "0.12.9"
与futures 0.3
的异步/等待不兼容。
我的代码:
use { futures::future::{FutureExt, TryFutureExt}, hyper::{ rt::run, service::{make_service_fn, service_fn}, Body, Client, Error, Request, Response, Server, Uri, }, std::net::SocketAddr, std::str::FromStr, }; fn forward_uri<B>(forward_url: &'static str, req: &Request<B>) -> Uri { let forward_uri = match req.uri().query() { Some(query) => format!("{}{}?{}", forward_url, req.uri().path(), query), None => format!("{}{}", forward_url, req.uri().path()), }; Uri::from_str(forward_uri.as_str()).unwrap() } async fn call( forward_url: &'static str, mut _req: Request<Body>, ) -> Result<Response<Body>, hyper::Error> { *_req.uri_mut() = forward_uri(forward_url, &_req); let url_str = forward_uri(forward_url, &_req); let res = Client::new().get(url_str).await; res } async fn run_server(forward_url: &'static str, addr: SocketAddr) { let forwarded_url = forward_url; let serve_future = service_fn(move |req| call(forwarded_url, req).boxed()); let server = Server::bind(&addr).serve(serve_future); if let Err(err) = server.await { eprintln!("server error: {}", err); } } fn main() { // Set the address to run our socket on. let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); let url = "http://127.0.0.1:9061"; let futures_03_future = run_server(url, addr); run(futures_03_future); }
首先,我在
server
函数中收到有关run_server
的错误:
特征
tower_service::Service<&'a hyper::server::tcp::addr_stream::AddrStream>
未实现hyper::service::service::ServiceFn<[closure@src/main.rs:35:35: 35:78 forwarded_url:_], hyper::body::body::Body>
而且,我不能使用
hyper::rt::run
,因为它可能在hyper = 0.13.0-alpha.4
中以不同的方式实现。
如果您告诉我您如何解决它的想法,我将不胜感激。
我正在尝试通过迁移到以下脚本来重写Rust本书中的异步编程的代理示例:futures-preview = {version =“ 0.3.0-alpha.19”,features = [“ async-await”]}`hyper = “ 0.13.0-alpha ....
通过此issue,要为每个连接创建新服务,您需要在MakeService中创建hyper = "0.13.0-alpha.4"
。您可以使用MakeService
创建带闭合的make_service_fn
。