svg.go 962 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package imagetype
  2. import (
  3. "errors"
  4. "io"
  5. "strings"
  6. "github.com/imgproxy/imgproxy/v3/bufreader"
  7. "github.com/tdewolff/parse/v2"
  8. "github.com/tdewolff/parse/v2/xml"
  9. )
  10. func init() {
  11. // Register SVG detector (needs at least 1000 bytes to reliably detect SVG)
  12. RegisterDetector(IsSVG)
  13. }
  14. func IsSVG(r bufreader.ReadPeeker) (Type, error) {
  15. l := xml.NewLexer(parse.NewInput(r))
  16. for {
  17. tt, _ := l.Next()
  18. switch tt {
  19. case xml.ErrorToken:
  20. err := l.Err()
  21. if err == io.EOF || err == io.ErrUnexpectedEOF {
  22. // EOF or unexpected EOF means we don't have enough data to determine the type
  23. return Unknown, nil
  24. }
  25. var perr *parse.Error
  26. if errors.As(err, &perr) {
  27. // If the error is a parse error, we can assume that the data is not SVG
  28. return Unknown, nil
  29. }
  30. return Unknown, err
  31. case xml.StartTagToken:
  32. tag := strings.ToLower(string(l.Text()))
  33. if tag == "svg" || tag == "svg:svg" {
  34. return SVG, nil
  35. }
  36. }
  37. }
  38. }