github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/mime/type.go (about) 1 // Copyright 2010 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package mime implements parts of the MIME spec. 6 package mime 7 8 import ( 9 "fmt" 10 "strings" 11 "sync" 12 ) 13 14 var mimeTypes = map[string]string{ 15 ".css": "text/css; charset=utf-8", 16 ".gif": "image/gif", 17 ".htm": "text/html; charset=utf-8", 18 ".html": "text/html; charset=utf-8", 19 ".jpg": "image/jpeg", 20 ".js": "application/x-javascript", 21 ".pdf": "application/pdf", 22 ".png": "image/png", 23 ".xml": "text/xml; charset=utf-8", 24 } 25 26 var mimeLock sync.RWMutex 27 28 var once sync.Once 29 30 // TypeByExtension returns the MIME type associated with the file extension ext. 31 // The extension ext should begin with a leading dot, as in ".html". 32 // When ext has no associated type, TypeByExtension returns "". 33 // 34 // The built-in table is small but on unix it is augmented by the local 35 // system's mime.types file(s) if available under one or more of these 36 // names: 37 // 38 // /etc/mime.types 39 // /etc/apache2/mime.types 40 // /etc/apache/mime.types 41 // 42 // Windows system mime types are extracted from registry. 43 // 44 // Text types have the charset parameter set to "utf-8" by default. 45 func TypeByExtension(ext string) string { 46 once.Do(initMime) 47 mimeLock.RLock() 48 typename := mimeTypes[ext] 49 mimeLock.RUnlock() 50 return typename 51 } 52 53 // AddExtensionType sets the MIME type associated with 54 // the extension ext to typ. The extension should begin with 55 // a leading dot, as in ".html". 56 func AddExtensionType(ext, typ string) error { 57 if ext == "" || ext[0] != '.' { 58 return fmt.Errorf(`mime: extension "%s" misses dot`, ext) 59 } 60 once.Do(initMime) 61 return setExtensionType(ext, typ) 62 } 63 64 func setExtensionType(extension, mimeType string) error { 65 _, param, err := ParseMediaType(mimeType) 66 if err != nil { 67 return err 68 } 69 if strings.HasPrefix(mimeType, "text/") && param["charset"] == "" { 70 param["charset"] = "utf-8" 71 mimeType = FormatMediaType(mimeType, param) 72 } 73 mimeLock.Lock() 74 mimeTypes[extension] = mimeType 75 mimeLock.Unlock() 76 return nil 77 }