10个版本
0.2.0 | 2021年5月12日 |
---|---|
0.2.0-alpha.6 | 2021年1月20日 |
0.2.0-alpha.5 | 2020年12月18日 |
0.2.0-alpha.4 | 2020年6月25日 |
0.1.1 | 2019年6月23日 |
#1900 in Web编程
320KB
7.5K SLoC
webdav处理器
通用的异步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 package
中的类似
本库中的处理器与来自 http
和 http_body
插件的标准 http 类型一起工作。这意味着您可以直接与那些也使用这些类型的 http 库/框架一起使用,例如 hyper。还提供了 actix-web 和 warp 的兼容模块。
实施的标准。
目前 通过了 Webdav Litmus Test 测试套件的 "基本"、"复制移动"、"属性"、"锁定" 和 "http" 检查。这些都是 RFC4918 webdav 标准的基础。
litmus 测试套件还包括对 RFC3744 "acl" 和 "principal"、RFC5842 "bind" 以及 RFC3253 "版本控制" 的测试。我们目前不支持这些。
还实现了 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
的 PATCH
带有 X-Update-Range
标头。
后端。
包含两个文件系统
还包含两个锁系统
示例。
示例服务器使用 hyper 以读写模式提供 /tmp 目录。您应该能够从 Linux、macOS 和 Windows 挂载此网络共享。其他框架的 示例 也可用。
use std::convert::Infallible;
use webdav_handler::{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=webdav_handler=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
- Apache 许可证,版本 2.0
依赖关系
~13–27MB
~420K SLoC