68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
|
package assetserver
|
||
|
|
||
|
import (
|
||
|
"net/http"
|
||
|
"path/filepath"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/wailsapp/mimetype"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
mimeCache = map[string]string{}
|
||
|
mimeMutex sync.Mutex
|
||
|
|
||
|
// The list of builtin mime-types by extension as defined by
|
||
|
// the golang standard lib package "mime"
|
||
|
// The standard lib also takes into account mime type definitions from
|
||
|
// etc files like '/etc/apache2/mime.types' but we want to have the
|
||
|
// same behavivour on all platforms and not depend on some external file.
|
||
|
mimeTypesByExt = map[string]string{
|
||
|
".avif": "image/avif",
|
||
|
".css": "text/css; charset=utf-8",
|
||
|
".gif": "image/gif",
|
||
|
".htm": "text/html; charset=utf-8",
|
||
|
".html": "text/html; charset=utf-8",
|
||
|
".jpeg": "image/jpeg",
|
||
|
".jpg": "image/jpeg",
|
||
|
".js": "text/javascript; charset=utf-8",
|
||
|
".json": "application/json",
|
||
|
".mjs": "text/javascript; charset=utf-8",
|
||
|
".pdf": "application/pdf",
|
||
|
".png": "image/png",
|
||
|
".svg": "image/svg+xml",
|
||
|
".wasm": "application/wasm",
|
||
|
".webp": "image/webp",
|
||
|
".xml": "text/xml; charset=utf-8",
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func GetMimetype(filename string, data []byte) string {
|
||
|
mimeMutex.Lock()
|
||
|
defer mimeMutex.Unlock()
|
||
|
|
||
|
result := mimeTypesByExt[filepath.Ext(filename)]
|
||
|
if result != "" {
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
result = mimeCache[filename]
|
||
|
if result != "" {
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
detect := mimetype.Detect(data)
|
||
|
if detect == nil {
|
||
|
result = http.DetectContentType(data)
|
||
|
} else {
|
||
|
result = detect.String()
|
||
|
}
|
||
|
|
||
|
if result == "" {
|
||
|
result = "application/octet-stream"
|
||
|
}
|
||
|
|
||
|
mimeCache[filename] = result
|
||
|
return result
|
||
|
}
|