@@ -18,7 +18,8 @@ import { checkAndInitDatabase } from "./src/utils/database.js";
1818import app from "./src/index.js" ;
1919import { ApiStatus } from "./src/constants/index.js" ;
2020
21- import { getWebDAVConfig , getPlatformConfig } from "./src/webdav/auth/index.js" ;
21+ import { setExpressWebDAVHeaders } from "./src/webdav/utils/headerUtils.js" ;
22+ import { getWebDAVConfig } from "./src/webdav/auth/config/WebDAVConfig.js" ;
2223
2324// ES模块兼容性处理:获取__dirname
2425const __filename = fileURLToPath ( import . meta. url ) ;
@@ -222,9 +223,6 @@ function createErrorResponse(error, status = ApiStatus.INTERNAL_ERROR, defaultMe
222223const server = express ( ) ;
223224const PORT = process . env . PORT || 8787 ;
224225
225- // 获取Express平台配置(仅用于代理设置)
226- const platformConfig = getPlatformConfig ( "express" ) ;
227-
228226// 数据目录和数据库设置
229227const dataDir = process . env . DATA_DIR || path . join ( __dirname , "data" ) ;
230228if ( ! fs . existsSync ( dataDir ) ) {
@@ -245,28 +243,22 @@ let isDbInitialized = false;
245243// 获取WebDAV配置
246244const webdavConfig = getWebDAVConfig ( ) ;
247245
248- // 应用Express平台配置
249- if ( platformConfig . TRUST_PROXY ) {
250- server . set ( "trust proxy" , true ) ;
251- console . log ( "Express: 已启用代理信任" ) ;
252- }
253-
254- // CORS配置 - 使用统一配置
246+ // CORS配置
255247const corsOptions = {
256- origin : webdavConfig . CORS . ALLOW_ORIGIN ,
257- methods : webdavConfig . SUPPORTED_METHODS . join ( "," ) ,
248+ origin : "*" ,
249+ methods : webdavConfig . METHODS . join ( "," ) ,
258250 credentials : true ,
259251 optionsSuccessStatus : 204 ,
260252 maxAge : 86400 ,
261- exposedHeaders : webdavConfig . CORS . ALLOW_HEADERS ,
253+ exposedHeaders : webdavConfig . HEADERS [ "Access-Control-Expose-Headers" ] ,
262254} ;
263255
264256// ==========================================
265257// 中间件和服务器配置
266258// ==========================================
267259
268260// 明确告知Express处理WebDAV方法
269- webdavConfig . SUPPORTED_METHODS . forEach ( ( method ) => {
261+ webdavConfig . METHODS . forEach ( ( method ) => {
270262 server [ method . toLowerCase ( ) ] = function ( path , ...handlers ) {
271263 return server . route ( path ) . all ( function ( req , res , next ) {
272264 if ( req . method === method ) {
@@ -278,7 +270,7 @@ webdavConfig.SUPPORTED_METHODS.forEach((method) => {
278270} ) ;
279271
280272// 为WebDAV方法添加直接路由,确保它们能被正确处理
281- webdavConfig . SUPPORTED_METHODS . forEach ( ( method ) => {
273+ webdavConfig . METHODS . forEach ( ( method ) => {
282274 server [ method . toLowerCase ( ) ] ( "/dav*" , ( req , res , next ) => {
283275 logMessage ( "debug" , `直接WebDAV路由处理: ${ method } ${ req . path } ` ) ;
284276 next ( ) ;
@@ -291,10 +283,11 @@ webdavConfig.SUPPORTED_METHODS.forEach((method) => {
291283
292284// 1. 基础中间件 - CORS和HTTP方法处理
293285// ==========================================
294- // 智能CORS处理:跳过WebDAV OPTIONS请求 ,让后续中间件处理
286+ // 智能CORS处理:跳过WebDAV OPTIONS请求和根路径OPTIONS请求 ,让后续中间件处理
295287server . use ( ( req , res , next ) => {
296- // 对于WebDAV路径的OPTIONS请求,跳过CORS自动处理
297- if ( req . method === "OPTIONS" && ( req . path === "/dav" || req . path . startsWith ( "/dav/" ) ) ) {
288+ // 对于WebDAV路径和根路径的OPTIONS请求,跳过CORS自动处理
289+ if ( req . method === "OPTIONS" && ( req . path === "/" || req . path === "/dav" || req . path . startsWith ( "/dav/" ) ) ) {
290+ logMessage ( "debug" , `跳过CORS处理: ${ req . method } ${ req . path } ` ) ;
298291 return next ( ) ;
299292 }
300293 // 其他请求使用标准CORS处理
@@ -305,11 +298,11 @@ server.use(methodOverride("X-HTTP-Method"));
305298server . use ( methodOverride ( "X-Method-Override" ) ) ;
306299server . disable ( "x-powered-by" ) ;
307300
308- // WebDAV基础方法支持 - 使用统一配置
301+ // WebDAV基础方法支持
309302server . use ( ( req , res , next ) => {
310303 if ( req . path === "/dav" || req . path . startsWith ( "/dav/" ) ) {
311- res . setHeader ( "Access-Control-Allow-Methods" , webdavConfig . SUPPORTED_METHODS . join ( "," ) ) ;
312- res . setHeader ( "Allow" , webdavConfig . SUPPORTED_METHODS . join ( "," ) ) ;
304+ // 使用统一的WebDAV头部设置工具
305+ setExpressWebDAVHeaders ( res ) ;
313306
314307 // 区分CORS预检请求和WebDAV OPTIONS请求
315308 if ( req . method === "OPTIONS" ) {
@@ -319,12 +312,6 @@ server.use((req, res, next) => {
319312 if ( isCORSPreflight ) {
320313 // CORS预检请求:在Express层直接处理
321314 return res . status ( 204 ) . end ( ) ;
322- } else {
323- // WebDAV OPTIONS请求:传递给Hono层处理认证和能力发现
324- // 添加WebDAV特定的响应头(为了兼容性)
325- res . setHeader ( "DAV" , webdavConfig . PROTOCOL . RESPONSE_HEADERS . DAV ) ;
326- res . setHeader ( "MS-Author-Via" , webdavConfig . PROTOCOL . RESPONSE_HEADERS [ "MS-Author-Via" ] ) ;
327- // 继续传递给Hono层处理
328315 }
329316 }
330317 }
@@ -505,7 +492,7 @@ server.use((req, res, next) => {
505492// WebDAV请求日志记录 - 认证由Hono层处理
506493server . use ( "/dav" , ( req , res , next ) => {
507494 // 明确设置允许的方法
508- res . setHeader ( "Allow" , webdavConfig . SUPPORTED_METHODS . join ( "," ) ) ;
495+ res . setHeader ( "Allow" , webdavConfig . METHODS . join ( "," ) ) ;
509496
510497 // 记录WebDAV请求信息
511498 logMessage ( "info" , `WebDAV请求: ${ req . method } ${ req . path } ` , {
@@ -549,6 +536,25 @@ server.use(async (req, res, next) => {
549536// 路由处理
550537// ==========================================
551538
539+ // 根路径WebDAV OPTIONS兼容性处理器
540+ // 为1Panel等客户端提供WebDAV能力发现支持
541+ server . options ( "/" , ( req , res ) => {
542+ // 返回标准WebDAV能力声明,与/dav路径保持一致
543+ const headers = {
544+ Allow : "OPTIONS, PROPFIND, GET, HEAD, PUT, DELETE, MKCOL, COPY, MOVE, LOCK, UNLOCK, PROPPATCH" ,
545+ DAV : "1, 2" ,
546+ "MS-Author-Via" : "DAV" ,
547+ "Access-Control-Allow-Origin" : "*" ,
548+ "Access-Control-Allow-Methods" : "OPTIONS, PROPFIND, GET, HEAD, PUT, DELETE, MKCOL, COPY, MOVE, LOCK, UNLOCK, PROPPATCH" ,
549+ "Access-Control-Allow-Headers" : "Authorization, Content-Type, Depth, Destination, If, Lock-Token, Overwrite, X-Custom-Auth-Key" ,
550+ "Access-Control-Expose-Headers" : "DAV, Lock-Token, MS-Author-Via" ,
551+ "Access-Control-Max-Age" : "86400" ,
552+ } ;
553+
554+ logMessage ( "info" , "根路径WebDAV OPTIONS请求 - 客户端兼容性支持" ) ;
555+ res . set ( headers ) . status ( 200 ) . end ( ) ;
556+ } ) ;
557+
552558// 通配符路由 - 处理所有其他API请求
553559server . use ( "*" , async ( req , res ) => {
554560 try {
0 commit comments