Нано Му 42. Gzip Middleware для Go
Готовое к использованию и настраиваемое промежуточное ПО gzip для Gin и net/http.
Используйте DefaultHandler()
, чтобы создать готовое к работе промежуточное ПО gzip.
import github.com/nanmu42/gzip
func main() {
g := gin.Default()
// используйте настройки по умолчанию
g.Use(gzip.DefaultHandler().Gin)
g.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, map[string]interface{}{
"code": 0,
"msg": "hello",
"data": fmt.Sprintf("l%sng!", strings.Repeat("o", 1000)),
})
})
log.Println(g.Run(fmt.Sprintf(":%d", 3000)))
}
import github.com/nanmu42/gzip
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
writeString(w, fmt.Sprintf("This content is compressed: l%sng!", strings.Repeat("o", 1000)))
})
// оберните http.Handler, используя настройки по умолчанию
log.Println(http.ListenAndServe(fmt.Sprintf(":%d", 3001), gzip.DefaultHandler().WrapHandler(mux)))
}
func writeString(w http.ResponseWriter, payload string) {
w.Header().Set("Content-Type", "text/plain; charset=utf8")
_, _ = io.WriteString(w, payload+"\n")
}
Обработчик можно настроить с помощью NewHandler
и Config
:
import github.com/nanmu42/gzip
handler := gzip.NewHandler(gzip.Config{
// уровень сжатия gzip, который будет использоваться
CompressionLevel: 6,
// минимальная длина содержимого, которая вызовет сжатие gzip, единица измерения — в байтах.
MinContentLength: 1024,
// RequestFilter решает, следует ли сжимать ответ на основе запроса.
// Фильтры применяются здесь в последовательности.
RequestFilter: []RequestFilter{
NewCommonRequestFilter(),
DefaultExtensionFilter(),
},
// ResponseHeaderFilter решает, следует ли сжимать ответ
// на основе заголовка ответа
ResponseHeaderFilter: []ResponseHeaderFilter{
NewSkipCompressedFilter(),
DefaultContentTypeFilter(),
},
})
RequestFilter
и ResponseHeaderFilter
— это интерфейсы. Вы можете определить тот, который соответствует вашим потребностям.
$ go test -benchmem -bench .
goos: linux
goarch: amd64
pkg: github.com/nanmu42/gzip
BenchmarkSoleGin_SmallPayload-4 4104684 276 ns/op 64 B/op 2 allocs/op
BenchmarkGinWithDefaultHandler_SmallPayload-4 1683307 707 ns/op 96 B/op 3 allocs/op
BenchmarkSoleGin_BigPayload-4 4198786 274 ns/op 64 B/op 2 allocs/op
BenchmarkGinWithDefaultHandler_BigPayload-4 44780 27636 ns/op 190 B/op 5 allocs/op
PASS
ok github.com/nanmu42/gzip 6.373s
Примечание: из-за неловкой человеческой ошибки результаты тестов и до версии v1.0.0 не являются точными.
Content-Type
в заголовке ответа HTTP, хотя обработчик догадывается с помощью http.DetectContentType()
в качестве временного решения;Content-Length
недоступен, обработчик может буферизовать ваши записи, чтобы решить, достаточно ли они велики для значимого сжатия. Большое значение MinContentLength
может привести к дополнительным затратам памяти, хотя обработчик пытается быть умным, повторно используя буферы и проверяя, достаточно или нет значения len(data)
первого вызова http.ResponseWriter.Write(data []byte)
.Все API завершены, и в серии выпусков 1.x не будет внесено никаких критических изменений.
При разработке этой работы автор использовал следующие работы/материалы:
В этом пакете используется пакет сжатия klauspost's compress для обработки сжатия gzip.
Логотип создан на Gopherize.me.
MIT License
Copyright (c) 2019 LI Zhennan
Caddy is licensed under the Apache License
Copyright 2015 Light Code Labs, LLC
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )