#hyper-server #static #hyper #resources #http #web-apps #web-server

nightly build web-static-pack

将静态资源(GUI、资产、图像、样式、html)嵌入可执行文件。可以使用 hyper 或您选择的任何服务器进行服务。

14 个版本

0.5.0-beta.22024 年 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

Download history 2/week @ 2024-06-01 2/week @ 2024-06-15 31/week @ 2024-06-29 124/week @ 2024-07-06 6/week @ 2024-07-13 75/week @ 2024-07-27 26/week @ 2024-08-03 48/week @ 2024-08-10

每月下载 149

MIT 许可证

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