From 8fdc9ed5528fb99949fbe8851065ca3d59cc1ac3 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Sat, 30 Jul 2022 14:42:47 +0200 Subject: [PATCH] serve HEAD requests via the fileserver (#735) --- internal/api/client/fileserver/fileserver.go | 1 + internal/api/client/fileserver/servefile.go | 22 +++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/internal/api/client/fileserver/fileserver.go b/internal/api/client/fileserver/fileserver.go index 1a140e86d..dcb54f986 100644 --- a/internal/api/client/fileserver/fileserver.go +++ b/internal/api/client/fileserver/fileserver.go @@ -59,5 +59,6 @@ func (m *FileServer) Route(s router.Router) error { // something like "/fileserver/:account_id/:media_type/:media_size/:file_name" fileServePath := fmt.Sprintf("%s/:%s/:%s/:%s/:%s", FileServeBasePath, AccountIDKey, MediaTypeKey, MediaSizeKey, FileNameKey) s.AttachHandler(http.MethodGet, fileServePath, m.ServeFile) + s.AttachHandler(http.MethodHead, fileServePath, m.ServeFile) return nil } diff --git a/internal/api/client/fileserver/servefile.go b/internal/api/client/fileserver/servefile.go index fffa15a1c..0858af3ce 100644 --- a/internal/api/client/fileserver/servefile.go +++ b/internal/api/client/fileserver/servefile.go @@ -22,6 +22,7 @@ import ( "fmt" "io" "net/http" + "strconv" "github.com/gin-gonic/gin" "github.com/superseriousbusiness/gotosocial/internal/api" @@ -107,11 +108,18 @@ func (m *FileServer) ServeFile(c *gin.Context) { return } - c.DataFromReader(http.StatusOK, content.ContentLength, format, content.Content, map[string]string{ - // since we'll never host different files at the same - // URL (bc the ULIDs are generated per piece of media), - // it's sensible and safe to use a long cache here, so - // that clients don't keep fetching files over + over again - "Cache-Control": "max-age=604800", - }) + // since we'll never host different files at the same + // URL (bc the ULIDs are generated per piece of media), + // it's sensible and safe to use a long cache here, so + // that clients don't keep fetching files over + over again + c.Header("Cache-Control", "max-age=604800") + + if c.Request.Method == http.MethodHead { + c.Header("Content-Type", format) + c.Header("Content-Length", strconv.FormatInt(content.ContentLength, 10)) + c.Status(http.StatusOK) + return + } + + c.DataFromReader(http.StatusOK, content.ContentLength, format, content.Content, nil) }