From 3e62dda908730a276bf022ae14f74fbc047baaeb Mon Sep 17 00:00:00 2001 From: long Date: Sat, 24 Jan 2026 19:56:48 -0600 Subject: [PATCH] added gzip decompression of response body --- reddit/reddit.go | 32 ++++++++++++++++++++++++-------- reddit/reddit_test.go | 22 ++++++++++++++++++++++ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/reddit/reddit.go b/reddit/reddit.go index f218302..700dc28 100644 --- a/reddit/reddit.go +++ b/reddit/reddit.go @@ -2,6 +2,7 @@ package reddit import ( "bytes" + "compress/gzip" "context" "encoding/json" "fmt" @@ -372,15 +373,30 @@ func (c *Client) Do(ctx context.Context, req *http.Request, v interface{}) (*Res c.rateMu.Unlock() err = CheckResponse(resp) - if err != nil { + if err != nil || v == nil { return response, err } - if v != nil { - if w, ok := v.(io.Writer); ok { - _, err = io.Copy(w, response.Body) + w, ok := v.(io.Writer) + if ok { + _, err = io.Copy(w, response.Body) + if err != nil { + return response, err + } + } else { + if response.Header.Get("Content-Encoding") == "gzip" { + gzipReader, err := gzip.NewReader(resp.Body) if err != nil { - return response, err + return response, fmt.Errorf("Error creating gzip reader: %s", err) + } + defer gzipReader.Close() + b, err := io.ReadAll(gzipReader) + if err != nil { + return response, fmt.Errorf("Error decoding gzip json: %s", err) + } + err = json.Unmarshal(b, v) + if err != nil { + return response, fmt.Errorf("Error unmarshalling json: %s", err) } } else { err = json.NewDecoder(response.Body).Decode(v) @@ -388,10 +404,10 @@ func (c *Client) Do(ctx context.Context, req *http.Request, v interface{}) (*Res return response, err } } + } - if anchor, ok := v.(anchor); ok { - response.populateAnchors(anchor) - } + if anchor, ok := v.(anchor); ok { + response.populateAnchors(anchor) } return response, nil diff --git a/reddit/reddit_test.go b/reddit/reddit_test.go index f119004..4853cab 100644 --- a/reddit/reddit_test.go +++ b/reddit/reddit_test.go @@ -1,7 +1,9 @@ package reddit import ( + "compress/gzip" "context" + "encoding/json" "errors" "fmt" "io/ioutil" @@ -271,3 +273,23 @@ func TestClient_Do_RateLimitError(t *testing.T) { require.Equal(t, 600, resp.Rate.Used) require.Equal(t, time.Now().Truncate(time.Second).Add(time.Minute*4), resp.Rate.Reset) } + +func TestClient_Do_Gzip(t *testing.T) { + client, mux := setup(t) + expected := map[string]string{ + "message": "Hello!", + } + mux.HandleFunc("/api/v1/test", func(w http.ResponseWriter, r *http.Request) { + w.Header().Add("Content-Encoding", "gzip") + b, _ := json.Marshal(&expected) + zw := gzip.NewWriter(w) + zw.Write(b) + zw.Close() + }) + req, err := client.NewRequest(http.MethodGet, "api/v1/test", nil) + require.NoError(t, err) + result := map[string]string{} + _, err = client.Do(ctx, req, &result) + require.NoError(t, err) + require.Equal(t, result, expected) +}