17个不稳定版本 (4个重大变更)
0.7.0 | 2024年7月17日 |
---|---|
0.5.8 | 2024年1月26日 |
0.5.7 | 2023年7月18日 |
0.5.4 | 2023年3月14日 |
0.3.3 | 2022年3月29日 |
#64 在 Web编程
3,236 每月下载量
用于 7 crate
325KB
7.5K SLoC
dav-server-rs
webdav-handler-rs 项目的分支。
通用的异步HTTP/Webdav处理器
Webdav
(RFC4918) 被定义为HTTP (GET/HEAD/PUT/DELETE) 加上一系列扩展方法 (PROPFIND等)。这些扩展方法用于管理集合(如Unix目录)、获取集合信息(如Unix ls
或 readdir
)、重命名和复制项目、锁定/解锁项目等。
handler
是一段代码,它接收一个 http::Request
,以某种方式处理它,然后生成一个 http::Response
。这个库是一个将HTTP/Webdav协议映射到文件系统的 handler
。实际上,"一个"文件系统。其中包括本地文件系统(localfs
)的适配器和一个内存文件系统(memfs
)的适配器。
因此,这个库可以用作HTTP服务器(如 hyper、warp、actix-web 等)的处理程序。要么作为一个正确且完整的文件HTTP处理程序(GET/HEAD),要么作为一个完整的Webdav协议处理程序。在后一种情况下,您可以将其作为远程文件系统挂载:Linux、Windows、macOS都可以挂载Webdav文件系统。
后端接口。
后端接口类似于Go x/net/webdav
包中的接口。
本库中的处理器与来自 http
和 http_body
驱动程序的标准化 http 类型一起工作。这意味着您可以直接与使用这些类型的 http 库/框架一起使用它,例如 hyper。还提供了针对 actix-web 和 warp 的兼容模块。
实现的标准。
目前通过 Webdav Litmus 测试套件的 "basic"、"copymove"、"props"、"locks" 和 "http" 检查 (链接)。这是所有基础 RFC4918 Webdav 规范。
litmus 测试套件还包括针对 RFC3744 "acl" 和 "principal",RFC5842 "bind",以及 RFC3253 "versioning" 的测试。这些我们目前不支持。
还实现了 HTTP RFC 的相关部分,例如预条件(If-Match、If-None-Match、If-Modified-Since、If-Unmodified-Since、If-Range),部分传输(Range)。
还实现了 partial PUT
,目前有两种非标准方法:带有 Content-Range
头的 PUT
,这是 Apache 的 mod_dav
实现的,以及来自 SabreDav
的带有 X-Update-Range
头的 PATCH
。
后端。
包含两个文件系统
还包含两个锁系统
外部文件系统
示例。
使用 hyper 的示例服务器,以读写模式提供 /tmp 目录。您应该能够从 Linux、macOS 和 Windows 挂载此网络共享。其他框架的示例也可用 (链接)。
use std::convert::Infallible;
use dav_server::{fakels::FakeLs, localfs::LocalFs, DavHandler};
#[tokio::main]
async fn main() {
let dir = "/tmp";
let addr = ([127, 0, 0, 1], 4918).into();
let dav_server = DavHandler::builder()
.filesystem(LocalFs::new(dir, false, false, false))
.locksystem(FakeLs::new())
.build_handler();
let make_service = hyper::service::make_service_fn(move |_| {
let dav_server = dav_server.clone();
async move {
let func = move |req| {
let dav_server = dav_server.clone();
async move {
Ok::<_, Infallible>(dav_server.handle(req).await)
}
};
Ok::<_, Infallible>(hyper::service::service_fn(func))
}
});
println!("Serving {} on {}", dir, addr);
let _ = hyper::Server::bind(&addr)
.serve(make_service)
.await
.map_err(|e| eprintln!("server error: {}", e));
}
构建。
此包使用 std::future::Future 和 async/await,因此它仅适用于 Rust 1.39 及更高版本。
测试。
RUST_LOG=dav_server=debug cargo run --example sample-litmus-server
这将在 4918 端口启动服务器,提供内存文件系统。有关其他选项,请运行 cargo run --example sample-litmus-server -- --help
版权和许可证。
- © 2018, 2019, 2020 XS4ALL Internet bv
- © 2018, 2019, 2020 Miquel van Smoorenburg
- © 2021 - 2023 Messense Lv
- Apache License, Version 2.0
依赖关系
~9–21MB
~330K SLoC