首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go Mime包(1.14)在本地的行为与正式的码头形象不同

Go Mime包(1.14)在本地的行为与正式的码头形象不同
EN

Stack Overflow用户
提问于 2020-03-15 18:14:08
回答 1查看 208关注 0票数 3

我已经将本地Go版本从1.13升级到了1.14,然后通过使用go mod重新初始化更新了正在进行的项目。

当地:

代码语言:javascript
复制
$ go version
go version go1.14 linux/amd64

我项目的go.mod

代码语言:javascript
复制
module example-project

go 1.14

Go 1.14中的1.14包中有一个更新,它将默认类型的.js文件从application/javascript更改为text/javascript

我有一个应用程序,它提供一个包含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更改:

代码语言:javascript
复制
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的测试用例失败:

代码语言:javascript
复制
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包呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-15 21:13:16

这对我来说也很有趣,我也有类似的行为- go 1.14交付给我的mashine (Mashine)应用程序/javascript,而不是text/javascript。我调试了这个程序,并在mime包的type.go中找到了这个函数:

代码语言:javascript
复制
func initMime() {
    if fn := testInitMime; fn != nil {
        fn()
    } else {
        setMimeTypes(builtinTypesLower, builtinTypesLower)
        osInitMime()
    }
}

其他街区正在发生有趣的事情。在将扩展builtInTypes js分配给text/javascript之后,就会对文件扩展到内容类型进行os特定的赋值,从而覆盖内置赋值。在mac上,它将将type_unix.go文件保存在

代码语言:javascript
复制
"/etc/mime.types",
"/etc/apache2/mime.types",
"/etc/apache/mime.types",

测试是否可用,在我的示例中,os中有一个文件/etc/apache2/mime.types,它包含.给一个应用程序/javascript行惊喜,这一行将覆盖.js扩展的go内置定义,并导致将Content-Type: application/javascript交付给客户端并导致测试失败。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60696133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档