#async-http #http #http-request #pragmatic #flexible #low-level

tophat

一个小巧、实用且灵活的异步HTTP服务器

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日

#1002HTTP服务器

MIT/Apache

140KB
3K SLoC

tophat

Released API docs CI

一个小巧、实用且灵活的异步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"]
  • 通过在路由器之前使用函数来提供“中间件”功能。
  • 使用 GlitchGlitchExt 便利地处理错误和响应,以便方便地将它们连接到 ResultOption
  • 丰富的示例。
  • 最小客户端(目前未在积极开发中)

正确处理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