code.gitea.io/gitea@v1.22.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 const DefaultMemorySize = 32 * 1024 * 1024 29 30 // NewHashedBuffer creates a hashed buffer with the default memory size 31 func NewHashedBuffer() (*HashedBuffer, error) { 32 return NewHashedBufferWithSize(DefaultMemorySize) 33 } 34 35 // NewHashedBufferWithSize creates a hashed buffer with a specific memory size 36 func NewHashedBufferWithSize(maxMemorySize int) (*HashedBuffer, error) { 37 b, err := filebuffer.New(maxMemorySize) 38 if err != nil { 39 return nil, err 40 } 41 42 hash := NewMultiHasher() 43 44 combinedWriter := io.MultiWriter(b, hash) 45 46 return &HashedBuffer{ 47 b, 48 hash, 49 combinedWriter, 50 }, nil 51 } 52 53 // CreateHashedBufferFromReader creates a hashed buffer with the default memory size and copies the provided reader data into it. 54 func CreateHashedBufferFromReader(r io.Reader) (*HashedBuffer, error) { 55 return CreateHashedBufferFromReaderWithSize(r, DefaultMemorySize) 56 } 57 58 // CreateHashedBufferFromReaderWithSize creates a hashed buffer and copies the provided reader data into it. 59 func CreateHashedBufferFromReaderWithSize(r io.Reader, maxMemorySize int) (*HashedBuffer, error) { 60 b, err := NewHashedBufferWithSize(maxMemorySize) 61 if err != nil { 62 return nil, err 63 } 64 65 _, err = io.Copy(b, r) 66 if err != nil { 67 return nil, err 68 } 69 70 return b, nil 71 } 72 73 // Write implements io.Writer 74 func (b *HashedBuffer) Write(p []byte) (int, error) { 75 return b.combinedWriter.Write(p) 76 } 77 78 // Sums gets the MD5, SHA1, SHA256 and SHA512 checksums of the data 79 func (b *HashedBuffer) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512 []byte) { 80 return b.hash.Sums() 81 }