fileserver.go (2333B)
1 // GoToSocial 2 // Copyright (C) GoToSocial Authors admin@gotosocial.org 3 // SPDX-License-Identifier: AGPL-3.0-or-later 4 // 5 // This program is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Affero General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Affero General Public License for more details. 14 // 15 // You should have received a copy of the GNU Affero General Public License 16 // along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 package api 19 20 import ( 21 "github.com/gin-gonic/gin" 22 "github.com/superseriousbusiness/gotosocial/internal/api/fileserver" 23 "github.com/superseriousbusiness/gotosocial/internal/config" 24 "github.com/superseriousbusiness/gotosocial/internal/middleware" 25 "github.com/superseriousbusiness/gotosocial/internal/processing" 26 "github.com/superseriousbusiness/gotosocial/internal/router" 27 ) 28 29 type Fileserver struct { 30 fileserver *fileserver.Module 31 } 32 33 func (f *Fileserver) Route(r router.Router, m ...gin.HandlerFunc) { 34 fileserverGroup := r.AttachGroup("fileserver") 35 36 // Attach middlewares appropriate for this group. 37 fileserverGroup.Use(m...) 38 // If we're using local storage or proxying s3, we can set a 39 // long max-age on all file requests to reflect that we 40 // never host different files at the same URL (since 41 // ULIDs are generated per piece of media), so we can 42 // easily prevent clients having to fetch files repeatedly. 43 // 44 // If we *are* using non-proxying s3, however, the max age 45 // must be set dynamically within the request handler, 46 // based on how long the signed URL has left to live before 47 // it expires. This ensures that clients won't cache expired 48 // links. This is done within fileserver/servefile.go. 49 if config.GetStorageBackend() == "local" || config.GetStorageS3Proxy() { 50 fileserverGroup.Use(middleware.CacheControl("private", "max-age=604800")) // 7d 51 } 52 53 f.fileserver.Route(fileserverGroup.Handle) 54 } 55 56 func NewFileserver(p *processing.Processor) *Fileserver { 57 return &Fileserver{ 58 fileserver: fileserver.New(p), 59 } 60 }