123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- package rest
- import (
- "bytes"
- "encoding/json"
- "fmt"
- "io"
- "net/http"
- )
- func getDetailedError(data []byte, err error) error {
- var limit int64 = 20
- syntaxError, ok := err.(*json.SyntaxError)
- if ok {
- start := syntaxError.Offset - 1
- if start < 0 {
- start = 0
- }
- end := start + limit
- dataLength := int64(len(data))
- if end > dataLength {
- end = dataLength
- }
- badPart := string(data[start:end])
- return fmt.Errorf("%s:\n%s", err.Error(), badPart)
- }
- typeError, ok := err.(*json.UnmarshalTypeError)
- if ok {
- start := typeError.Offset - limit
- if start < 0 {
- start = 0
- }
- badPart := string(data[start:typeError.Offset])
- return fmt.Errorf("%s:\n%s", err.Error(), badPart)
- }
- return err
- }
- //JSONDecoder decodes json from given bytes array to target object.
- func JSONDecoder(data []byte, target interface{}) error {
- err := json.Unmarshal(data, target)
- if err != nil {
- err = getDetailedError(data, err)
- }
- return err
- }
- //GET returns bytes buffer of response body.
- func GET(url string) (*bytes.Buffer, error) {
- resp, err := http.Get(url)
- if resp != nil {
- defer resp.Body.Close()
- }
- if err != nil {
- return nil, fmt.Errorf("Response error: %v", err)
- }
- body, err := BodyToBuffer(resp.Body)
- if err != nil {
- return nil, fmt.Errorf("Error reading body: %v", err)
- }
- if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent {
- return body, fmt.Errorf("Request unsuccessful: %v - %v", resp.Status, url)
- }
- return body, nil
- }
- //HEAD returns map[string][]string of response header.
- func HEAD(url string) (map[string][]string, error) {
- resp, err := http.Head(url)
- if err != nil {
- return nil, fmt.Errorf("Response error: %v", err)
- }
- if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent {
- return resp.Header, fmt.Errorf("Request unsuccessful: %v - %v", resp.Status, url)
- }
- return resp.Header, nil
- }
- //BodyToBuffer reads data from ReadCloser and returns bytes buffer.
- func BodyToBuffer(data io.ReadCloser) (*bytes.Buffer, error) {
- var buffer bytes.Buffer
- _, err := buffer.ReadFrom(data)
- if err != nil {
- return nil, err
- }
- return &buffer, nil
- }
|