5
5
package gitea
6
6
7
7
import (
8
+ "bytes"
8
9
"encoding/json"
9
10
"errors"
10
11
"fmt"
11
12
"io"
12
13
"io/ioutil"
13
14
"net/http"
15
+ "net/url"
14
16
"strings"
17
+
18
+ "github.com/google/go-querystring/query"
15
19
)
16
20
17
21
// Version return the library version
@@ -52,11 +56,59 @@ func (c *Client) SetSudo(sudo string) {
52
56
c .sudo = sudo
53
57
}
54
58
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 )
57
66
if err != nil {
58
67
return nil , err
59
68
}
69
+
70
+ // Set the encoded path data
71
+ u .RawPath = "/api/v1" + path
72
+ u .Path = "/api/v1" + unescaped
73
+
74
+ if method == "GET" {
75
+ if body != nil {
76
+ q , err := query .Values (body )
77
+ if err != nil {
78
+ return nil , err
79
+ }
80
+ u .RawQuery = q .Encode ()
81
+ }
82
+ }
83
+
84
+ req := & http.Request {
85
+ Method : method ,
86
+ URL : u ,
87
+ Proto : "HTTP/1.1" ,
88
+ ProtoMajor : 1 ,
89
+ ProtoMinor : 1 ,
90
+ Header : make (http.Header ),
91
+ Host : u .Host ,
92
+ }
93
+
94
+ if method == "POST" || method == "PUT" {
95
+ bodyBytes , err := json .Marshal (body )
96
+ if err != nil {
97
+ return nil , err
98
+ }
99
+ bodyReader := bytes .NewReader (bodyBytes )
100
+
101
+ u .RawQuery = ""
102
+ req .Body = ioutil .NopCloser (bodyReader )
103
+ req .GetBody = func () (io.ReadCloser , error ) {
104
+ return ioutil .NopCloser (bodyReader ), nil
105
+ }
106
+ req .ContentLength = int64 (bodyReader .Len ())
107
+ req .Header .Set ("Content-Type" , "application/json" )
108
+ }
109
+
110
+ req .Header .Set ("Accept" , "application/json" )
111
+
60
112
if len (c .accessToken ) != 0 {
61
113
req .Header .Set ("Authorization" , "token " + c .accessToken )
62
114
}
@@ -70,7 +122,7 @@ func (c *Client) doRequest(method, path string, header http.Header, body io.Read
70
122
return c .client .Do (req )
71
123
}
72
124
73
- func (c * Client ) getResponse (method , path string , header http.Header , body io. Reader ) ([]byte , error ) {
125
+ func (c * Client ) getResponse (method , path string , header http.Header , body interface {} ) ([]byte , error ) {
74
126
resp , err := c .doRequest (method , path , header , body )
75
127
if err != nil {
76
128
return nil , err
@@ -106,7 +158,7 @@ func (c *Client) getResponse(method, path string, header http.Header, body io.Re
106
158
return data , nil
107
159
}
108
160
109
- func (c * Client ) getParsedResponse (method , path string , header http.Header , body io. Reader , obj interface {}) error {
161
+ func (c * Client ) getParsedResponse (method , path string , header http.Header , body interface {} , obj interface {}) error {
110
162
data , err := c .getResponse (method , path , header , body )
111
163
if err != nil {
112
164
return err
0 commit comments