Created
November 21, 2016 14:12
-
-
Save ian-kent/096767cf7cac72d62b119f42dd3181aa to your computer and use it in GitHub Desktop.
zebedee client
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package zebedee | |
import ( | |
"errors" | |
"fmt" | |
"io" | |
"io/ioutil" | |
"net/http" | |
"net/url" | |
"time" | |
) | |
var ( | |
ErrCreatingRequest = errors.New("error creating request") | |
ErrCallingZebedee = errors.New("error calling zebedee") | |
ErrUnexpectedStatusCode = errors.New("unexpected status code") | |
ErrReadingBody = errors.New("error reading body") | |
) | |
type zebedeeError struct { | |
error | |
ZebedeeError error | |
URI string | |
StatusCode int | |
} | |
type zClient struct { | |
*http.Client | |
URL string | |
} | |
func CreateZClient(timeout time.Duration, zebedeeURL string) Service { | |
return &zClient{ | |
Client: &http.Client{ | |
Timeout: timeout, | |
}, | |
URL: zebedeeURL, | |
} | |
} | |
func (z *zClient) GetData(uri string) ([]byte, string, error) { | |
q := &url.Values{} | |
q.Add("uri", uri) | |
b, res, err := z.get(z.URL+"/data", q) | |
if err != nil { | |
return nil, "", err | |
} | |
return b, res.Header.Get("ONS-Page-Type"), nil | |
} | |
func (z *zClient) GetTaxonomy(uri string, depth int) ([]byte, error) { | |
q := &url.Values{} | |
q.Add("uri", uri) | |
q.Add("depth", fmt.Sprintf("%d", depth)) | |
b, _, err := z.get(z.URL+"/taxonomy", q) | |
if err != nil { | |
return nil, err | |
} | |
return b, nil | |
} | |
func (z *zClient) GetParents(uri string) ([]byte, error) { | |
q := &url.Values{} | |
q.Add("uri", uri) | |
b, _, err := z.get(z.URL+"/parents", q) | |
if err != nil { | |
return nil, err | |
} | |
return b, nil | |
} | |
func (z *zClient) GetTimeSeries(uri string) ([]byte, error) { | |
q := &url.Values{} | |
q.Add("uri", uri) | |
q.Add("series", "1") | |
b, _, err := z.get(z.URL+"/data", q) | |
if err != nil { | |
return nil, err | |
} | |
return b, nil | |
} | |
func (z *zClient) get(uri string, query *url.Values) ([]byte, *http.Response, error) { | |
req, err := http.NewRequest("GET", uri, nil) | |
if err != nil { | |
return nil, nil, zebedeeError{err, ErrCreatingRequest, uri, 0} | |
} | |
res, err := z.Client.Do(req) | |
if err != nil { | |
return nil, res, zebedeeError{err, ErrCallingZebedee, uri, 0} | |
} | |
defer res.Body.Close() | |
if res.StatusCode != 200 { | |
io.Copy(ioutil.Discard, res.Body) | |
return nil, res, zebedeeError{err, ErrUnexpectedStatusCode, uri, res.StatusCode} | |
} | |
b, err := ioutil.ReadAll(res.Body) | |
if err != nil { | |
return nil, res, zebedeeError{err, ErrReadingBody, uri, res.StatusCode} | |
} | |
return b, res, nil | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment