From 2e227088e280a42773bdfcc0e129d1e2e3d74303 Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 26 Jan 2020 17:50:51 +0000 Subject: [PATCH] initial commit --- gzipresponsewriter.go | 36 ++++++++++++++++++++++++++++++++++++ gzipresponsewriter_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100755 gzipresponsewriter.go create mode 100755 gzipresponsewriter_test.go diff --git a/gzipresponsewriter.go b/gzipresponsewriter.go new file mode 100755 index 0000000..7ac071d --- /dev/null +++ b/gzipresponsewriter.go @@ -0,0 +1,36 @@ +package gziphttp + +import ( + "compress/gzip" + "net/http" +) + +type GZipResponseWriter struct { + w http.ResponseWriter + gz *gzip.Writer +} + +func New(w http.ResponseWriter) *GZipResponseWriter { + w.Header().Add("Content-Type", "text/html") + w.Header().Add("Content-Encoding", "gzip") + return &GZipResponseWriter{ + w: w, + gz: gzip.NewWriter(w), + } +} + +func (gz *GZipResponseWriter) Header() http.Header { + return gz.w.Header() +} + +func (gz *GZipResponseWriter) WriteHeader(statusCode int) { + gz.w.WriteHeader(statusCode) +} + +func (gz *GZipResponseWriter) Write(b []byte) (int, error) { + return gz.gz.Write(b) +} + +func (gz *GZipResponseWriter) Close() error { + return gz.gz.Close() +} diff --git a/gzipresponsewriter_test.go b/gzipresponsewriter_test.go new file mode 100755 index 0000000..9bb6f86 --- /dev/null +++ b/gzipresponsewriter_test.go @@ -0,0 +1,34 @@ +package gziphttp + +import ( + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" +) + +func TestGZipResponseWriter(t *testing.T) { + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + gz := New(w) + defer gz.Close() + fmt.Fprintln(gz, "Hello world") + })) + defer s.Close() + + req := httptest.NewRequest("GET", s.URL, nil) + req.RequestURI = "" + resp, err := http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + t.Fatal(resp.StatusCode) + } + if b, err := ioutil.ReadAll(resp.Body); err != nil { + t.Fatal(err) + } else if s := string(b); s != "Hello world\n" { + t.Fatalf("%q", s) + } +}