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日

#64Web编程

Download history 545/week @ 2024-05-04 1035/week @ 2024-05-11 464/week @ 2024-05-18 579/week @ 2024-05-25 861/week @ 2024-06-01 574/week @ 2024-06-08 1036/week @ 2024-06-15 622/week @ 2024-06-22 650/week @ 2024-06-29 660/week @ 2024-07-06 705/week @ 2024-07-13 713/week @ 2024-07-20 710/week @ 2024-07-27 827/week @ 2024-08-03 775/week @ 2024-08-10 782/week @ 2024-08-17

3,236 每月下载量
用于 7 crate

Apache-2.0

325KB
7.5K SLoC

dav-server-rs

Apache-2.0 licensed Crates.io docs.rs

webdav-handler-rs 项目的分支。

通用的异步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 包中的接口。

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

实现的标准。

目前通过 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

后端。

包含两个文件系统

  • LocalFs:在本地文件系统上提供目录服务
  • MemFs:短暂内存文件系统。支持 DAV 属性。

还包含两个锁系统

  • MemLs:短暂内存锁系统。
  • FakeLs:模拟锁系统。仅为 macOS/Windows 提供足够的 LOCK/UNLOCK 支持。

外部文件系统

示例。

使用 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