Как включить сжатие промежуточного программного обеспечения gzip в go-chi

Как включить сжатие gzip с помощью промежуточного программного обеспечения gzip платформы go-chi?

Попробуйте использовать пример, показанный здесь:

https://github.com/go-chi/chi/issues/204

но когда я проверяю с curl, я получаю это:

$ curl -H "Accept-Encoding: gzip" -I http://127.0.0.1:3333
HTTP/1.1 405 Method Not Allowed
Date: Sat, 31 Aug 2019 19:06:39 GMT

Я попробовал код "Привет, мир":

package main

import (
    "net/http"

    "github.com/go-chi/chi"
    "github.com/go-chi/chi/middleware"
)

func main() {
    r := chi.NewRouter()
    r.Use(middleware.RequestID)
    r.Use(middleware.Logger)
    //r.Use(middleware.DefaultCompress) //using this produces the same result
    r.Use(middleware.Compress(5, "gzip"))
    r.Get("/", Hello)
    http.ListenAndServe(":3333", r)
}

func Hello(w http.ResponseWriter, r *http.Request){
    w.Header().Set("Content-Type", "text/html") //according to the documentation this must be here to enable gzip
    w.Write([]byte("hello world\n"))
}

но когда я пытаюсь проверить с помощью curl, результат тот же

$ curl -H "Accept-Encoding: gzip" -I http://127.0.0.1:3333
HTTP/1.1 405 Method Not Allowed
Date: Sat, 31 Aug 2019 19:06:39 GMT

в чем дело?

1 ответ

Решение

Используйте прокомментированные middleware.DefaultCompress и нормальный GET запрос.

package main

import (
    "net/http"

    "github.com/go-chi/chi"
    "github.com/go-chi/chi/middleware"
)

func main() {
    r := chi.NewRouter()
    r.Use(middleware.RequestID)
    r.Use(middleware.Logger)
    r.Use(middleware.DefaultCompress)
    r.Get("/", Hello)
    http.ListenAndServe(":3333", r)
}

func Hello(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "text/html")
    w.Write([]byte("hello world\n"))
}

Попробуй с curl:

$ curl -v http://localhost:3333 --compressed
* Rebuilt URL to: http://localhost:3333/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 3333 (#0)
> GET / HTTP/1.1
> Host: localhost:3333
> User-Agent: curl/7.58.0
> Accept: */*
> Accept-Encoding: deflate, gzip
>
< HTTP/1.1 200 OK
< Content-Encoding: gzip
< Content-Type: text/html
< Date: Sat, 31 Aug 2019 23:37:52 GMT
< Content-Length: 36
<
hello world
* Connection #0 to host localhost left intact

Или же HTTPie:

$ http :3333
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Length: 36
Content-Type: text/html
Date: Sat, 31 Aug 2019 23:38:31 GMT

hello world

Остальные ответы уже устарели. Я должен был решить это сам, вот что я узнал.

Ваша ошибка здесь:

r.Use(middleware.Compress(5, "gzip"))

Второй аргумент ("типы") относится к типам контента, к которым будет применяться сжатие. Например:"text/html", "application/json", так далее

Просто добавьте список типов контента, которые вы хотите сжать, или полностью удалите аргумент:

func main() {
    r := chi.NewRouter()
    r.Use(middleware.RequestID)
    r.Use(middleware.Logger)
    r.Use(middleware.Compress(5))
    r.Get("/", Hello)
    http.ListenAndServe(":3333", r)
}

Это сжимает все типы содержимого, определенные в списке по умолчанию из промежуточного программного обеспечения.

var defaultCompressibleContentTypes = []string{
    "text/html",
    "text/css",
    "text/plain",
    "text/javascript",
    "application/javascript",
    "application/x-javascript",
    "application/json",
    "application/atom+xml",
    "application/rss+xml",
    "image/svg+xml",
}

Удачи!

r.Use(middleware.DefaultCompress) теперь отмечен как DEPRECATED.

Чтобы включить сжатие, вам нужно создать компрессор и использовать его обработчик.

r := chi.NewRouter()
r.Use(middleware.RequestID)
r.Use(middleware.Logger)

compressor := middleware.NewCompressor(flate.DefaultCompression)
r.Use(compressor.Handler())

r.Get("/", Hello)
http.ListenAndServe(":3333", r)

В flate пакет должен быть импортирован как compress/flate.

Другие вопросы по тегам