Go Пакет Mime (1.14) локально ведет себя по-другому по сравнению с официальным Docker изображением - PullRequest
3 голосов
/ 15 марта 2020

Я обновил свою локальную Go версию с 1.13 до 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)
}

Я обновил тест случай, чтобы отразить изменения MIME в Go 1.14:

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-Type, терпит неудачу:

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.

Когда я запускаю этот тест на контейнере Docker, используя Официальное golang:1.14.0-alpine3.11 изображение, этот тест проходит, и он отражает измененное поведение пакета mime.

Так что в результате я остаюсь с тестовый пример, который не проходит локально и передает контейнер. Я поддерживаю только одну версию Go локально, и это 1.14, как я показал выше. В чем может быть причина того, что в моей локальной установке Go пакет mime ведет себя по-другому?

1 Ответ

3 голосов
/ 16 марта 2020

Мне тоже было интересно, и у меня было то же поведение, что и у вас - go 1.14 доставлено в моем приложении mashine (macOs catalina) / javascript вместо текста / javascript. Я отладил программу и нашел эту функцию в типе. go пакета mime:

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

В блоке else происходит интересное. После установки builtInTypes, где расширению js присваивается text/javascript, выполняется указание c расширения файла для типа содержимого, которое перезаписывает встроенное назначение. На ma c он собирается в файл type_ unix. go, где проверяются файлы

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

, и в моем случае файл /etc/apache2/mime.types присутствовал в операционной системе, и он содержит ... неожиданную строку application / javascript js, и эта строка перезаписывает встроенное определение go для расширения. js и приводит к доставке Content-Type: application/javascript клиенту и провалите тест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...