diff options
author | Brad Fitzpatrick <bradfitz@golang.org> | 2020-01-14 18:15:25 +0000 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2020-02-25 21:09:55 +0000 |
commit | f0ee49b5bcde39ac6c36d3837666aa9a36383066 (patch) | |
tree | c4707e70d619a4455ec4505582ecd3514719b724 /src/mime | |
parent | 46f9aea80197bfdf4c024c3f5a71be51a2facf59 (diff) | |
download | go-f0ee49b5bcde39ac6c36d3837666aa9a36383066.tar.gz go-f0ee49b5bcde39ac6c36d3837666aa9a36383066.zip |
mime: fix ExtensionsByType bug when there are duplicates
Also, sort them so the results aren't random.
Thanks to @junedev for the bug report & repro.
Fixes #36524
Change-Id: Ic9197ebeceddfb3d0aee895d8fc12ce4d205b164
Reviewed-on: https://go-review.googlesource.com/c/go/+/214680
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/mime')
-rw-r--r-- | src/mime/type.go | 7 | ||||
-rw-r--r-- | src/mime/type_test.go | 27 |
2 files changed, 32 insertions, 2 deletions
diff --git a/src/mime/type.go b/src/mime/type.go index aa05077e22..260c535af0 100644 --- a/src/mime/type.go +++ b/src/mime/type.go @@ -7,6 +7,7 @@ package mime import ( "fmt" + "sort" "strings" "sync" ) @@ -49,7 +50,7 @@ func setMimeTypes(lowerExt, mixExt map[string]string) { panic(err) } var exts []string - if ei, ok := extensions.Load(k); ok { + if ei, ok := extensions.Load(justType); ok { exts = ei.([]string) } extensions.Store(justType, append(exts, k)) @@ -151,7 +152,9 @@ func ExtensionsByType(typ string) ([]string, error) { if !ok { return nil, nil } - return append([]string{}, s.([]string)...), nil + ret := append([]string(nil), s.([]string)...) + sort.Strings(ret) + return ret, nil } // AddExtensionType sets the MIME type associated with diff --git a/src/mime/type_test.go b/src/mime/type_test.go index e7aef9a196..f10e6343f9 100644 --- a/src/mime/type_test.go +++ b/src/mime/type_test.go @@ -188,3 +188,30 @@ func BenchmarkExtensionsByType(b *testing.B) { }) } } + +func TestExtensionsByType2(t *testing.T) { + cleanup := setMimeInit(func() { + clearMimeTypes() + // Initialize built-in types like in type.go before osInitMime. + setMimeTypes(builtinTypesLower, builtinTypesLower) + }) + defer cleanup() + + tests := []struct { + typ string + want []string + }{ + {typ: "image/jpeg", want: []string{".jpeg", ".jpg"}}, + } + + for _, tt := range tests { + got, err := ExtensionsByType(tt.typ) + if err != nil { + t.Errorf("ExtensionsByType(%q): %v", tt.typ, err) + continue + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("ExtensionsByType(%q) = %q; want %q", tt.typ, got, tt.want) + } + } +} |