4个版本 (2个重大更新)
0.3.0 | 2020年12月30日 |
---|---|
0.2.1 | 2020年5月27日 |
0.2.0 | 2020年5月20日 |
0.1.0 | 2020年5月11日 |
#1002 在 HTTP服务器
140KB
3K SLoC
tophat
一个小巧、实用且灵活的异步HTTP服务器库。目前处于测试阶段。
Cargo.toml
tophat = "0.3.0"
目标是低级别并且足够小巧,以便与不同的异步运行时一起工作,而不强加用户架构,同时提供足够的便利函数,以便轻松构建REST API。更像是库而不是框架。
此外,这个
async fn handler<W>(_req: Request, resp_wtr: ResponseWriter<W>) -> Result<ResponseWritten, Glitch>
where W: AsyncRead + AsyncWrite + Clone + Send + Sync + Unpin + 'static,
{
// Default `send` is 200 OK
let done = resp_wtr.send()?;
// Do things here after resp is written, if you like
Ok(done)
}
而不是
async fn handler(req:Request) -> Result<Response, Error> {
Ok(Response::empty())
}
不要被泛型和特质边界吓倒!它们不会咬人!(可能吧)
特性
- HTTP/1.1
- 与实现了
futures::{AsyncRead, AsyncWrite}
的任何TCP流一起工作。 - 所有依赖都独立于异步生态系统。
- 不是框架;最小化抽象。
- #[deny(unsafe_code)]
- 足够快。
- 路由器
features = ["router"]
,非常简单。 - Cors
features = ["cors"]
。 - 身份
features = ["identity"]
。 - 通过在路由器之前使用函数来提供“中间件”功能。
- 使用
Glitch
和GlitchExt
便利地处理错误和响应,以便方便地将它们连接到Result
和Option
。 - 丰富的示例。
- 最小客户端(目前未在积极开发中)
正确处理HTTP协议是首要任务。
示例
使用 smol
作为异步运行时。示例是单线程的,有关如何创建多线程执行器的信息,请参阅 smol
文档。
use smol::{Async, Task};
use std::net::TcpListener;
use async_dup::Arc;
use tophat::server::accept;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let listener = Async::<TcpListener>::bind("127.0.0.1:9999")?;
smol::run(async {
loop {
let (stream, _) = listener.accept().await?;
let stream = Arc::new(stream);
let task = Task::spawn(async move {
let serve = accept(stream, |_req, resp_wtr| async {
resp_wtr.send().await
}).await;
if let Err(err) = serve {
eprintln!("Error: {}", err);
}
});
task.detach();
}
})
}
哲学
我不会认为这是一个包含电池的框架,它试图让每一步都变得容易。确实有一些便利之处,但总的来说,tophat相当简约。对于那些不喜欢模板代码的人来说,另一个框架可能更适用。tophat的用户需要熟悉异步运行时、设置TCP流、Arc
、特质、泛型等。tophat不会手把手教你。
作为交换,tophat提供了更高的透明度和更多的控制。tophat不会强制规定你的应用程序结构,它应该与你的架构很好地协同工作。
如果你想知道tophat在底层做了什么,代码旨在简单直接(希望这也导致更好的编译时间!)。
灵感来源
我之所以写tophat,是因为
- 我想要一个不依赖于异步生态系统的异步HTTPS服务器,并且
- 我看到了这个GitHub问题,关于使用
ResponseWriter
而不是返回Response
:[链接](https://github.com/hyperium/hyper/issues/2181)
感谢
特别感谢async-h1,我欣赏其结构和设计的眼光,tophat就是从其代码库构建的。还要感谢hyper,其致力于性能和正确性的奉献精神令人鼓舞,tophat还采用了其基本的HTTP库。
许可证
在以下任一许可证下发布:
- Apache License, Version 2.0, ([Apache许可证](https://github.com/hwchen/tophat/blob/2a0ba6b30f5ec384a1e3c04f4b24c86bc46ddde5/LICENSE-APACHE) 或 [Apache许可证](https://apache.ac.cn/licenses/LICENSE-2.0))
- MIT许可证 ([MIT许可证](https://github.com/hwchen/tophat/blob/2a0ba6b30f5ec384a1e3c04f4b24c86bc46ddde5/LICENSE-MIT) 或 [MIT许可证](http://opensource.org/licenses/MIT))
任由您选择。
依赖关系
~2.4–7MB
~132K SLoC