gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }