package gziphandler import ( "compress/gzip" "io" "net" "net/http" "strings" "testing" ) type d struct { data string gzip bool } func TestHandler(t *testing.T) { data := []d{ {"abc", true}, {"qweqweqwe", false}, {"lkajwdlajwdlkajwdlkjawl", true}, } http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { _, err := io.Copy(w, r.Body) if err != nil { t.Fatal(err) } }) handler := Handler(http.DefaultServeMux) l, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { t.Fatal(err) } defer l.Close() go http.Serve(l, handler) for _, d := range data { doReq(t, d) } } func doReq(t *testing.T, d d) { req, err := http.NewRequest(http.MethodPost, "http://127.0.0.1:8080/test", strings.NewReader(d.data)) if err != nil { t.Fatal(err) } if d.gzip { req.Header.Set("Accept-Encoding", "gzip") } resp, err := http.DefaultClient.Do(req) if err != nil { t.Fatal(err) } defer resp.Body.Close() var sb strings.Builder r := resp.Body if d.gzip { ce := resp.Header.Get("Content-Encoding") if ce != "gzip" { t.Errorf("expected content encoding %s, got %s", "gzip", ce) } r, err = gzip.NewReader(resp.Body) if err != nil { t.Fatal(err) } } _, err = io.Copy(&sb, r) if err != nil { t.Fatal(err) } s := sb.String() if d.data != s { t.Errorf("expected response %s, got %s", d.data, s) } }