"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))
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)
+ }
+ }
+}
}
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()