Categorygithub.com/johejo/go-content-encoding
modulepackage
0.0.0-20220721183050-9ea4a7717479
Repository: https://github.com/johejo/go-content-encoding.git
Documentation: pkg.go.dev

# README

go-content-encoding

ci go.dev reference codecov Go Report Card

Description

go-content-encoding provides net/http compatible middleware for HTTP Content-Encoding.
It also provides the functionality to customize the decoder.
By default, br(brotli), gzip and zstd(zstandard) are supported.

Example

package contentencoding_test

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/http/httptest"
	"strings"

	contentencoding "github.com/johejo/go-content-encoding"
)

func ExampleDecode() {
	handler := func(w http.ResponseWriter, r *http.Request) {
		b, err := ioutil.ReadAll(r.Body)
		if err != nil {
			panic(err)
		}
		log.Println(b) // decoded body
	}

	mux := http.NewServeMux()
	decode := contentencoding.Decode()
	mux.Handle("/", decode(http.HandlerFunc(handler)))
}

func ExampleWithDecoder() {
	customDecoder := &contentencoding.Decoder{
		Encoding: "custom",
		Handler: func(w http.ResponseWriter, r *http.Request) error {
			b, err := ioutil.ReadAll(r.Body)
			if err != nil {
				return err
			}
			r.Body = ioutil.NopCloser(strings.NewReader(string(b) + "-custom"))
			return nil
		},
	}
	mux := http.NewServeMux()
	dm := contentencoding.Decode(contentencoding.WithDecoder(customDecoder))
	mux.Handle("/", dm(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		b, err := ioutil.ReadAll(r.Body)
		if err != nil {
			panic(err)
		}
		fmt.Println(string(b))
	})))
	rec := httptest.NewRecorder()
	req := httptest.NewRequest(http.MethodPost, "/", strings.NewReader("test"))
	req.Header.Set("Content-Encoding", "custom")
	mux.ServeHTTP(rec, req)

	// Output:
	// test-custom
}

func ExampleWithErrorHandler() {
	mux := http.NewServeMux()
	errHandler := contentencoding.ErrorHandler(func(w http.ResponseWriter, r *http.Request, err error) {
		w.WriteHeader(999) // custom error code
	})
	dm := contentencoding.Decode(contentencoding.WithErrorHandler(errHandler))
	mux.Handle("/", dm(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})))
	rec := httptest.NewRecorder()
	req := httptest.NewRequest(http.MethodPost, "/", strings.NewReader("test")) // not compressed
	req.Header.Set("Content-Encoding", "gzip")
	mux.ServeHTTP(rec, req)
	fmt.Println(rec.Code)

	// Output:
	// 999
}

License

MIT

Author

Mitsuo Heijo (@johejo)

# Functions

Decode returns net/http compatible middleware that automatically decodes body detected by Content-Encoding.
DefaultErrorHandler is ErrorHandler that will used by default.
WithDecoder returns a Option to use Decode with Decoder.
WithDOptions returns a Option to customize zstd decoder with zstd.DOptions.
WithErrorHandler returns a Option to customize error handling.

# Structs

Decoder is custom decoder for user defined Content-Encoding.

# Type aliases

ErrorHandler is a type used to customize error handling.
Option is option for Decode.