1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
package upload
import (
"net/textproto"
"os"
"runtime"
"testing"
"github.com/stretchr/testify/require"
)
func TestImageTypeRecongition(t *testing.T) {
tests := []struct {
filename string
isJPEG bool
isTIFF bool
}{
{
filename: "exif/testdata/sample_exif.jpg",
isJPEG: true,
isTIFF: false,
}, {
filename: "exif/testdata/sample_exif.tiff",
isJPEG: false,
isTIFF: true,
}, {
filename: "exif/testdata/sample_exif_corrupted.jpg",
isJPEG: true,
isTIFF: false,
}, {
filename: "exif/testdata/sample_exif_invalid.jpg",
isJPEG: false,
isTIFF: false,
}, {
filename: "exif/testdata/takes_lot_of_memory_to_decode.tiff", // File from https://gitlab.com/gitlab-org/gitlab/-/issues/341363
isJPEG: false,
isTIFF: true,
},
}
for _, test := range tests {
t.Run(test.filename, func(t *testing.T) {
input, err := os.Open(test.filename)
require.NoError(t, err)
var m runtime.MemStats
runtime.ReadMemStats(&m)
start := m.TotalAlloc
require.Equal(t, test.isJPEG, isJPEG(input))
require.Equal(t, test.isTIFF, isTIFF(input))
runtime.ReadMemStats(&m)
require.Less(t, m.TotalAlloc-start, uint64(50000), "must take reasonable amount of memory to recognise the type")
})
}
}
func TestParseAndNormalizeContentDisposition(t *testing.T) {
tests := []struct {
desc string
header string
name string
filename string
sanitizedHeader string
}{
{
desc: "without content disposition",
header: "",
name: "",
filename: "",
sanitizedHeader: "",
}, {
desc: "content disposition without filename",
header: `form-data; name="filename"`,
name: "filename",
filename: "",
sanitizedHeader: `form-data; name=filename`,
}, {
desc: "with filename",
header: `form-data; name="file"; filename=foobar`,
name: "file",
filename: "foobar",
sanitizedHeader: `form-data; filename=foobar; name=file`,
}, {
desc: "with filename*",
header: `form-data; name="file"; filename*=UTF-8''bar`,
name: "file",
filename: "bar",
sanitizedHeader: `form-data; filename=bar; name=file`,
}, {
desc: "filename and filename*",
header: `form-data; name="file"; filename=foobar; filename*=UTF-8''bar`,
name: "file",
filename: "bar",
sanitizedHeader: `form-data; filename=bar; name=file`,
}, {
desc: "with empty filename",
header: `form-data; name="file"; filename=""`,
name: "file",
filename: "",
sanitizedHeader: `form-data; filename=""; name=file`,
}, {
desc: "with complex filename*",
header: `form-data; name="file"; filename*=UTF-8''viel%20Spa%C3%9F`,
name: "file",
filename: "viel Spaß",
sanitizedHeader: `form-data; filename*=utf-8''viel%20Spa%C3%9F; name=file`,
}, {
desc: "with unsupported charset",
header: `form-data; name="file"; filename*=UTF-16''bar`,
name: "file",
filename: "",
sanitizedHeader: `form-data; name=file`,
}, {
desc: "with filename and filename* with unsupported charset",
header: `form-data; name="file"; filename=foobar; filename*=UTF-16''bar`,
name: "file",
filename: "foobar",
sanitizedHeader: `form-data; filename=foobar; name=file`,
},
}
for _, testCase := range tests {
t.Run(testCase.desc, func(t *testing.T) {
h := make(textproto.MIMEHeader)
h.Set("Content-Disposition", testCase.header)
h.Set("Content-Type", "application/octet-stream")
name, filename := parseAndNormalizeContentDisposition(h)
require.Equal(t, testCase.name, name)
require.Equal(t, testCase.filename, filename)
require.Equal(t, testCase.sanitizedHeader, h.Get("Content-Disposition"))
})
}
}
|