123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // 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.5"
- }
- // 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)
- }
|