2016-11-07 16:53:13 +03:00
// 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"
"io"
"io/ioutil"
"net/http"
"strings"
)
2016-11-29 11:09:17 +03:00
// Version return the library version
2016-11-07 16:53:13 +03:00
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 )
}
2016-11-29 11:09:17 +03:00
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
}