55package gitea
66
77import (
8+ "bytes"
89 "encoding/json"
910 "errors"
1011 "fmt"
1112 "io"
1213 "io/ioutil"
1314 "net/http"
15+ "net/url"
1416 "strings"
17+
18+ "github.com/google/go-querystring/query"
1519)
1620
1721// Version return the library version
@@ -52,11 +56,57 @@ func (c *Client) SetSudo(sudo string) {
5256 c .sudo = sudo
5357}
5458
55- func (c * Client ) doRequest (method , path string , header http.Header , body io.Reader ) (* http.Response , error ) {
56- req , err := http .NewRequest (method , c .url + "/api/v1" + path , body )
59+ func (c * Client ) doRequest (method , path string , header http.Header , body interface {}) (* http.Response , error ) {
60+ u , err := url .Parse (c .url )
61+ if err != nil {
62+ return nil , err
63+ }
64+
65+ unescaped , err := url .PathUnescape (path )
5766 if err != nil {
5867 return nil , err
5968 }
69+
70+ // Set the encoded path data
71+ u .RawPath = "/api/v1" + path
72+ u .Path = "/api/v1" + unescaped
73+
74+ if body != nil {
75+ q , err := query .Values (body )
76+ if err != nil {
77+ return nil , err
78+ }
79+ u .RawQuery = q .Encode ()
80+ }
81+
82+ req := & http.Request {
83+ Method : method ,
84+ URL : u ,
85+ Proto : "HTTP/1.1" ,
86+ ProtoMajor : 1 ,
87+ ProtoMinor : 1 ,
88+ Header : make (http.Header ),
89+ Host : u .Host ,
90+ }
91+
92+ if method == "POST" || method == "PUT" {
93+ bodyBytes , err := json .Marshal (body )
94+ if err != nil {
95+ return nil , err
96+ }
97+ bodyReader := bytes .NewReader (bodyBytes )
98+
99+ u .RawQuery = ""
100+ req .Body = ioutil .NopCloser (bodyReader )
101+ req .GetBody = func () (io.ReadCloser , error ) {
102+ return ioutil .NopCloser (bodyReader ), nil
103+ }
104+ req .ContentLength = int64 (bodyReader .Len ())
105+ req .Header .Set ("Content-Type" , "application/json" )
106+ }
107+
108+ req .Header .Set ("Accept" , "application/json" )
109+
60110 if len (c .accessToken ) != 0 {
61111 req .Header .Set ("Authorization" , "token " + c .accessToken )
62112 }
@@ -70,7 +120,7 @@ func (c *Client) doRequest(method, path string, header http.Header, body io.Read
70120 return c .client .Do (req )
71121}
72122
73- func (c * Client ) getResponse (method , path string , header http.Header , body io. Reader ) ([]byte , error ) {
123+ func (c * Client ) getResponse (method , path string , header http.Header , body interface {} ) ([]byte , error ) {
74124 resp , err := c .doRequest (method , path , header , body )
75125 if err != nil {
76126 return nil , err
@@ -106,7 +156,7 @@ func (c *Client) getResponse(method, path string, header http.Header, body io.Re
106156 return data , nil
107157}
108158
109- func (c * Client ) getParsedResponse (method , path string , header http.Header , body io. Reader , obj interface {}) error {
159+ func (c * Client ) getParsedResponse (method , path string , header http.Header , body interface {} , obj interface {}) error {
110160 data , err := c .getResponse (method , path , header , body )
111161 if err != nil {
112162 return err
0 commit comments