go version)?$ go version go version go1.12.5 windows/amd64
Yes
go env)?go env Output
$ go env
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:UserskjkAppDataLocalgo-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:Userskjkgo
set GOPROXY=
set GORACE=
set GOROOT=C:Go
set GOTMPDIR=
set GOTOOLDIR=C:Gopkgtoolwindows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=C:Userskjksrcappsoffdocsgo.mod
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:UserskjkAppDataLocalTempgo-build840166758=/tmp/go-build -gno-record-gcc-switches
Consider this program:
package main
import (
"fmt"
"mime"
)
func main() {
ct := mime.TypeByExtension(".js")
fmt.Printf("ct: %s\n", ct)
}
https://play.golang.org/p/JTVjWc9xMDE
Mime-type for .js files should be application/javascript on all platforms.
On Linux it returns ct: application/javascript
On my latest Windows 10 it returns ct: text/plain; charset=utf-8
This also affects Content-Type returned by http.ServeFile() for .js files.
This is because in src\mime\type.go:
func initMime() {
if fn := testInitMime; fn != nil {
fn()
} else {
setMimeTypes(builtinTypesLower, builtinTypesLower)
osInitMime()
}
}
On Windows osInitMime() reads info for additional extensions from registry and over-writes mime-type for .js files.
Note: it's possible this won't repro on every version on Windows.
Reversing the initialization order should fix it:
osInitMime()
setMimeTypes(builtinTypesLower, builtinTypesLower)
Reversing the order would be a pretty heavy-handed fix. Local system configuration should have precedence over the builtin defaults.
Does this issue reproduce on a clean Windows install?
This issue started to appear out of the blue on a Windows 10 1903 install (go 1.12.9).
A terrible work-around:
var builtinMimeTypesLower = map[string]string{
".css": "text/css; charset=utf-8",
".gif": "image/gif",
".htm": "text/html; charset=utf-8",
".html": "text/html; charset=utf-8",
".jpg": "image/jpeg",
".js": "application/javascript",
".wasm": "application/wasm",
".pdf": "application/pdf",
".png": "image/png",
".svg": "image/svg+xml",
".xml": "text/xml; charset=utf-8",
}
func staticFileGetMimeType(ext string) string {
if v, ok := builtinMimeTypesLower[ext]; ok {
return v
}
return mime.TypeByExtension(ext)
}
~On Windows7, mime type of .js is application/javascript:~
Sorry, it may not be default configuration.
C:\>reg query HKCR\.js /v "Content Type"
HKEY_CLASSES_ROOT\.js
Content Type REG_SZ application/javascript
Interesting, I wonder what is changing this. Thanks for the pointer.
C:\>reg query HKCR\.js /v "Content Type"
HKEY_CLASSES_ROOT\.js
Content Type REG_SZ text/plain
As a result that I swimed in internet for 10 minutes, I figure out this value of the registory key seems to be possibly changed by some text editor or casual confguration.
https://timothytocci.com/tag/registry/ (text/plain)
https://www.jianshu.com/p/a443991462d7 (application/x-javascript)
And it is not registered in default on Windows 10. I think this should not be set from registory. Or should be non-overwritable.
Change https://golang.org/cl/191917 mentions this issue: mime: do not change initial configuration for mimeTypes
builtinTypesLower is safe. it is not overwritable. mime.types or registory is NOT safe. This can be added to mimeTypes easily. (ex with installing text editor on Windows). So cl191917 disable overwrite to mimeTypes from mime.types or registory. What about this?
Currently this issue prevents service worker to load as browsers block it if it's content type is not JavaScript
Hey, just wanted to mention that I have created a little tool to check if the problem is also caused on your machine and to fix the issue by setting the mentioned registry key to the expected value application/javascript. Just if someone might be interested.
Hi
I think that this is caused by the registry settings in windows 10.
If you are looking for a temporary solution, please import the following registry items:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.js]
"Content Type"="text/javascript"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.js]
"Content Type"="text/javascript"
IMHO this one is caused by system, but not golang itself.
Did I miss something?
There seems to be some evolution.
On Windows 10 _latest_, registry key only defines the file type and no Content Type appears.
%GOPATH%\mime>ver
Microsoft Windows [Version 10.0.18363.959]
%GOPATH%\mime>go version
go version go1.14.5 windows/amd64
%GOPATH%\mime>reg query HKCR\.js
HKEY_CLASSES_ROOT\.js
(Default) REG_SZ JSFile
HKEY_CLASSES_ROOT\.js\PersistentHandler
%GOPATH%\mime>go run jsmimetype.go
ct: text/javascript; charset=utf-8
These values appear in line with Mozilla documentation.
Hi
I think that this is caused by the registry settings in windows 10.If you are looking for a temporary solution, please import the following registry items:
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.js] "Content Type"="text/javascript" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.js] "Content Type"="text/javascript"IMHO this one is caused by system, but not golang itself.
Did I miss something?
The requirement of the mime package should be to correctly ascertain the mime type of common files, regardless of Windows registry settings. If a web server can't properly serve up a js file, that's a major facepalm right there.
For .js, .html, and .css, the code should return the expected mime type on Windows if the Content Type registry value is missing. Those three are sensible special cases for fallbacks in case of missing values in the Windows registry.
Same problem persists in Win 10 with go 1.15.3
Most helpful comment
Hi
I think that this is caused by the registry settings in windows 10.
If you are looking for a temporary solution, please import the following registry items:
IMHO this one is caused by system, but not golang itself.
Did I miss something?