gitea源码

hashed_buffer.go 2.1KB

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