svg.go 868 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package imagetype
  2. import (
  3. "encoding/xml"
  4. "errors"
  5. "io"
  6. "github.com/imgproxy/imgproxy/v3/bufreader"
  7. )
  8. func init() {
  9. // Register SVG detector.
  10. // We register it with a priority of 100 to run it after magic number detectors
  11. RegisterDetector(100, IsSVG)
  12. }
  13. func IsSVG(r bufreader.ReadPeeker) (Type, error) {
  14. dec := xml.NewDecoder(r)
  15. dec.Strict = false
  16. for {
  17. tok, err := dec.RawToken()
  18. if err == io.EOF || err == io.ErrUnexpectedEOF {
  19. // EOF or unexpected EOF means we don't have enough data to determine the type
  20. return Unknown, nil
  21. }
  22. if err != nil {
  23. var perr *xml.SyntaxError
  24. if errors.As(err, &perr) {
  25. // If the error is a parse error, we can assume that the data is not SVG
  26. return Unknown, nil
  27. }
  28. return Unknown, err
  29. }
  30. if se, ok := tok.(xml.StartElement); ok && se.Name.Local == "svg" {
  31. return SVG, nil
  32. }
  33. }
  34. }