Skip to content

Commit 2512f26

Browse files
committed
fix parsing content type with quoted parameter value
1 parent 9d2dc95 commit 2512f26

File tree

2 files changed

+21
-24
lines changed

2 files changed

+21
-24
lines changed

media/contenttype_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ func TestParseContentType(t *testing.T) {
6868
require.False(t, ct.IsRange())
6969
},
7070
},
71+
{
72+
s: `application/xml;boundary="foo"`,
73+
validate: func(t *testing.T, ct ContentType) {
74+
require.Equal(t, "application", ct.Type)
75+
require.Equal(t, "xml", ct.Subtype)
76+
require.Equal(t, "foo", ct.Parameters["boundary"])
77+
require.False(t, ct.IsRange())
78+
},
79+
},
7180
}
7281

7382
for _, testcase := range testcases {

media/contentype.go

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package media
33
import (
44
"fmt"
55
log "github.com/sirupsen/logrus"
6+
"mime"
67
"reflect"
78
"strconv"
89
"strings"
@@ -22,32 +23,19 @@ type ContentType struct {
2223

2324
func ParseContentType(s string) ContentType {
2425
c := ContentType{raw: s, Parameters: make(map[string]string), Q: 1.0}
25-
a := strings.Split(s, ";")
26-
m := strings.Split(a[0], "/")
27-
c.Type = strings.ToLower(strings.TrimSpace(m[0]))
28-
if len(m) > 1 {
29-
c.Subtype = strings.ToLower(strings.TrimSpace(m[1]))
30-
}
31-
for _, p := range a[1:] {
32-
kv := strings.Split(p, "=")
33-
switch kv[0] {
34-
case "q":
35-
if len(kv) > 1 {
36-
var err error
37-
if c.Q, err = strconv.ParseFloat(kv[1], 64); err != nil {
38-
log.Debugf("invalid q parameter in %v", s)
39-
c.Q = 1.0
40-
}
41-
}
42-
default:
43-
if len(kv) > 1 {
44-
c.Parameters[strings.TrimSpace(kv[0])] = strings.TrimSpace(kv[1])
45-
} else {
46-
c.Parameters[kv[0]] = ""
47-
}
26+
c.Type, c.Parameters, _ = mime.ParseMediaType(s)
27+
if q, ok := c.Parameters["q"]; ok {
28+
var err error
29+
if c.Q, err = strconv.ParseFloat(q, 64); err != nil {
30+
log.Debugf("invalid q parameter in %v", s)
31+
c.Q = 1.0
4832
}
4933
}
50-
34+
t := strings.Split(c.Type, "/")
35+
if len(t) > 1 {
36+
c.Type = strings.TrimSpace(t[0])
37+
c.Subtype = strings.TrimSpace(t[1])
38+
}
5139
return c
5240
}
5341

0 commit comments

Comments
 (0)