我已经将本地Go版本从1.13升级到了1.14,然后通过使用go mod重新初始化更新了正在进行的项目。
当地:
$ go version
go version go1.14 linux/amd64我项目的go.mod:
module example-project
go 1.14Go 1.14中的1.14包中有一个更新,它将默认类型的.js文件从application/javascript更改为text/javascript。
我有一个应用程序,它提供一个包含JavaScript文件的文件夹,如下所示:
func main() {
http.HandleFunc("/static/", StaticHandler)
http.ListenAndServe(":3000", nil)
}
func StaticHandler(w http.ResponseWriter, r *http.Request) {
fs := http.StripPrefix("/static", http.FileServer(http.Dir("public/")))
fs.ServeHTTP(w, r)
}我更新了一个测试用例,以反映Go 1.14中的mime更改:
func TestStaticHandlerServeJS(t *testing.T) {
req, err := http.NewRequest("GET", "/static/index.js", nil)
if err != nil {
t.Fatal(err)
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(StaticHandler)
handler.ServeHTTP(rr, req)
if status := rr.Code; status != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
status, http.StatusOK)
}
expected := "text/javascript; charset=utf-8"
if rr.Header().Get("Content-Type") != expected {
t.Errorf("handler returned unexpected Content-Type: got %v want %v",
rr.Header().Get("Content-Type"), expected)
}
}当我在本地运行时,检查Content的测试用例失败:
TestStaticHandlerServeJS: main_test.go:27: handler returned unexpected Content-Type: got application/javascript want text/javascript; charset=utf-8我还可以在浏览器中确认该文件确实与Go 1.13中的Mime "application/javascript“一起使用。
当我使用正式的golang:1.14.0-alpine3.11映像在Docker容器上运行这个测试时,这个测试通过了,它反映了mime包的变化行为。
因此,留给我的是一个本地失败并传递容器的测试用例。我只在本地维护一个Go版本,这就是上面所示的1.14。为什么我的本地Go安装有不同的mime包呢?
发布于 2020-03-15 21:13:16
这对我来说也很有趣,我也有类似的行为- go 1.14交付给我的mashine (Mashine)应用程序/javascript,而不是text/javascript。我调试了这个程序,并在mime包的type.go中找到了这个函数:
func initMime() {
if fn := testInitMime; fn != nil {
fn()
} else {
setMimeTypes(builtinTypesLower, builtinTypesLower)
osInitMime()
}
}其他街区正在发生有趣的事情。在将扩展builtInTypes js分配给text/javascript之后,就会对文件扩展到内容类型进行os特定的赋值,从而覆盖内置赋值。在mac上,它将将type_unix.go文件保存在
"/etc/mime.types",
"/etc/apache2/mime.types",
"/etc/apache/mime.types",测试是否可用,在我的示例中,os中有一个文件/etc/apache2/mime.types,它包含.给一个应用程序/javascript行惊喜,这一行将覆盖.js扩展的go内置定义,并导致将Content-Type: application/javascript交付给客户端并导致测试失败。
https://stackoverflow.com/questions/60696133
复制相似问题