#webdav #http #handler #directory #http-server #http-framework #actix-web

webdav处理器

支持HTTP和Webdav协议的文件系统后端处理器

10个版本

0.2.0 2021年5月12日
0.2.0-alpha.62021年1月20日
0.2.0-alpha.52020年12月18日
0.2.0-alpha.42020年6月25日
0.1.1 2019年6月23日

#1900 in Web编程


用于ipfs-webdav

Apache-2.0

320KB
7.5K SLoC

webdav处理器

Apache-2.0 licensed Released API docs

通用的异步HTTP/Webdav处理器

Webdav (RFC4918) 定义为HTTP (GET/HEAD/PUT/DELETE) 加上一系列扩展方法 (PROPFIND等)。这些扩展方法用于管理集合(如Unix目录),获取集合信息(如Unix lsreaddir),重命名和复制项目,锁定/解锁项目等。

handler 是一段代码,它接受一个 http::Request,以某种方式处理它,然后生成一个 http::Response。这个库是一个将HTTP/Webdav协议映射到文件系统的 handler。实际上,是“一个”文件系统。其中包括本地文件系统(localfs)的适配器和内存文件系统(memfs)的适配器。

因此,这个库可以用作HTTP服务器(如hyperwarpactix-web等)的处理程序。既可以作为正确且完整的文件HTTP处理程序(GET/HEAD),也可以作为整个Webdav协议的处理程序。在后一种情况下,您可以将它作为远程文件系统挂载:Linux、Windows、macOS都可以挂载Webdav文件系统。

后端接口。

后端接口与Go x/net/webdav package 中的类似

本库中的处理器与来自 httphttp_body 插件的标准 http 类型一起工作。这意味着您可以直接与那些也使用这些类型的 http 库/框架一起使用,例如 hyper。还提供了 actix-webwarp 的兼容模块。

实施的标准。

目前 通过了 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 实现的,以及使用来自 SabreDavPATCH 带有 X-Update-Range 标头。

后端。

包含两个文件系统

  • LocalFs:在本地文件系统中提供目录
  • MemFs:临时的内存文件系统。支持 DAV 属性。

还包含两个锁系统

  • MemLs:临时的内存锁系统。
  • FakeLs:假的锁系统。仅提供足够的 LOCK/UNLOCK 支持以兼容 macOS/Windows。

示例。

示例服务器使用 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

依赖关系

~13–27MB
~420K SLoC