code.gitea.io/gitea@v1.19.3/modules/packages/hashed_buffer.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package packages 5 6 import ( 7 "io" 8 9 "code.gitea.io/gitea/modules/util/filebuffer" 10 ) 11 12 // HashedSizeReader provide methods to read, sum hashes and a Size method 13 type HashedSizeReader interface { 14 io.Reader 15 HashSummer 16 Size() int64 17 } 18 19 // HashedBuffer is buffer which calculates multiple checksums 20 type HashedBuffer struct { 21 *filebuffer.FileBackedBuffer 22 23 hash *MultiHasher 24 25 combinedWriter io.Writer 26 } 27 28 // NewHashedBuffer creates a hashed buffer with a specific maximum memory size 29 func NewHashedBuffer(maxMemorySize int) (*HashedBuffer, error) { 30 b, err := filebuffer.New(maxMemorySize) 31 if err != nil { 32 return nil, err 33 } 34 35 hash := NewMultiHasher() 36 37 combinedWriter := io.MultiWriter(b, hash) 38 39 return &HashedBuffer{ 40 b, 41 hash, 42 combinedWriter, 43 }, nil 44 } 45 46 // CreateHashedBufferFromReader creates a hashed buffer and copies the provided reader data into it. 47 func CreateHashedBufferFromReader(r io.Reader, maxMemorySize int) (*HashedBuffer, error) { 48 b, err := NewHashedBuffer(maxMemorySize) 49 if err != nil { 50 return nil, err 51 } 52 53 _, err = io.Copy(b, r) 54 if err != nil { 55 return nil, err 56 } 57 58 return b, nil 59 } 60 61 // Write implements io.Writer 62 func (b *HashedBuffer) Write(p []byte) (int, error) { 63 return b.combinedWriter.Write(p) 64 } 65 66 // Sums gets the MD5, SHA1, SHA256 and SHA512 checksums of the data 67 func (b *HashedBuffer) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512 []byte) { 68 return b.hash.Sums() 69 }