forked from adsbynimbus/nimbus-openrtb
/
response.go
68 lines (60 loc) · 1.45 KB
/
response.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package decode
import (
"compress/flate"
"compress/gzip"
"encoding/json"
"io"
"io/ioutil"
"net/http"
"github.com/francoispqt/gojay"
)
const (
gzipHeader = "gzip"
deflateHeader = "deflate"
)
// ResponseToStruct takes the response generically, checks the Content-Encoding
// and unmarshals the object to the provided data structure
func ResponseToStruct(res *http.Response, v interface{}) error {
var reader io.ReadCloser
var err error
switch res.Header.Get("Content-Encoding") {
case gzipHeader:
reader, err = gzip.NewReader(res.Body)
if err != nil {
return err
}
defer reader.Close()
case deflateHeader:
reader = flate.NewReader(res.Body)
defer reader.Close()
default:
reader = res.Body
}
decoder := gojay.BorrowDecoder(reader)
defer decoder.Release()
err = decoder.Decode(&v)
if err != nil {
return json.NewDecoder(reader).Decode(v)
}
return nil
}
// ResponseToBytes takes the Nimbus response, decodes if neccasary and returns the body as bytes
// if the Content-Encoding header is missing this can silently fail
func ResponseToBytes(res *http.Response) ([]byte, error) {
var reader io.ReadCloser
var err error
switch res.Header.Get("Content-Encoding") {
case gzipHeader:
reader, err = gzip.NewReader(res.Body)
if err != nil {
return nil, err
}
defer reader.Close()
case deflateHeader:
reader = flate.NewReader(res.Body)
defer reader.Close()
default:
reader = res.Body
}
return ioutil.ReadAll(reader)
}