【发布时间】:2017-09-11 05:04:35
【问题描述】:
我想使用 Hyper 的当前 master 分支编写一个服务器,它保存由 POST 请求传递的消息并将该消息发送到每个传入的 GET 请求。
我有这个,主要是从 Hyper 示例目录中复制的:
extern crate futures;
extern crate hyper;
extern crate pretty_env_logger;
use futures::future::FutureResult;
use hyper::{Get, Post, StatusCode};
use hyper::header::{ContentLength};
use hyper::server::{Http, Service, Request, Response};
use futures::Stream;
struct Echo {
data: Vec<u8>,
}
impl Echo {
fn new() -> Self {
Echo {
data: "text".into(),
}
}
}
impl Service for Echo {
type Request = Request;
type Response = Response;
type Error = hyper::Error;
type Future = FutureResult<Response, hyper::Error>;
fn call(&self, req: Self::Request) -> Self::Future {
let resp = match (req.method(), req.path()) {
(&Get, "/") | (&Get, "/echo") => {
Response::new()
.with_header(ContentLength(self.data.len() as u64))
.with_body(self.data.clone())
},
(&Post, "/") => {
//self.data.clear(); // argh. &self is not mutable :(
// even if it was mutable... how to put the entire body into it?
//req.body().fold(...) ?
let mut res = Response::new();
if let Some(len) = req.headers().get::<ContentLength>() {
res.headers_mut().set(ContentLength(0));
}
res.with_body(req.body())
},
_ => {
Response::new()
.with_status(StatusCode::NotFound)
}
};
futures::future::ok(resp)
}
}
fn main() {
pretty_env_logger::init().unwrap();
let addr = "127.0.0.1:12346".parse().unwrap();
let server = Http::new().bind(&addr, || Ok(Echo::new())).unwrap();
println!("Listening on http://{} with 1 thread.", server.local_addr().unwrap());
server.run().unwrap();
}
如何将req.body()(似乎是Chunks 的Stream)变成Vec<u8>?我假设我必须以某种方式返回一个消耗Stream 的Future 并将其转换为单个Vec<u8>,也许还有fold()。但我不知道该怎么做。
【问题讨论】:
-
How to share mutable state for a Hyper handler? 回答了你一半的问题,所以我重新措辞了你的问题,以专注于独特的方面并帮助避免投票。
-
感谢您的第一次编辑@Shepmaster。在那之后,它看起来真的很精致。但是,我不喜欢您的第二次编辑。我看不到链接的问题如何回答我的问题。他们甚至没有实现特征服务。
-
您始终可以从revision list 回滚您不同意的任何编辑或执行进一步的编辑。
-
好的,那我就为第一个问题开一个新问题。谢谢。
-
听起来不错。在这种情况下,我还建议您创建一个minimal reproducible example 并使用 Hyper 的发布版本。链接到我上面建议的问题并说明为什么它对您的案例无效也将大有帮助!
标签: rust hyper rust-tokio