2015-12-07 04:01:03 +00:00
|
|
|
package src
|
|
|
|
|
|
|
|
//from yadisk
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"net/http"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ErrorResponse represents erroneous API response.
|
|
|
|
// Implements go's built in `error`.
|
|
|
|
type ErrorResponse struct {
|
|
|
|
ErrorName string `json:"error"`
|
|
|
|
Description string `json:"description"`
|
|
|
|
Message string `json:"message"`
|
|
|
|
|
|
|
|
StatusCode int `json:""`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *ErrorResponse) Error() string {
|
|
|
|
return fmt.Sprintf("[%d - %s] %s (%s)", e.StatusCode, e.ErrorName, e.Description, e.Message)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ProccessErrorResponse tries to represent data passed as
|
|
|
|
// an ErrorResponse object.
|
|
|
|
func ProccessErrorResponse(data io.Reader) (*ErrorResponse, error) {
|
|
|
|
dec := json.NewDecoder(data)
|
|
|
|
var errorResponse ErrorResponse
|
|
|
|
|
|
|
|
if err := dec.Decode(&errorResponse); err == io.EOF {
|
|
|
|
// ok
|
|
|
|
} else if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: check if there is any trash data after JSON and crash if there is.
|
|
|
|
|
|
|
|
return &errorResponse, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// CheckAPIError is a convenient function to turn erroneous
|
2015-12-30 13:30:57 +00:00
|
|
|
// API response into go error. It closes the Body on error.
|
|
|
|
func CheckAPIError(resp *http.Response) (err error) {
|
2015-12-07 04:01:03 +00:00
|
|
|
if resp.StatusCode >= 200 && resp.StatusCode < 400 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-12-30 13:30:57 +00:00
|
|
|
defer CheckClose(resp.Body, &err)
|
|
|
|
|
2015-12-07 04:01:03 +00:00
|
|
|
errorResponse, err := ProccessErrorResponse(resp.Body)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
errorResponse.StatusCode = resp.StatusCode
|
|
|
|
|
|
|
|
return errorResponse
|
|
|
|
}
|
|
|
|
|
|
|
|
// ProccessErrorString tries to represent data passed as
|
|
|
|
// an ErrorResponse object.
|
|
|
|
func ProccessErrorString(data string) (*ErrorResponse, error) {
|
|
|
|
var errorResponse ErrorResponse
|
|
|
|
if err := json.Unmarshal([]byte(data), &errorResponse); err == nil {
|
|
|
|
// ok
|
|
|
|
} else if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: check if there is any trash data after JSON and crash if there is.
|
|
|
|
|
|
|
|
return &errorResponse, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParseAPIError Parse json error response from API
|
|
|
|
func (c *Client) ParseAPIError(jsonErr string) (string, error) { //ErrorName
|
|
|
|
errorResponse, err := ProccessErrorString(jsonErr)
|
|
|
|
if err != nil {
|
|
|
|
return err.Error(), err
|
|
|
|
}
|
|
|
|
|
|
|
|
return errorResponse.ErrorName, nil
|
|
|
|
}
|