download.go 1021 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package main
  2. import (
  3. "bytes"
  4. "errors"
  5. "image"
  6. "net/http"
  7. _ "image/gif"
  8. _ "image/jpeg"
  9. _ "image/png"
  10. )
  11. const chunkSize = 4096
  12. func checkTypeAndDimensions(b []byte) error {
  13. imgconf, _, err := image.DecodeConfig(bytes.NewReader(b))
  14. if err != nil {
  15. return err
  16. }
  17. if imgconf.Width > conf.MaxSrcDimension || imgconf.Height > conf.MaxSrcDimension {
  18. return errors.New("File is too big")
  19. }
  20. return nil
  21. }
  22. func readAndCheckImage(res *http.Response) ([]byte, error) {
  23. b := make([]byte, chunkSize)
  24. n, err := res.Body.Read(b)
  25. if err != nil {
  26. return nil, err
  27. }
  28. if err = checkTypeAndDimensions(b[:n]); err != nil {
  29. return nil, err
  30. }
  31. buf := bytes.NewBuffer(b[:n])
  32. if res.ContentLength > 0 {
  33. buf.Grow(int(res.ContentLength))
  34. }
  35. if _, err = buf.ReadFrom(res.Body); err != nil {
  36. return nil, err
  37. }
  38. return buf.Bytes(), nil
  39. }
  40. func downloadImage(url string) ([]byte, error) {
  41. res, err := http.Get(url)
  42. if err != nil {
  43. return nil, err
  44. }
  45. defer res.Body.Close()
  46. return readAndCheckImage(res)
  47. }