A very specific Golang interface to the Dark Sky API for my Chrome Extension
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
1.2 KiB

  1. package main
  2. import (
  3. "compress/gzip"
  4. "encoding/json"
  5. "errors"
  6. "io"
  7. "io/ioutil"
  8. "net/http"
  9. )
  10. func get(client *http.Client, url string, output interface{}) error {
  11. req, err := http.NewRequest("GET", url, nil)
  12. if err != nil {
  13. return err
  14. }
  15. req.Header.Add("Content-Type", "application/json; charset=utf-8")
  16. req.Header.Add("Accept-Encoding", "gzip")
  17. response, err := client.Do(req)
  18. if err != nil {
  19. return err
  20. }
  21. defer response.Body.Close()
  22. err = checkErrors(response)
  23. if err != nil {
  24. return err
  25. }
  26. body, err := decompress(response)
  27. if err != nil {
  28. return err
  29. }
  30. return decodeJSON(body, &output)
  31. }
  32. func checkErrors(response *http.Response) error {
  33. if response.StatusCode != 200 {
  34. body, _ := ioutil.ReadAll(response.Body)
  35. return errors.New("Bad response: " + string(body))
  36. }
  37. return nil
  38. }
  39. func decompress(response *http.Response) (io.Reader, error) {
  40. header := response.Header.Get("Content-Encoding")
  41. if len(header) < 1 {
  42. return response.Body, nil
  43. }
  44. reader, err := gzip.NewReader(response.Body)
  45. if err != nil {
  46. return nil, err
  47. }
  48. return reader, nil
  49. }
  50. func decodeJSON(body io.Reader, into interface{}) error {
  51. jsonDecoder := json.NewDecoder(body)
  52. return jsonDecoder.Decode(&into)
  53. }