14 个版本
0.5.0-beta.2 | 2024 年 7 月 6 日 |
---|---|
0.4.4 | 2023 年 11 月 8 日 |
0.4.3 | 2022 年 10 月 12 日 |
0.4.2 | 2021 年 9 月 27 日 |
0.2.0 | 2019 年 12 月 29 日 |
在 构建工具 中排名 77
每月下载 149 次
53KB
789 行
web-static-pack
web-static-pack 是 web-static-pack 项目中的 "loader"(第二阶段)部分。查看项目页面以了解两个部分如何协作。
使用 web-static-pack-packer 和构建脚本 / CI / build.rs 创建 pack
后,通常会将它包含在您的目标应用程序中,使用 https://docs.rs/include_bytes_aligned/latest/include_bytes_aligned/。然后,它将通过 loader::load 加载,利用零拷贝反序列化(因此文件内容将直接从可执行文件内容发送)。然后,该打包文件可能被包装在 responder::Responder http 服务中,并与 hyper 等网络服务器一起使用。
此 crate 的主要部分是 responder::Responder。其 responder::Responder::respond_flatten 方法创建了一个 [http] 服务 - 一个接收 http::Request 部分的功能(方法、路径、头部)并返回 http::Response。
要创建 responder::Responder,需要一个 common::pack::Pack。它可以通过传递由打包器创建的 pack
的内容(可能包含在二进制文件中)通过 loader::load 函数获得。
示例
创建和调用 responder
use anyhow::Error;
use include_bytes_aligned::include_bytes_aligned;
use http::{HeaderMap, Method, StatusCode};
use web_static_pack::{loader::load, responder::Responder};
// assume we have a vcard-personal-portfolio.pack available from packer examples
static PACK_ARCHIVED_SERIALIZED: &[u8] =
include_bytes_aligned!(16, "vcard-personal-portfolio.pack");
fn main() -> Result<(), Error> {
// load (map / cast) [common::pack::PackArchived] from included bytes
let pack_archived = unsafe { load(PACK_ARCHIVED_SERIALIZED).unwrap() };
// create a responder from `pack`
let responder = Responder::new(pack_archived);
// do some checks on the responder
assert_eq!(
responder.respond_flatten(
&Method::GET,
"/present",
&HeaderMap::default(),
).status(),
StatusCode::OK
);
Ok(())
}
适配 hyper 服务
本示例基于https://hyper.rs/guides/1/server/graceful-shutdown/,这个指南稍微有点复杂。
您可以从tests/examples/vcard_personal_portfolio_server.rs
运行完整的示例。
use anyhow::Error;
use web_static_pack::responder::Responder;
use std::{
convert::Infallible,
mem::transmute,
};
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Error> {
// lets assume we have a `responder: Responder` object available from previous example
// hyper requires service to be static
// we use graceful, no connections will outlive server function
let responder = unsafe {
transmute::<
&Responder<'_, _>,
&Responder<'static, _>,
>(&responder)
};
// make hyper service
let service_fn = service_fn(|request: Request<Incoming>| async {
// you can probably filter your /api requests here
let (parts, _body) = request.into_parts();
let response = responder.respond_flatten(
&parts.method,
parts.uri.path(),
&parts.headers
);
Ok::<_, Infallible>(response)
});
// use service_fn like in hyper example
Ok(())
}
许可证:MIT
依赖项
约3MB
约67K SLoC