@@ -53,90 +53,43 @@ func (c *Client) SetTransport(tr *http.Transport) {
5353}
5454
5555func sendRequest [T any ](c * Client , method , path string , opts ... Opt ) (* T , error ) {
56- u := url.URL {
57- Scheme : c .scheme ,
58- Host : c .host ,
59- Path : path ,
60- }
6156 ctx := & Ctx {}
6257 rid := uuid .NewString ()
6358
6459 for _ , opt := range opts {
6560 opt (ctx )
6661 }
6762
68- if len (ctx .query ) > 0 {
69- values := u .Query ()
70- for k , v := range ctx .query {
71- values .Add (k , v )
72- }
73- u .RawQuery = values .Encode ()
74- }
75-
63+ urlStr := buildURL (c , path , ctx .query )
7664 if c .debug {
77- log .Printf ("[REQ:%s] url: %s" , rid , u . String () )
65+ log .Printf ("[REQ:%s] url: %s" , rid , urlStr )
7866 }
7967
80- var body io.Reader
81- var writer * multipart.Writer
82- if ctx .body != nil {
83- bs , err := json .Marshal (ctx .body )
84- if err != nil {
85- return nil , err
86- }
87- switch ctx .contentType {
88- case "multipart/form-data" :
89- m := make (map [string ]string )
90- if err := json .Unmarshal (bs , & m ); err != nil {
91- return nil , err
92- }
93- buf := & bytes.Buffer {}
94- writer = multipart .NewWriter (buf )
95- for k , v := range m {
96- if err := writer .WriteField (k , v ); err != nil {
97- return nil , err
98- }
99- }
100- if err := writer .Close (); err != nil {
101- return nil , err
102- }
103- body = buf
104- case "application/x-www-form-urlencoded" :
105- m := make (map [string ]string )
106- if err := json .Unmarshal (bs , & m ); err != nil {
107- return nil , err
108- }
109- data := url.Values {}
110- for k , v := range m {
111- data .Add (k , v )
112- }
113- body = strings .NewReader (data .Encode ())
114- default :
115- body = bytes .NewBuffer (bs )
116- }
68+ body , contentType , err := buildBodyAndType (ctx )
69+ if err != nil {
70+ return nil , err
71+ }
11772
118- if c .debug {
119- buf := & bytes. Buffer {}
120- if err := json . Indent ( buf , bs , "" , " " ); err != nil {
121- log . Printf ( "[REQ:%s] body: %s" , rid , string ( bs ))
122- } else {
123- log . Printf ( "[REQ:%s] body: %s" , rid , buf . String ())
124- }
73+ if c .debug && ctx . body != nil {
74+ bs , _ := json . Marshal ( ctx . body )
75+ buf := & bytes. Buffer {}
76+ if err := json . Indent ( buf , bs , "" , " " ); err != nil {
77+ log . Printf ( "[REQ:%s] body: %s" , rid , string ( bs ))
78+ } else {
79+ log . Printf ( "[REQ:%s] body: %s" , rid , buf . String ())
12580 }
12681 }
127- req , err := http .NewRequest (method , u .String (), body )
82+
83+ req , err := http .NewRequest (method , urlStr , body )
12884 if err != nil {
12985 return nil , err
13086 }
13187 for k , v := range ctx .header {
13288 req .Header .Add (k , v )
13389 }
134- switch ctx .contentType {
135- case "multipart/form-data" :
136- req .Header .Set ("Content-Type" , writer .FormDataContentType ())
137- case "application/x-www-form-urlencoded" :
138- req .Header .Set ("Content-Type" , "application/x-www-form-urlencoded" )
139- default :
90+ if contentType != "" {
91+ req .Header .Set ("Content-Type" , contentType )
92+ } else {
14093 req .Header .Set ("Content-Type" , "application/json" )
14194 }
14295 if c .debug {
@@ -177,6 +130,58 @@ func sendRequest[T any](c *Client, method, path string, opts ...Opt) (*T, error)
177130 return & rr , nil
178131}
179132
133+ func buildURL (c * Client , path string , q Query ) string {
134+ u := url.URL {Scheme : c .scheme , Host : c .host , Path : path }
135+ if len (q ) > 0 {
136+ values := u .Query ()
137+ for k , v := range q {
138+ values .Add (k , v )
139+ }
140+ u .RawQuery = values .Encode ()
141+ }
142+ return u .String ()
143+ }
144+
145+ func buildBodyAndType (ctx * Ctx ) (io.Reader , string , error ) {
146+ if ctx .body == nil {
147+ return nil , "" , nil
148+ }
149+ bs , err := json .Marshal (ctx .body )
150+ if err != nil {
151+ return nil , "" , err
152+ }
153+ switch ctx .contentType {
154+ case "multipart/form-data" :
155+ m := make (map [string ]string )
156+ if err := json .Unmarshal (bs , & m ); err != nil {
157+ return nil , "" , err
158+ }
159+ buf := & bytes.Buffer {}
160+ w := multipart .NewWriter (buf )
161+ for k , v := range m {
162+ if err := w .WriteField (k , v ); err != nil {
163+ return nil , "" , err
164+ }
165+ }
166+ if err := w .Close (); err != nil {
167+ return nil , "" , err
168+ }
169+ return buf , w .FormDataContentType (), nil
170+ case "application/x-www-form-urlencoded" :
171+ m := make (map [string ]string )
172+ if err := json .Unmarshal (bs , & m ); err != nil {
173+ return nil , "" , err
174+ }
175+ data := url.Values {}
176+ for k , v := range m {
177+ data .Add (k , v )
178+ }
179+ return strings .NewReader (data .Encode ()), "application/x-www-form-urlencoded" , nil
180+ default :
181+ return bytes .NewBuffer (bs ), "application/json" , nil
182+ }
183+ }
184+
180185func Get [T any ](c * Client , path string , opts ... Opt ) (* T , error ) {
181186 return sendRequest [T ](c , http .MethodGet , path , opts ... )
182187}
0 commit comments