c317bcf8d1
There is some API that give empty response and we only need to check HTTP status code. example : https://developer.github.com/v3/issues/assignees/#check-assignee But there is no way to do this in current code because getResponse will parse the response body and not returning HTTP status code. Client.doRequest makes it possible to do this.
90 lines
2 KiB
Go
90 lines
2 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 gogs
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
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")
|
|
}
|
|
|
|
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)
|
|
}
|