1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/nanmu42-gzip

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Нано Му 42. Gzip Middleware для Go

Gzip Middleware for Go

GoDoc Build status codecov Lint status Go Report Card

Готовое к использованию и настраиваемое промежуточное ПО gzip для Gin и net/http.

Примеры

Используйте DefaultHandler(), чтобы создать готовое к работе промежуточное ПО gzip.

Gin
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)))
}
net/http
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 — это интерфейсы. Вы можете определить тот, который соответствует вашим потребностям.

Производительность

  • Когда полезная нагрузка ответа невелика, обработчик достаточно умён, чтобы автоматически пропускать сжатие, что требует незначительных накладных расходов.
  • В то время, когда полезная нагрузка большая, включается gzip и возникает разумная цена.
$ 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/nanmu42-gzip.git
git@api.gitlife.ru:oschina-mirror/nanmu42-gzip.git
oschina-mirror
nanmu42-gzip
nanmu42-gzip
master