1
0
Эх сурвалжийг харах

Return error from SVG detector unless it is EOF or parser.Error

DarthSim 1 сар өмнө
parent
commit
aff48f97b5
2 өөрчлөгдсөн 81 нэмэгдсэн , 1 устгасан
  1. 16 1
      imagetype/svg.go
  2. 65 0
      imagetype/svg_test.go

+ 16 - 1
imagetype/svg.go

@@ -1,6 +1,8 @@
 package imagetype
 
 import (
+	"errors"
+	"io"
 	"strings"
 
 	"github.com/imgproxy/imgproxy/v3/bufreader"
@@ -22,7 +24,20 @@ func IsSVG(r bufreader.ReadPeeker) (Type, error) {
 
 		switch tt {
 		case xml.ErrorToken:
-			return Unknown, nil
+			err := l.Err()
+
+			if err == io.EOF || err == io.ErrUnexpectedEOF {
+				// EOF or unexpected EOF means we don't have enough data to determine the type
+				return Unknown, nil
+			}
+
+			var perr *parse.Error
+			if errors.As(err, &perr) {
+				// If the error is a parse error, we can assume that the data is not SVG
+				return Unknown, nil
+			}
+
+			return Unknown, err
 
 		case xml.StartTagToken:
 			tag := strings.ToLower(string(l.Text()))

+ 65 - 0
imagetype/svg_test.go

@@ -0,0 +1,65 @@
+package imagetype
+
+import (
+	"bytes"
+	"io"
+	"strings"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/imgproxy/imgproxy/v3/bufreader"
+)
+
+type errReader struct{ error }
+
+func (r errReader) Read(p []byte) (n int, err error) { return 0, r.error }
+
+func TestSVGDetectSuccess(t *testing.T) {
+	r := bufreader.New(strings.NewReader(`<svg xmlns="http://www.w3.org/2000/svg"></svg>`))
+	typ, err := IsSVG(r)
+	require.NoError(t, err)
+	require.Equal(t, SVG, typ)
+
+	r = bufreader.New(strings.NewReader(`<svg:svg xmlns:svg="http://www.w3.org/2000/svg"></svg:svg>`))
+	typ, err = IsSVG(r)
+	require.NoError(t, err)
+	require.Equal(t, SVG, typ)
+}
+
+func TestSVGDetectNotSvg(t *testing.T) {
+	r := bufreader.New(strings.NewReader(`<html><body>Not an SVG</body></html>`))
+	typ, err := IsSVG(r)
+	require.NoError(t, err)
+	require.Equal(t, Unknown, typ)
+
+	r = bufreader.New(strings.NewReader(`<?xml version="1.0" encoding="UTF-8"?><not-svg></not-svg>`))
+	typ, err = IsSVG(r)
+	require.NoError(t, err)
+	require.Equal(t, Unknown, typ)
+
+	r = bufreader.New(strings.NewReader(`<!-- Only comments -->`))
+	typ, err = IsSVG(r)
+	require.NoError(t, err)
+	require.Equal(t, Unknown, typ)
+
+	// Random byte data that does not match SVG
+	r = bufreader.New(bytes.NewReader([]byte{0x42, 0x4D, 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20}))
+	typ, err = IsSVG(r)
+	require.NoError(t, err)
+	require.Equal(t, Unknown, typ)
+}
+
+func TestSVGDetectError(t *testing.T) {
+	// Should not return an error for io.EOF
+	r := bufreader.New(errReader{error: io.EOF})
+	typ, err := IsSVG(r)
+	require.NoError(t, err)
+	require.Equal(t, Unknown, typ)
+
+	// Should return an error for other read errors
+	r = bufreader.New(errReader{error: io.ErrClosedPipe})
+	typ, err = IsSVG(r)
+	require.ErrorIs(t, err, io.ErrClosedPipe)
+	require.Equal(t, Unknown, typ)
+}