webdavfs

package
v0.1.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 21, 2026 License: MIT Imports: 19 Imported by: 0

Documentation

Overview

Package webdavfs 是 WebDAV 协议壳:把 vfs.FileSystem 翻译成 golang.org/x/net/webdav 需要的 FileSystem / File,并提供 HTTP 外壳 (Basic 认证、上传体长闸门、目录级 MOVE/COPY 退化)。

本包是唯一允许 import webdav 的地方;它不直接调用 S3。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Config

type Config struct {
	// 单用户模式:该文件系统 + 一对 Basic 凭据。
	FileSystem *FileSystem
	User       string
	Password   string
	// Users 是多用户路由表(每用户一个已构建好的 FileSystem)。非空时启用
	// 多用户模式,上方 FileSystem/User/Password 必须为空。
	Users []UserEntry
	// MaxUploadSize 是请求体上限(字节);<= 0 表示不限制。
	MaxUploadSize int64
	// MaxUploadSizeText 是上限的人类可读文本,只用于 413 指引文案。
	MaxUploadSizeText string
	// Logger 为空则不记录访问日志。
	Logger *log.Logger
	// PrewarmDirs 是单用户模式下需要后台预热的目录路径(逻辑路径,如 "/yiche")。
	// 多用户模式下每个用户自己的预热目录在 UserEntry.PrewarmDirs 里。
	// 首个请求到达时启动,按缓存 TTL 周期刷新,让超大目录在用户访问前
	// 就处于热状态——它们的首次列举可能长达数十秒。
	PrewarmDirs []string
}

Config 是 WebDAV HTTP 外壳的构造参数。单用户模式填 FileSystem/User/Password; 多用户模式填 Users,两种模式互斥。

type FileSystem

type FileSystem struct {
	// contains filtered or unexported fields
}

FileSystem 把 vfs.FileSystem 适配成 webdav.FileSystem。

func New

func New(core vfs.FileSystem) *FileSystem

New 包装内核。内核与壳共享同一 bucket,壳不持有任何 S3 客户端。 不开目录列表缓存(单次请求内的重复 Stat 仍走请求级 readCache)。

func NewWithListingCache

func NewWithListingCache(core vfs.FileSystem, ttl time.Duration) *FileSystem

NewWithListingCache 同 New,但开启服务级目录列表缓存。 ttl <= 0 等同 New(不缓存)。 预热通过 Server 的 Config.PrewarmDirs 驱动(见 Server.prewarmDirs)。

func (*FileSystem) Mkdir

func (fs *FileSystem) Mkdir(ctx context.Context, name string, perm os.FileMode) error

Mkdir 写一个 0 字节、key 以 "/" 结尾的目录标记对象:否则 Finder/Explorer 里新建的文件夹刷新即消失(S3 没有目录,共同前缀无法自证存在)。

已存在时按 os.Mkdir 语义返回 ErrExist(webdav 映射成 405):既避免覆盖已有 目录,也避免在同名文件旁多出一个 "x/" 标记对象、让列表里出现两条同名项。

func (*FileSystem) OpenFile

func (fs *FileSystem) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (webdav.File, error)

OpenFile 实现 webdav.FileSystem。读路径不做任何 S3 请求: 元信息来自请求级缓存,真正的 GetObject 推迟到第一次 Read/Seek。

func (*FileSystem) RemoveAll

func (fs *FileSystem) RemoveAll(ctx context.Context, name string) error

RemoveAll 实现 webdav.FileSystem。webdav 的 DELETE 一律走这里, 目录删除等价于删掉该前缀下的全部对象(含目录标记对象)。

func (*FileSystem) Rename

func (fs *FileSystem) Rename(ctx context.Context, oldName, newName string) error

Rename 实现 webdav.FileSystem。目录级由 HTTP 外壳提前拦成 501, 内核的 ErrNotSupported 只是兜底。

func (*FileSystem) SetLogger added in v0.1.3

func (fs *FileSystem) SetLogger(l *log.Logger)

SetLogger 注入异步路径的日志器。须在开始服务前调用一次(只在构造期写入, 不做并发保护)。

func (*FileSystem) Stat

func (fs *FileSystem) Stat(ctx context.Context, name string) (os.FileInfo, error)

Stat 实现 webdav.FileSystem。

type Server

type Server struct {
	// contains filtered or unexported fields
}

Server 是 WebDAV 网关的 HTTP 外壳。

func NewServer

func NewServer(cfg Config) (*Server, error)

NewServer 组装中间件链:Basic 认证(查表)→ 按用户路由 → 请求态/上传闸门 → 目录级 MOVE/COPY 退化 → webdav.Handler。

func (*Server) ServeHTTP

func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request)

func (*Server) SwapUsers added in v0.1.3

func (s *Server) SwapUsers(entries []UserEntry) error

SwapUsers 原子替换用户路由表(热加载的 Swap 步,I8/I9):

  • 同一 FileSystem 指针 = 同一栈:只换凭据条目,handler/MemLS/预热保留, 密码热替换、改 quota(未来)都不重建栈;
  • 新出现的 FileSystem 构建新栈(含启动预热);
  • 消失的栈退役:预热 goroutine 取消,在途请求持旧 handler 引用自然完成。

type UserEntry added in v0.1.3

type UserEntry struct {
	Name        string
	Password    string
	FileSystem  *FileSystem
	PrewarmDirs []string
}

UserEntry 是一名用户的路由表条目:凭据 + 该用户已构建好的文件系统。 两次 SwapUsers 传入同一 FileSystem 指针即视为同一栈复用(handler、 MemLS 与预热 goroutine 原样保留,凭据热替换)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL