gpt4 book ai didi

与官方 Docker 镜像相比,Go Mime 包 (1.14) 在本地的行为有所不同

转载 作者:行者123 更新时间:2023-12-02 08:11:59 27 4
gpt4 key购买 nike

我已经从1.13升级了我的本地Go版本至1.14然后我通过使用 go mod 重新初始化来更新我正在处理的项目.

本地:

$ go version
go version go1.14 linux/amd64

go.mod我的项目:

module example-project

go 1.14

mime 中有更新Go 中的包 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)
}

我更新了一个测试用例以反射(reflect) 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)
}
}

当我在本地运行此命令时,检查内容类型的测试用例失败:

TestStaticHandlerServeJS: main_test.go:27: handler returned unexpected Content-Type: got application/javascript want text/javascript; charset=utf-8

我还可以在浏览器中确认该文件确实使用 Mime 类型“application/javascript”提供,就像 Go 1.13 中那样。

当我使用官方 golang:1.14.0-alpine3.11 在 Docker 容器上运行此测试时图像,此测试通过,它反射(reflect)了 mime 的行为变化包。

因此,我留下了一个在本地失败并传递到容器的测试用例。我在本地只维护一个 Go 版本,那就是 1.14正如我上面所展示的。我的本地 Go 安装有 mime 的原因可能是什么?包的行为不同?

最佳答案

这对我来说也很有趣,我也有和你一样的行为 - go 1.14 在我的机器(macOs catalina)应用程序/javascript 上交付,而不是文本/javascript。我调试了程序,在mime包的type.go中发现了这个函数:

func initMime() {
if fn := testInitMime; fn != nil {
fn()
} else {
setMimeTypes(builtinTypesLower, builtinTypesLower)
osInitMime()
}
}

else block 中正在发生有趣的事情。设置builtInTypes(其中扩展名js 分配给text/javascript)后,系统会将文件扩展名分配给内容类型,这会覆盖内置分配。在 Mac 上,它将转到文件 type_unix.go,其中 files

"/etc/mime.types",
"/etc/apache2/mime.types",
"/etc/apache/mime.types",

经过测试可用,在我的例子中,操作系统中存在一个文件 /etc/apache2/mime.types 并且它包含......令人惊讶的一行应用程序/javascript js此行覆盖 .js 扩展的 go 内置定义,并导致 Content-Type: application/javascript 被传递到客户端并导致您的测试失败。

关于与官方 Docker 镜像相比,Go Mime 包 (1.14) 在本地的行为有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60696133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com