1
0

svg.go 998 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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.
  12. // We register it with a priority of 100 to run it after magic number detectors
  13. RegisterDetector(100, IsSVG)
  14. }
  15. func IsSVG(r bufreader.ReadPeeker) (Type, error) {
  16. l := xml.NewLexer(parse.NewInput(r))
  17. for {
  18. tt, _ := l.Next()
  19. switch tt {
  20. case xml.ErrorToken:
  21. err := l.Err()
  22. if err == io.EOF || err == io.ErrUnexpectedEOF {
  23. // EOF or unexpected EOF means we don't have enough data to determine the type
  24. return Unknown, nil
  25. }
  26. var perr *parse.Error
  27. if errors.As(err, &perr) {
  28. // If the error is a parse error, we can assume that the data is not SVG
  29. return Unknown, nil
  30. }
  31. return Unknown, err
  32. case xml.StartTagToken:
  33. tag := strings.ToLower(string(l.Text()))
  34. if tag == "svg" || tag == "svg:svg" {
  35. return SVG, nil
  36. }
  37. }
  38. }
  39. }