1
0

file_size.go 771 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package security
  2. import (
  3. "io"
  4. "github.com/imgproxy/imgproxy/v3/ierrors"
  5. )
  6. var ErrSourceFileTooBig = ierrors.New(422, "Source image file is too big", "Invalid source image")
  7. type hardLimitReader struct {
  8. r io.Reader
  9. left int
  10. }
  11. func (lr *hardLimitReader) Read(p []byte) (n int, err error) {
  12. if lr.left <= 0 {
  13. return 0, ErrSourceFileTooBig
  14. }
  15. if len(p) > lr.left {
  16. p = p[0:lr.left]
  17. }
  18. n, err = lr.r.Read(p)
  19. lr.left -= n
  20. return
  21. }
  22. func CheckFileSize(size int, opts Options) error {
  23. if opts.MaxSrcFileSize > 0 && size > opts.MaxSrcFileSize {
  24. return ErrSourceFileTooBig
  25. }
  26. return nil
  27. }
  28. func LimitFileSize(r io.Reader, opts Options) io.Reader {
  29. if opts.MaxSrcFileSize > 0 {
  30. return &hardLimitReader{r: r, left: opts.MaxSrcFileSize}
  31. }
  32. return r
  33. }