rest.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package rest
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "net/http"
  8. )
  9. func getDetailedError(data []byte, err error) error {
  10. var limit int64 = 20
  11. syntaxError, ok := err.(*json.SyntaxError)
  12. if ok {
  13. end := syntaxError.Offset - 1 + limit
  14. dataLength := int64(len(data))
  15. if end > dataLength {
  16. end = dataLength
  17. }
  18. badPart := string(data[syntaxError.Offset-1 : end])
  19. return fmt.Errorf("%s:\n%s", err.Error(), badPart)
  20. }
  21. typeError, ok := err.(*json.UnmarshalTypeError)
  22. if ok {
  23. start := typeError.Offset - limit
  24. if start < 0 {
  25. start = 0
  26. }
  27. badPart := string(data[start:typeError.Offset])
  28. return fmt.Errorf("%s:\n%s", err.Error(), badPart)
  29. }
  30. return err
  31. }
  32. //JSONDecoder decodes json from given bytes array to target object.
  33. func JSONDecoder(data []byte, target interface{}) error {
  34. err := json.Unmarshal(data, target)
  35. if err != nil {
  36. err = getDetailedError(data, err)
  37. }
  38. return err
  39. }
  40. //GET returns bytes buffer of response body.
  41. func GET(url string) (*bytes.Buffer, error) {
  42. resp, err := http.Get(url)
  43. if resp != nil {
  44. defer resp.Body.Close()
  45. }
  46. if err != nil {
  47. return nil, fmt.Errorf("Response error: %v", err)
  48. }
  49. body, err := BodyToBuffer(resp.Body)
  50. if err != nil {
  51. return nil, fmt.Errorf("Error reading body: %v", err)
  52. }
  53. if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent {
  54. return body, fmt.Errorf("Request unsuccessful: %v - %v", resp.Status, url)
  55. }
  56. return body, nil
  57. }
  58. //BodyToBuffer reads data from ReadCloser and returns bytes buffer.
  59. func BodyToBuffer(data io.ReadCloser) (*bytes.Buffer, error) {
  60. var buffer bytes.Buffer
  61. _, err := buffer.ReadFrom(data)
  62. if err != nil {
  63. return nil, err
  64. }
  65. return &buffer, nil
  66. }