middleware/compress.go
func (c *Compressor) SetEncoder(encoding string, fn EncoderFunc) {
	encoding = strings.ToLower(encoding)
	if encoding == "" {
		panic("the encoding can not be empty")
	}
	if fn == nil {
		panic("attempted to set a nil encoder function")
	}

	// If we are adding a new encoder that is already registered, we have to
	// clear that one out first.
	if _, ok := c.pooledEncoders[encoding]; ok {
		delete(c.pooledEncoders, encoding)
	}
	if _, ok := c.encoders[encoding]; ok {
		delete(c.encoders, encoding)
	}

	// If the encoder supports Resetting (IoReseterWriter), then it can be pooled.
	encoder := fn(ioutil.Discard, c.level)
	if encoder != nil {
		if _, ok := encoder.(ioResetterWriter); ok {
			pool := &sync.Pool{
				New: func() interface{} {
					return fn(ioutil.Discard, c.level)
				},
			}
			c.pooledEncoders[encoding] = pool
		}
	}
	// If the encoder is not in the pooledEncoders, add it to the normal encoders.
	if _, ok := c.pooledEncoders[encoding]; !ok {
		c.encoders[encoding] = fn
	}

	for i, v := range c.encodingPrecedence {
		if v == encoding {
			c.encodingPrecedence = append(c.encodingPrecedence[:i], c.encodingPrecedence[i+1:]...)
		}
	}

	c.encodingPrecedence = append([]string{encoding}, c.encodingPrecedence...)
}
func (c *Compressor) SetEncoder(encoding string, fn EncoderFunc) {
	encoding = strings.ToLower(encoding)
	if encoding == "" {
		panic("the encoding can not be empty")
	}
	if fn == nil {
		panic("attempted to set a nil encoder function")
	}

	// If we are adding a new encoder that is already registered, we have to
	// clear that one out first.
	if _, ok := c.pooledEncoders[encoding]; ok {
		delete(c.pooledEncoders, encoding)
	}
	if _, ok := c.encoders[encoding]; ok {
		delete(c.encoders, encoding)
	}

	// If the encoder supports Resetting (IoReseterWriter), then it can be pooled.
	encoder := fn(ioutil.Discard, c.level)
	if encoder != nil {
		if _, ok := encoder.(ioResetterWriter); ok {
			pool := &sync.Pool{
				New: func() interface{} {
					return fn(ioutil.Discard, c.level)
				},
			}
			c.pooledEncoders[encoding] = pool
		}
	}
	// If the encoder is not in the pooledEncoders, add it to the normal encoders.
	if _, ok := c.pooledEncoders[encoding]; !ok {
		c.encoders[encoding] = fn
	}

	for i, v := range c.encodingPrecedence {
		if v == encoding {
			c.encodingPrecedence = append(c.encodingPrecedence[:i], c.encodingPrecedence[i+1:]...)
		}
	}

	c.encodingPrecedence = append([]string{encoding}, c.encodingPrecedence...)
}
func ( c * Compressor ) SetEncoder ( encoding string , fn EncoderFunc ) { encoding = strings . ToLower ( encoding ) if encoding == " " { panic ( " " ) } if fn == nil { panic ( " " ) } // If we are adding a new encoder that is already registered, we have to // clear that one out first. if _ , ok := c . pooledEncoders [ encoding ] ; ok { delete ( c . pooledEncoders , encoding ) } if _ , ok := c . encoders [ encoding ] ; ok { delete ( c . encoders , encoding ) } // If the encoder supports Resetting (IoReseterWriter), then it can be pooled. encoder := fn ( ioutil . Discard , c . level ) if encoder != nil { if _ , ok := encoder . ( ioResetterWriter ) ; ok { pool := & sync . Pool { New : func ( ) interface { } { return fn ( ioutil . Discard , c . level ) } , } c . pooledEncoders [ encoding ] = pool } } // If the encoder is not in the pooledEncoders, add it to the normal encoders. if _ , ok := c . pooledEncoders [ encoding ] ; ! ok { c . encoders [ encoding ] = fn } for i , v := range c . encodingPrecedence { if v == encoding { c . encodingPrecedence = append ( c . encodingPrecedence [ : i ] , c . encodingPrecedence [ i + 1 : ] ... ) } } c . encodingPrecedence = append ( [ ] string { encoding } , c . encodingPrecedence ... ) }
// SetEncoder can be used to set the implementation of a compression algorithm.
//
// The encoding should be a standardised identifier. See:
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
//
// For example, add the Brotli algortithm:
//
//  import brotli_enc "gopkg.in/kothar/brotli-go.v0/enc"
//
//  compressor := middleware.NewCompressor(5, "text/html")
//  compressor.SetEncoder("br", func(w http.ResponseWriter, level int) io.Writer {
//    params := brotli_enc.NewBrotliParams()
//    params.SetQuality(level)
//    return brotli_enc.NewBrotliWriter(params, w)
//  })
SetEncoder can be used to set the implementation of a compression algorithm . The encoding should be a standardised identifier . See : https : // developer . mozilla . org / en - US / docs / Web / HTTP / Headers / Accept - Encoding For example add the Brotli algortithm : import brotli_enc gopkg . in / kothar / brotli - go . v0 / enc compressor : = middleware . NewCompressor ( 5 text / html ) compressor . SetEncoder ( br func ( w http . ResponseWriter level int ) io . Writer { params : = brotli_enc . NewBrotliParams () params . SetQuality ( level ) return brotli_enc . NewBrotliWriter ( params w ) } )