README ¶
Gzip Handler
This is a tiny Go package which wraps HTTP handlers to transparently gzip the response body, for clients which support it. Although it's usually simpler to leave that to a reverse proxy (like nginx or Varnish), this package is useful when that's undesirable.
This is forked from the original repo at https://github.com/nytimes/gziphandler with this PR included.
Install
go get -u github.com/mattermost/gziphandler
Usage
Call GzipHandler
with any handler (an object which implements the
http.Handler
interface), and it'll return a new handler which gzips the
response. For example:
package main
import (
"io"
"net/http"
"github.com/mattermost/gziphandler"
)
func main() {
withoutGz := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain")
io.WriteString(w, "Hello, World")
})
withGz := gziphandler.GzipHandler(withoutGz)
http.Handle("/", withGz)
http.ListenAndServe("0.0.0.0:8000", nil)
}
Documentation
The docs can be found at godoc.org, as usual.
License
Documentation ¶
Index ¶
- Constants
- func CompressionLevel(level int) option
- func ContentTypes(types []string) option
- func GzipHandler(h http.Handler) http.Handler
- func GzipHandlerWithOpts(opts ...option) (func(http.Handler) http.Handler, error)
- func MinSize(size int) option
- func MustNewGzipLevelHandler(level int) func(http.Handler) http.Handler
- func NewGzipLevelAndMinSize(level, minSize int) (func(http.Handler) http.Handler, error)
- func NewGzipLevelHandler(level int) (func(http.Handler) http.Handler, error)
- type GzipResponseWriter
- func (w *GzipResponseWriter) Close() error
- func (w *GzipResponseWriter) Flush()
- func (w *GzipResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error)
- func (w *GzipResponseWriter) Push(target string, opts *http.PushOptions) error
- func (w *GzipResponseWriter) Write(b []byte) (int, error)
- func (w *GzipResponseWriter) WriteHeader(code int)
- type GzipResponseWriterWithCloseNotify
Constants ¶
const ( // DefaultQValue is the default qvalue to assign to an encoding if no explicit qvalue is set. // This is actually kind of ambiguous in RFC 2616, so hopefully it's correct. // The examples seem to indicate that it is. DefaultQValue = 1.0 // DefaultMinSize is the default minimum size until we enable gzip compression. // 1500 bytes is the MTU size for the internet since that is the largest size allowed at the network layer. // If you take a file that is 1300 bytes and compress it to 800 bytes, it’s still transmitted in that same 1500 byte packet regardless, so you’ve gained nothing. // That being the case, you should restrict the gzip compression to files with a size greater than a single packet, 1400 bytes (1.4KB) is a safe value. DefaultMinSize = 1400 )
Variables ¶
This section is empty.
Functions ¶
func CompressionLevel ¶
func CompressionLevel(level int) option
func ContentTypes ¶
func ContentTypes(types []string) option
ContentTypes specifies a list of content types to compare the Content-Type header to before compressing. If none match, 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".
By default, responses are gzipped regardless of Content-Type.
func GzipHandler ¶
GzipHandler wraps an HTTP handler, to transparently gzip the response body if the client supports it (via the Accept-Encoding header). This will compress at the default compression level.
func GzipHandlerWithOpts ¶
func MustNewGzipLevelHandler ¶
MustNewGzipLevelHandler behaves just like NewGzipLevelHandler except that in an error case it panics rather than returning an error.
func NewGzipLevelAndMinSize ¶
NewGzipLevelAndMinSize behave as NewGzipLevelHandler except it let the caller specify the minimum size before compression.
func NewGzipLevelHandler ¶
NewGzipLevelHandler returns a wrapper function (often known as middleware) which can be used to wrap an HTTP handler to transparently gzip the response body if the client supports it (via the Accept-Encoding header). Responses will be encoded at the given gzip compression level. An error will be returned only if an invalid gzip compression level is given, so if one can ensure the level is valid, the returned error can be safely ignored.
Types ¶
type GzipResponseWriter ¶
type GzipResponseWriter struct { http.ResponseWriter // contains filtered or unexported fields }
GzipResponseWriter provides an http.ResponseWriter interface, which gzips bytes before writing them to the underlying response. This doesn't close the writers, so don't forget to do that. It can be configured to skip response smaller than minSize.
func (*GzipResponseWriter) Close ¶
func (w *GzipResponseWriter) Close() error
Close will close the gzip.Writer and will put it back in the gzipWriterPool.
func (*GzipResponseWriter) Flush ¶
func (w *GzipResponseWriter) Flush()
Flush flushes the underlying *gzip.Writer and then the underlying http.ResponseWriter if it is an http.Flusher. This makes GzipResponseWriter an http.Flusher.
func (*GzipResponseWriter) Hijack ¶
func (w *GzipResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error)
Hijack implements http.Hijacker. If the underlying ResponseWriter is a Hijacker, its Hijack method is returned. Otherwise an error is returned.
func (*GzipResponseWriter) Push ¶
func (w *GzipResponseWriter) Push(target string, opts *http.PushOptions) error
Push initiates an HTTP/2 server push. Push returns ErrNotSupported if the client has disabled push or if push is not supported on the underlying connection.
func (*GzipResponseWriter) Write ¶
func (w *GzipResponseWriter) Write(b []byte) (int, error)
Write appends data to the gzip writer.
func (*GzipResponseWriter) WriteHeader ¶
func (w *GzipResponseWriter) WriteHeader(code int)
WriteHeader just saves the response code until close or GZIP effective writes.
type GzipResponseWriterWithCloseNotify ¶
type GzipResponseWriterWithCloseNotify struct {
*GzipResponseWriter
}
func (GzipResponseWriterWithCloseNotify) CloseNotify ¶
func (w GzipResponseWriterWithCloseNotify) CloseNotify() <-chan bool