added gzip decompression of response body
This commit is contained in:
+24
-8
@@ -2,6 +2,7 @@ package reddit
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"compress/gzip"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -372,15 +373,30 @@ 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 {
|
||||||
|
return response, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if response.Header.Get("Content-Encoding") == "gzip" {
|
||||||
|
gzipReader, err := gzip.NewReader(resp.Body)
|
||||||
if err != nil {
|
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 {
|
} else {
|
||||||
err = json.NewDecoder(response.Body).Decode(v)
|
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
|
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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user