svg.go 797 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package imagemeta
  2. import (
  3. "bytes"
  4. "encoding/xml"
  5. "io"
  6. "sync/atomic"
  7. )
  8. var maxSvgBytes int64 = 32 * 1024
  9. type svgHeader struct {
  10. XMLName xml.Name
  11. }
  12. func SetMaxSvgCheckRead(n int) {
  13. atomic.StoreInt64(&maxSvgBytes, int64(n))
  14. }
  15. func IsSVG(r io.Reader) (bool, error) {
  16. maxBytes := int(atomic.LoadInt64(&maxSvgBytes))
  17. var h svgHeader
  18. buf := make([]byte, 0, maxBytes)
  19. b := make([]byte, 1024)
  20. rr := bytes.NewReader(buf)
  21. for {
  22. n, err := r.Read(b)
  23. if err != nil && err != io.EOF {
  24. return false, err
  25. }
  26. if n <= 0 {
  27. return false, nil
  28. }
  29. buf = append(buf, b[:n]...)
  30. rr.Reset(buf)
  31. dec := xml.NewDecoder(rr)
  32. dec.Strict = false
  33. if dec.Decode(&h); h.XMLName.Local == "svg" {
  34. return true, nil
  35. }
  36. if len(buf) >= maxBytes {
  37. break
  38. }
  39. }
  40. return false, nil
  41. }