Constructs a new compressedResponseWriter based on client request headers.
(writer http.ResponseWriter, req *http.Request)
| 53 | |
| 54 | // Constructs a new compressedResponseWriter based on client request headers. |
| 55 | func newCompressedResponseWriter(writer http.ResponseWriter, req *http.Request) *compressedResponseWriter { |
| 56 | encodings := strings.SplitSeq(req.Header.Get(acceptEncodingHeader), ",") |
| 57 | for encoding := range encodings { |
| 58 | switch strings.TrimSpace(encoding) { |
| 59 | case zstdEncoding: |
| 60 | encoder, err := zstd.NewWriter(writer) |
| 61 | if err == nil { |
| 62 | writer.Header().Set(contentEncodingHeader, zstdEncoding) |
| 63 | return &compressedResponseWriter{ResponseWriter: writer, writer: encoder} |
| 64 | } |
| 65 | case snappyEncoding: |
| 66 | writer.Header().Set(contentEncodingHeader, snappyEncoding) |
| 67 | return &compressedResponseWriter{ResponseWriter: writer, writer: snappy.NewBufferedWriter(writer)} |
| 68 | case gzipEncoding: |
| 69 | writer.Header().Set(contentEncodingHeader, gzipEncoding) |
| 70 | return &compressedResponseWriter{ResponseWriter: writer, writer: gzip.NewWriter(writer)} |
| 71 | case deflateEncoding: |
| 72 | writer.Header().Set(contentEncodingHeader, deflateEncoding) |
| 73 | return &compressedResponseWriter{ResponseWriter: writer, writer: zlib.NewWriter(writer)} |
| 74 | } |
| 75 | } |
| 76 | return &compressedResponseWriter{ResponseWriter: writer, writer: writer} |
| 77 | } |
| 78 | |
| 79 | // CompressionHandler is a wrapper around http.Handler which adds suitable |
| 80 | // response compression based on the client's Accept-Encoding headers. |