added gzip decompression of response body

This commit is contained in:
2026-01-24 19:56:48 -06:00
parent 519f3f4f00
commit 3e62dda908
2 changed files with 46 additions and 8 deletions
+20 -4
View File
@@ -2,6 +2,7 @@ package reddit
import ( import (
"bytes" "bytes"
"compress/gzip"
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
@@ -372,27 +373,42 @@ func (c *Client) Do(ctx context.Context, req *http.Request, v interface{}) (*Res
c.rateMu.Unlock() c.rateMu.Unlock()
err = CheckResponse(resp) err = CheckResponse(resp)
if err != nil { if err != nil || v == nil {
return response, err return response, err
} }
if v != nil { w, ok := v.(io.Writer)
if w, ok := v.(io.Writer); ok { if ok {
_, err = io.Copy(w, response.Body) _, err = io.Copy(w, response.Body)
if err != nil { if err != nil {
return response, err return response, err
} }
} else {
if response.Header.Get("Content-Encoding") == "gzip" {
gzipReader, err := gzip.NewReader(resp.Body)
if err != nil {
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 { } else {
err = json.NewDecoder(response.Body).Decode(v) err = json.NewDecoder(response.Body).Decode(v)
if err != nil { if err != nil {
return response, err return response, err
} }
} }
}
if anchor, ok := v.(anchor); ok { if anchor, ok := v.(anchor); ok {
response.populateAnchors(anchor) response.populateAnchors(anchor)
} }
}
return response, nil return response, nil
} }
+22
View File
@@ -1,7 +1,9 @@
package reddit package reddit
import ( import (
"compress/gzip"
"context" "context"
"encoding/json"
"errors" "errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
@@ -271,3 +273,23 @@ func TestClient_Do_RateLimitError(t *testing.T) {
require.Equal(t, 600, resp.Rate.Used) require.Equal(t, 600, resp.Rate.Used)
require.Equal(t, time.Now().Truncate(time.Second).Add(time.Minute*4), resp.Rate.Reset) 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)
}