0489f9e4e0
lets return an error if a 422 occurs and return the error message to the caller in case there is missing or invalid data in the request
104 lines
2.4 KiB
Go
104 lines
2.4 KiB
Go
// Copyright 2014 The Gogs Authors. All rights reserved.
|
|
// Use of this source code is governed by a MIT-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package gitea
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
// Version return the library version
|
|
func Version() string {
|
|
return "0.12.3"
|
|
}
|
|
|
|
// Client represents a Gogs API client.
|
|
type Client struct {
|
|
url string
|
|
accessToken string
|
|
client *http.Client
|
|
}
|
|
|
|
// NewClient initializes and returns a API client.
|
|
func NewClient(url, token string) *Client {
|
|
return &Client{
|
|
url: strings.TrimSuffix(url, "/"),
|
|
accessToken: token,
|
|
client: &http.Client{},
|
|
}
|
|
}
|
|
|
|
// SetHTTPClient replaces default http.Client with user given one.
|
|
func (c *Client) SetHTTPClient(client *http.Client) {
|
|
c.client = client
|
|
}
|
|
|
|
func (c *Client) doRequest(method, path string, header http.Header, body io.Reader) (*http.Response, error) {
|
|
req, err := http.NewRequest(method, c.url+"/api/v1"+path, body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req.Header.Set("Authorization", "token "+c.accessToken)
|
|
for k, v := range header {
|
|
req.Header[k] = v
|
|
}
|
|
|
|
return c.client.Do(req)
|
|
}
|
|
|
|
func (c *Client) getResponse(method, path string, header http.Header, body io.Reader) ([]byte, error) {
|
|
resp, err := c.doRequest(method, path, header, body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
data, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
switch resp.StatusCode {
|
|
case 403:
|
|
return nil, errors.New("403 Forbidden")
|
|
case 404:
|
|
return nil, errors.New("404 Not Found")
|
|
case 422:
|
|
return nil, fmt.Errorf("422 Unprocessable Entity: %s", string(data))
|
|
}
|
|
|
|
if resp.StatusCode/100 != 2 {
|
|
errMap := make(map[string]interface{})
|
|
if err = json.Unmarshal(data, &errMap); err != nil {
|
|
return nil, err
|
|
}
|
|
return nil, errors.New(errMap["message"].(string))
|
|
}
|
|
|
|
return data, nil
|
|
}
|
|
|
|
func (c *Client) getParsedResponse(method, path string, header http.Header, body io.Reader, obj interface{}) error {
|
|
data, err := c.getResponse(method, path, header, body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return json.Unmarshal(data, obj)
|
|
}
|
|
|
|
func (c *Client) getStatusCode(method, path string, header http.Header, body io.Reader) (int, error) {
|
|
resp, err := c.doRequest(method, path, header, body)
|
|
if err != nil {
|
|
return -1, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
return resp.StatusCode, nil
|
|
}
|