24个版本 (8个破坏性版本)
0.10.1 | 2024年8月9日 |
---|---|
0.9.2 | 2024年7月14日 |
0.4.3 | 2024年3月31日 |
#229 在 HTTP服务器
每月210 次下载
82KB
2K SLoC
zip_static_handler
HTTP处理器实现,用于从zip存档中提供静态内容。
处理器约定
这些约定源于一个可能具有争议的观点。
页面文档的URL不应包含文件扩展名,也不应有尾随斜杠。
/about
而不是/about/
、/about.html
、/about.php
或/about.md
。- 关于
/about
指向HTML文件还是目录索引的技术选择应该是透明的。
推导出的约定
-
HTML文件以没有
.html
前缀的方式提供服务。 -
除了根目录外没有目录索引
/index.html
作为//domain.tld
提供服务
删除尾随斜杠的决定与目录索引不兼容,因为在索引文件中,你期望相对链接引用同一目录。然而,没有尾随斜杠,它们将引用父目录。
(预)压缩
可压缩的内容类型可以通过在zip存档中包含文件的压缩版本来预压缩。仅支持 brotli 压缩。
压缩文件应与原始文件在同一个目录中,并且具有相同的名称,并附加 .br
后缀。(about.html
和 about.html.br
)。
存档中也应存在未压缩的文件。它用于计算 Etag。
未压缩的文件不会进行检查。它们不会被解压缩以确保与未压缩文件的内容匹配。
如果对于可压缩的内容类型缺少预压缩文件,则在创建Handler实例期间将计算压缩版本。这意味着您不需要在zip存档中包含预压缩文件,但结果是创建Handler实例时的时间和CPU使用量将显著增加。
请注意,大多数浏览器仅支持具有安全上下文(https或localhost)的brotli压缩。
用法
构建器所需的唯一参数是作为字节的zip存档内容。
let zip_bytes: & [u8] = download_zip();
let handler = Handler::builder()
.with_zip(zip_bytes)
.try_build()?;
有辅助函数可以从GitHub仓库(通过分支、标签或提交哈希)下载zip存档。
您可以同时指定路径和zip内容的前缀。例如,如果zip是GitHub仓库的导出,您可能希望删除repositiory-${branch_or_tag_or_commit_hash}/
前缀。
let zip_bytes = download( & zip_download_branch_url(
"programingjd",
"about.programingjd.me",
"main",
))
.await?;
let handler = Handler::builder()
.with_zip_prefix("about.programingjd.me-main/")
.with_path_prefix("about")
.with_zip(zip_bytes)
.try_build()?;
如果您在每次仓库更新后创建新的handler,您可以提供前一个handler进行diff比较。
这在内容未预压缩且您让handler处理压缩时尤其有用。所有需要压缩且未更改的文件将从旧handler复制,而不是再次压缩。
let handler = Handler::builder()
.with_zip_prefix("about.programingjd.me-main/")
.with_zip(zip_bytes)
.with_diff( & previous_handler)
.try_build()?;
功能
您可以通过启用适当的特性来选择所需的HTTP请求和响应的实现
-
hyper
示例: hyper.rs
-
axum
示例: axum.rs
-
actix
示例: actix.rs
-
rocket
示例: rocket.rs
-
xitca
示例: xitca.rs
-
min_http11
示例: min_http11.rs
示例
有不同http实现的示例,可以启用相应的特性。
hyper.rs示例显示了如何自定义接受的文件类型以及设置在响应中的哪些头部。
auto_update.rs示例显示了如何添加webhook,通过下载zip存档的新版本并从该新zip存档重新构建handler来更新handler。
依赖关系
~8–40MB
~794K SLoC