gtsocial-umbx

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

etag.go (1661B)


      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 web
     19 
     20 import (
     21 	// nolint:gosec
     22 	"crypto/sha1"
     23 	"encoding/hex"
     24 	"io"
     25 	"time"
     26 
     27 	"github.com/superseriousbusiness/gotosocial/internal/log"
     28 
     29 	"codeberg.org/gruf/go-cache/v3"
     30 )
     31 
     32 func newETagCache() cache.Cache[string, eTagCacheEntry] {
     33 	eTagCache := cache.New[string, eTagCacheEntry](0, 1000, 0)
     34 	eTagCache.SetTTL(time.Hour, false)
     35 	if !eTagCache.Start(time.Minute) {
     36 		log.Panic(nil, "could not start eTagCache")
     37 	}
     38 	return eTagCache
     39 }
     40 
     41 type eTagCacheEntry struct {
     42 	eTag         string
     43 	lastModified time.Time
     44 }
     45 
     46 // generateEtag generates a strong (byte-for-byte) etag using
     47 // the entirety of the provided reader.
     48 func generateEtag(r io.Reader) (string, error) {
     49 	// nolint:gosec
     50 	hash := sha1.New()
     51 
     52 	if _, err := io.Copy(hash, r); err != nil {
     53 		return "", err
     54 	}
     55 
     56 	b := make([]byte, 0, sha1.Size)
     57 	b = hash.Sum(b)
     58 
     59 	return `"` + hex.EncodeToString(b) + `"`, nil
     60 }