read.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package imagedata
  2. import (
  3. "bytes"
  4. "context"
  5. "io"
  6. "github.com/imgproxy/imgproxy/v3/bufpool"
  7. "github.com/imgproxy/imgproxy/v3/bufreader"
  8. "github.com/imgproxy/imgproxy/v3/config"
  9. "github.com/imgproxy/imgproxy/v3/imagefetcher"
  10. "github.com/imgproxy/imgproxy/v3/imagemeta"
  11. "github.com/imgproxy/imgproxy/v3/security"
  12. )
  13. var downloadBufPool *bufpool.Pool
  14. func initRead() {
  15. downloadBufPool = bufpool.New("download", config.Workers, config.DownloadBufferSize)
  16. }
  17. func readAndCheckImage(r io.Reader, contentLength int, secopts security.Options) (ImageData, error) {
  18. buf := downloadBufPool.Get(contentLength, false)
  19. cancel := func() { downloadBufPool.Put(buf) }
  20. br := bufreader.New(r, buf)
  21. meta, err := imagemeta.DecodeMeta(br)
  22. if err != nil {
  23. buf.Reset()
  24. cancel()
  25. return nil, imagefetcher.WrapError(err)
  26. }
  27. if err = security.CheckDimensions(meta.Width(), meta.Height(), 1, secopts); err != nil {
  28. buf.Reset()
  29. cancel()
  30. return nil, imagefetcher.WrapError(err)
  31. }
  32. downloadBufPool.GrowBuffer(buf, contentLength)
  33. if err = br.Flush(); err != nil {
  34. buf.Reset()
  35. cancel()
  36. return nil, imagefetcher.WrapError(err)
  37. }
  38. i := NewFromBytesWithFormat(meta.Format(), buf.Bytes(), nil)
  39. i.AddCancel(cancel)
  40. return i, nil
  41. }
  42. func BorrowBuffer() (*bytes.Buffer, context.CancelFunc) {
  43. buf := downloadBufPool.Get(0, false)
  44. cancel := func() { downloadBufPool.Put(buf) }
  45. return buf, cancel
  46. }