// (*http.Client)Do().
func (c *Client) Do(req *http.Request) (*http.Response, error) {
if c.AuthToken != "" {
- req.Header.Set("Authorization", "OAuth2 "+c.AuthToken)
+ req.Header.Add("Authorization", "OAuth2 "+c.AuthToken)
}
if req.Header.Get("X-Request-Id") == "" {
return urlValues, nil
}
-func (c *Client) MakeRequest(method, path string, body io.Reader, params interface{}) (*http.Request, error) {
+// RequestAndDecode performs an API request and unmarshals the
+// response (which must be JSON) into dst. Method and body arguments
+// are the same as for http.NewRequest(). The given path is added to
+// the server's scheme/host/port to form the request URL. The given
+// params are passed via POST form or query string.
+//
+// path must not contain a query string.
+func (c *Client) RequestAndDecode(dst interface{}, method, path string, body io.Reader, params interface{}) error {
+ if body, ok := body.(io.Closer); ok {
+ // Ensure body is closed even if we error out early
+ defer body.Close()
+ }
urlString := c.apiURL(path)
urlValues, err := anythingToValues(params)
if err != nil {
- return nil, err
+ return err
}
if (method == "GET" || body != nil) && urlValues != nil {
// FIXME: what if params don't fit in URL
u, err := url.Parse(urlString)
if err != nil {
- return nil, err
+ return err
}
u.RawQuery = urlValues.Encode()
urlString = u.String()
}
req, err := http.NewRequest(method, urlString, body)
- if err != nil {
- return nil, err
- }
- req.Header.Set("Content-type", "application/x-www-form-urlencoded")
-
- if c.AuthToken != "" {
- req.Header.Set("Authorization", "OAuth2 "+c.AuthToken)
- }
-
- if req.Header.Get("X-Request-Id") == "" {
- reqid, _ := c.context().Value(contextKeyRequestID).(string)
- if reqid == "" {
- reqid = reqIDGen.Next()
- }
- if req.Header == nil {
- req.Header = http.Header{"X-Request-Id": {reqid}}
- } else {
- req.Header.Set("X-Request-Id", reqid)
- }
- }
-
- return req, nil
-}
-
-// RequestAndDecode performs an API request and unmarshals the
-// response (which must be JSON) into dst. Method and body arguments
-// are the same as for http.NewRequest(). The given path is added to
-// the server's scheme/host/port to form the request URL. The given
-// params are passed via POST form or query string.
-//
-// path must not contain a query string.
-func (c *Client) RequestAndDecode(dst interface{}, method, path string, body io.Reader, params interface{}) error {
- if body, ok := body.(io.Closer); ok {
- // Ensure body is closed even if we error out early
- defer body.Close()
- }
- req, err := c.MakeRequest(method, path, body, params)
if err != nil {
return err
}
+ req.Header.Set("Content-type", "application/x-www-form-urlencoded")
return c.DoAndDecode(dst, req)
}