svg.go 702 B

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