Documentation ¶
Overview ¶
Example ¶
package main import ( "log" "net/http" "github.com/CAFxX/httpcompression" ) func main() { // Create a compression adapter with default configuration compress, err := httpcompression.DefaultAdapter() if err != nil { log.Fatal(err) } // Define your handler, and apply the compression adapter. http.Handle("/", compress(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello world!")) }))) // ... }
Output:
Index ¶
- Constants
- func Adapter(opts ...Option) (func(http.Handler) http.Handler, error)
- func DefaultAdapter(opts ...Option) (func(http.Handler) http.Handler, error)
- type CompressorProvider
- type Flusher
- type Option
- func BrotliCompressionLevel(level int) Option
- func BrotliCompressor(b CompressorProvider) Option
- func Compressor(contentEncoding string, priority int, compressor CompressorProvider) Option
- func ContentTypes(types []string, blacklist bool) Option
- func DeflateCompressionLevel(level int) Option
- func DeflateCompressor(g CompressorProvider) Option
- func GzipCompressionLevel(level int) Option
- func GzipCompressor(g CompressorProvider) Option
- func MinSize(size int) Option
- func Prefer(prefer PreferType) Option
- func ZstandardCompressor(b CompressorProvider) Option
- type PreferType
Examples ¶
Constants ¶
const ( // DefaultMinSize is the default minimum response body size for which we enable compression. // // 200 is a somewhat arbitrary number; in experiments compressing short text/markup-like sequences // with different compressors we saw that sequences shorter that ~180 the output generated by the // compressor would sometime be larger than the input. // This default may change between versions. // In general there can be no one-size-fits-all value: you will want to measure if a different // minimum size improves end-to-end performance for your workloads. DefaultMinSize = 200 )
Variables ¶
This section is empty.
Functions ¶
func Adapter ¶
Adapter returns a HTTP handler wrapping function (a.k.a. middleware) which can be used to wrap an HTTP handler to transparently compress the response body if the client supports it (via the Accept-Encoding header). It is possible to pass one or more options to modify the middleware configuration. If no options are provided, no compressors are enabled and therefore the adapter is a no-op. An error will be returned if invalid options are given.
func DefaultAdapter ¶
DefaultAdapter is like Adapter, but it includes sane defaults for general usage. Currently the defaults enable gzip and brotli compression, and set a minimum body size of 200 bytes. The provided opts override the defaults. The defaults are not guaranteed to remain constant over time: if you want to avoid this use Adapter directly.
Types ¶
type CompressorProvider ¶
type CompressorProvider interface { // Get returns a writer that writes compressed output to the supplied parent io.Writer. // Callers of Get() must ensure to always call Close() when the compressor is not needed // anymore. Callers of Close() must also ensure to not use the io.WriteCloser once Close() // is called. // Implementations of CompressorProvider are allowed to recycle the compressor (e.g. put the // WriteCloser in a pool to be reused by a later call to Get) when Close() is called. // The returned io.WriteCloser can optionally implement the Flusher interface if it is // able to flush data buffered internally. Get(parent io.Writer) (compressor io.WriteCloser) }
CompressorProvider is the interface for compression implementations.
func NewDefaultGzipCompressor ¶
func NewDefaultGzipCompressor(level int) (CompressorProvider, error)
type Flusher ¶
type Flusher interface { // Flush flushes the data buffered internally by the Writer. // Implementations of Flush do not need to internally flush the parent Writer. Flush() error }
Flusher is an optional interface that can be implemented by the compressors returned by CompressorProvider.Get().
type Option ¶
type Option func(c *config) error
Option can be passed to Handler to control its configuration.
func BrotliCompressionLevel ¶
BrotliCompressionLevel is an option that controls the Brotli compression level to be used when compressing payloads. The default is 3 (the same default used in the reference brotli C implementation).
func BrotliCompressor ¶
func BrotliCompressor(b CompressorProvider) Option
BrotliCompressor is an option to specify a custom compressor factory for Brotli.
func Compressor ¶
func Compressor(contentEncoding string, priority int, compressor CompressorProvider) Option
Compressor returns an Option that sets the CompressorProvider for a specific Content-Encoding. If multiple CompressorProviders are set for the same Content-Encoding, the last one is used. If compressor is nil, it disables the specified Content-Encoding. Priority is used to specify the priority of the Content-Encoding. A higher number means higher priority. See PreferType to understand how priority is used to select the Content-Encoding for a specific request.
func ContentTypes ¶
ContentTypes specifies a list of content types to compare the Content-Type header to before compressing. If none match, and blacklist is false, the response will be returned as-is.
Content types are compared in a case-insensitive, whitespace-ignored manner.
A MIME type without any other directive will match a content type that has the same MIME type, regardless of that content type's other directives. I.e., "text/html" will match both "text/html" and "text/html; charset=utf-8".
A MIME type with any other directive will only match a content type that has the same MIME type and other directives. I.e., "text/html; charset=utf-8" will only match "text/html; charset=utf-8".
If blacklist is true then only content types that do not match the provided list of types are compressed. If blacklist is false, only content types that match the provided list are compressed.
By default, responses are compressed regardless of Content-Type.
func DeflateCompressionLevel ¶ added in v0.0.7
DeflateCompressionLevel is an option that controls the Deflate compression level to be used when compressing payloads. The default is flate.DefaultCompression.
func DeflateCompressor ¶ added in v0.0.7
func DeflateCompressor(g CompressorProvider) Option
DeflateCompressor is an option to specify a custom compressor factory for Deflate.
func GzipCompressionLevel ¶
GzipCompressionLevel is an option that controls the Gzip compression level to be used when compressing payloads. The default is gzip.DefaultCompression.
func GzipCompressor ¶
func GzipCompressor(g CompressorProvider) Option
GzipCompressor is an option to specify a custom compressor factory for Gzip.
func MinSize ¶
MinSize is an option that controls the minimum size of payloads that should be compressed. The default is DefaultMinSize.
func Prefer ¶
func Prefer(prefer PreferType) Option
Prefer controls the behavior of the middleware in case both Gzip and Brotli can be used to compress a response (i.e. in case the client supports both encodings, and the MIME type of the response is allowed for both encodings). See the comments on the PreferType constants for the supported values.
func ZstandardCompressor ¶ added in v0.0.7
func ZstandardCompressor(b CompressorProvider) Option
ZstandardCompressor is an option to specify a custom compressor factory for Zstandard.
type PreferType ¶
type PreferType byte
PreferType allows to control the choice of compression algorithm when multiple algorithms are allowed by both client and server.
const ( // PreferServer prefers compressors in the order specified on the server. // If two or more compressors have the same priority on the server, the client preference is taken into consideration. // If both server and client do no specify a preference between two or more compressors, the order is determined by the name of the encoding. // PreferServer is the default. PreferServer PreferType = iota // PreferClient prefers compressors in the order specified by the client. // If two or more compressors have the same priority according to the client, the server priority is taken into consideration. // If both server and client do no specify a preference between two or more compressors, the order is determined by the name of the encoding. PreferClient )