This package provides a middleware for net/http and fasthttp that auto decompress request body and auto compress response body with prefered client compression. Supports all IANA's initially registred tokens
According to RFCs there is no 'Accept-Encoding' header at server side response. It means you cannot tell clients (browsers, include headless browsers like curl/python's request) that your server accept compressed requests. But some of the backends (for example mod_deflate) support compressed http requests, thats why the same feature exists in this package.
There is other compression algorithm: LZW and Zstd. But overall score for encoding+transfer+decoding is the same. If you really want to increase content transfer performance, its better to use minification + compression (this package) + http2, rather then jumps between algos, because:
- users does not care which one we use, because only TTI (time to interactive) counts. There is no difference between 0.28sec TTI and 0.30sec TTI
- operation team does not care which one we use, because only total cost of io/cpu/ram counts. There is no win-win algo, who dramatically decrease it from 10k$ into 1k$
- other developers too lazy to enable any non gzip compression/decompression support, because time is money
package main
import (
"io"
"net/http"
"github.com/alexdyukov/compresshandler"
)
func main() {
echo := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
b, _ := io.ReadAll(r.Body)
w.Write(b)
})
compressConfig := compresshandler.Config{
GzipLevel: compresshandler.GzipDefaultCompression,
ZlibLevel: compresshandler.ZlibDefaultCompression,
BrotliLevel: compresshandler.BrotliDefaultCompression,
MinContentLength: 1400,
}
compress := compresshandler.NewNetHTTP(compressConfig)
http.ListenAndServe(":8080", compress(echo))
}
package main
import (
"github.com/alexdyukov/compresshandler"
"github.com/valyala/fasthttp"
)
func main() {
echo := func(ctx *fasthttp.RequestCtx) {
ctx.SetBody(ctx.Request.Body())
}
compressConfig := compresshandler.Config{
GzipLevel: compresshandler.GzipDefaultCompression,
ZlibLevel: compresshandler.ZlibDefaultCompression,
BrotliLevel: compresshandler.BrotliDefaultCompression,
MinContentLength: 1400,
}
compress := compresshandler.NewFastHTTP(compressConfig)
fasthttp.ListenAndServe(":8080", compress(echo))
}
MIT licensed. See the included LICENSE file for details.