fix(webdav): optimize `HEAD` request (close #5182)

pull/5205/head
Andy Hsu 2023-09-06 16:32:51 +08:00
parent 623c7dcea5
commit d5b68a91d2
3 changed files with 12 additions and 6 deletions

View File

@ -51,6 +51,7 @@ func WebDAVAuth(c *gin.Context) {
username, password, ok := c.Request.BasicAuth() username, password, ok := c.Request.BasicAuth()
if !ok { if !ok {
bt := c.GetHeader("Authorization") bt := c.GetHeader("Authorization")
log.Debugf("[webdav auth] token: %s", bt)
if strings.HasPrefix(bt, "Bearer") { if strings.HasPrefix(bt, "Bearer") {
bt = strings.TrimPrefix(bt, "Bearer ") bt = strings.TrimPrefix(bt, "Bearer ")
token := setting.GetStr(conf.Token) token := setting.GetStr(conf.Token)

View File

@ -460,7 +460,7 @@ type ETager interface {
func findETag(ctx context.Context, ls LockSystem, name string, fi model.Obj) (string, error) { func findETag(ctx context.Context, ls LockSystem, name string, fi model.Obj) (string, error) {
if do, ok := fi.(ETager); ok { if do, ok := fi.(ETager); ok {
etag, err := do.ETag(ctx) etag, err := do.ETag(ctx)
if err != ErrNotImplemented { if !errors.Is(err, ErrNotImplemented) {
return etag, err return etag, err
} }
} }

View File

@ -8,7 +8,6 @@ package webdav // import "golang.org/x/net/webdav"
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/alist-org/alist/v3/internal/stream"
"net/http" "net/http"
"net/url" "net/url"
"os" "os"
@ -16,6 +15,8 @@ import (
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/internal/stream"
"github.com/alist-org/alist/v3/internal/errs" "github.com/alist-org/alist/v3/internal/errs"
"github.com/alist-org/alist/v3/internal/fs" "github.com/alist-org/alist/v3/internal/fs"
"github.com/alist-org/alist/v3/internal/model" "github.com/alist-org/alist/v3/internal/model"
@ -219,20 +220,24 @@ func (h *Handler) handleGetHeadPost(w http.ResponseWriter, r *http.Request) (sta
user := ctx.Value("user").(*model.User) user := ctx.Value("user").(*model.User)
reqPath, err = user.JoinPath(reqPath) reqPath, err = user.JoinPath(reqPath)
if err != nil { if err != nil {
return 403, err return http.StatusForbidden, err
} }
fi, err := fs.Get(ctx, reqPath, &fs.GetArgs{}) fi, err := fs.Get(ctx, reqPath, &fs.GetArgs{})
if err != nil { if err != nil {
return http.StatusNotFound, err return http.StatusNotFound, err
} }
if fi.IsDir() {
return http.StatusMethodNotAllowed, nil
}
etag, err := findETag(ctx, h.LockSystem, reqPath, fi) etag, err := findETag(ctx, h.LockSystem, reqPath, fi)
if err != nil { if err != nil {
return http.StatusInternalServerError, err return http.StatusInternalServerError, err
} }
w.Header().Set("ETag", etag) w.Header().Set("ETag", etag)
if r.Method == http.MethodHead {
w.Header().Set("Content-Length", fmt.Sprintf("%d", fi.GetSize()))
return http.StatusOK, nil
}
if fi.IsDir() {
return http.StatusMethodNotAllowed, nil
}
// Let ServeContent determine the Content-Type header. // Let ServeContent determine the Content-Type header.
storage, _ := fs.GetStorage(reqPath, &fs.GetStoragesArgs{}) storage, _ := fs.GetStorage(reqPath, &fs.GetStoragesArgs{})
downProxyUrl := storage.GetStorage().DownProxyUrl downProxyUrl := storage.GetStorage().DownProxyUrl