15 个版本
0.3.0 | 2024 年 6 月 15 日 |
---|---|
0.2.0 | 2020 年 7 月 6 日 |
0.1.12 | 2019 年 12 月 5 日 |
0.1.11 | 2019 年 8 月 18 日 |
0.1.8 | 2018 年 7 月 21 日 |
#259 in HTTP 服务器
每月 48 次下载
用于 4 crates
73KB
1.5K SLoC
fibers_http_server
Rust 的一个小巧 HTTP/1.1 服务器框架。
示例
use std::io::{Read, Write};
use std::net::TcpStream;
use std::thread;
use std::time::Duration;
use bytecodec::bytes::Utf8Encoder;
use bytecodec::value::NullDecoder;
use fibers::{Executor, Spawn, InPlaceExecutor};
use fibers_http_server::{HandleRequest, Reply, Req, Res, ServerBuilder, Status};
use futures::future::{ok, Future};
use httpcodec::{BodyDecoder, BodyEncoder};
// Request handler
struct Hello;
impl HandleRequest for Hello {
const METHOD: &'static str = "GET";
const PATH: &'static str = "/hello";
type ReqBody = ();
type ResBody = String;
type Decoder = BodyDecoder<NullDecoder>;
type Encoder = BodyEncoder<Utf8Encoder>;
type Reply = Reply<Self::ResBody>;
fn handle_request(&self, _req: Req<Self::ReqBody>) -> Self::Reply {
Box::new(ok(Res::new(Status::Ok, "hello".to_owned())))
}
}
let addr = "127.0.0.1:14758".parse().unwrap();
// HTTP server
thread::spawn(move || {
let executor = InPlaceExecutor::new().unwrap();
let mut builder = ServerBuilder::new(addr);
builder.add_handler(Hello).unwrap();
let server = builder.finish(executor.handle());
executor.spawn(server.map_err(|e| panic!("{}", e)));
executor.run().unwrap()
});
thread::sleep(Duration::from_millis(100));
// HTTP client
let mut client = TcpStream::connect(addr).unwrap();
client
.write_all(b"GET /hello HTTP/1.1\r\nContent-Length: 0\r\n\r\n")
.unwrap();
thread::sleep(Duration::from_millis(100));
let mut buf = [0; 1024];
let size = client.read(&mut buf).unwrap();
assert_eq!(
&buf[..size],
b"HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\nhello".as_ref()
);
依赖项
~5MB
~121K SLoC