You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

hashed_buffer.go 2.0KB

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