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  }