mirror of https://github.com/golang/go.git
mime: make FormatMediaType take full type for consistency
Fixes #2405 R=rsc CC=golang-dev https://golang.org/cl/5539048
This commit is contained in:
parent
45d739748e
commit
a00de45bbb
|
|
@ -12,17 +12,22 @@ import (
|
|||
"unicode"
|
||||
)
|
||||
|
||||
// FormatMediaType serializes type t, subtype sub and the paramaters
|
||||
// param as a media type conform RFC 2045 and RFC 2616.
|
||||
// The type, subtype, and parameter names are written in lower-case.
|
||||
// FormatMediaType serializes mediatype t and the parameters
|
||||
// param as a media type conforming to RFC 2045 and RFC 2616.
|
||||
// The type and parameter names are written in lower-case.
|
||||
// When any of the arguments result in a standard violation then
|
||||
// FormatMediaType returns the empty string.
|
||||
func FormatMediaType(t, sub string, param map[string]string) string {
|
||||
if !(IsToken(t) && IsToken(sub)) {
|
||||
func FormatMediaType(t string, param map[string]string) string {
|
||||
slash := strings.Index(t, "/")
|
||||
if slash == -1 {
|
||||
return ""
|
||||
}
|
||||
major, sub := t[:slash], t[slash+1:]
|
||||
if !IsToken(major) || !IsToken(sub) {
|
||||
return ""
|
||||
}
|
||||
var b bytes.Buffer
|
||||
b.WriteString(strings.ToLower(t))
|
||||
b.WriteString(strings.ToLower(major))
|
||||
b.WriteByte('/')
|
||||
b.WriteString(strings.ToLower(sub))
|
||||
|
||||
|
|
|
|||
|
|
@ -253,3 +253,24 @@ func TestParseMediaTypeBogus(t *testing.T) {
|
|||
t.Errorf("expected invalid media parameter; got error %q", err)
|
||||
}
|
||||
}
|
||||
|
||||
type formatTest struct {
|
||||
typ string
|
||||
params map[string]string
|
||||
want string
|
||||
}
|
||||
|
||||
var formatTests = []formatTest{
|
||||
{"noslash", nil, ""},
|
||||
{"foo/BAR", nil, "foo/bar"},
|
||||
{"foo/BAR", map[string]string{"X": "Y"}, "foo/bar; x=Y"},
|
||||
}
|
||||
|
||||
func TestFormatMediaType(t *testing.T) {
|
||||
for i, tt := range formatTests {
|
||||
got := FormatMediaType(tt.typ, tt.params)
|
||||
if got != tt.want {
|
||||
t.Errorf("%d. FormatMediaType(%q, %v) = %q; want %q", i, tt.typ, tt.params, got, tt.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,21 +62,14 @@ func AddExtensionType(ext, typ string) error {
|
|||
}
|
||||
|
||||
func setExtensionType(extension, mimeType string) error {
|
||||
full, param, err := ParseMediaType(mimeType)
|
||||
_, param, err := ParseMediaType(mimeType)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if split := strings.Index(full, "/"); split < 0 {
|
||||
return fmt.Errorf(`mime: malformed MIME type "%s"`, mimeType)
|
||||
} else {
|
||||
main := full[:split]
|
||||
sub := full[split+1:]
|
||||
if main == "text" && param["charset"] == "" {
|
||||
param["charset"] = "utf-8"
|
||||
}
|
||||
mimeType = FormatMediaType(main, sub, param)
|
||||
if strings.HasPrefix(mimeType, "text/") && param["charset"] == "" {
|
||||
param["charset"] = "utf-8"
|
||||
mimeType = FormatMediaType(mimeType, param)
|
||||
}
|
||||
|
||||
mimeLock.Lock()
|
||||
mimeTypes[extension] = mimeType
|
||||
mimeLock.Unlock()
|
||||
|
|
|
|||
Loading…
Reference in New Issue