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  }