core/request.go (68 lines of code) (raw):
package core
import (
"encoding/json"
"net/http"
"net/url"
"strings"
"github.com/uber/gonduit/requests"
)
// MakeRequest creates a new requests to the conduit API.
func MakeRequest(
endpointURL string,
params interface{},
options *ClientOptions,
) (*http.Request, error) {
// First, we begin by building the request content, which will be encoded
// as a urlencoded form.
form, err := prepareForm(params, options)
if err != nil {
return nil, err
}
// Next, we begin building the HTTP request.
req, err := http.NewRequest(
"POST",
endpointURL,
strings.NewReader(form.Encode()),
)
if err != nil {
return nil, err
}
// Finally, we set some headers.
setHeaders(req)
return req, nil
}
func setHeaders(req *http.Request) {
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
}
func prepareForm(
body interface{},
options *ClientOptions,
) (url.Values, error) {
form := url.Values{}
form.Add("output", "json")
if request, ok := body.(requests.RequestInterface); ok {
metadata := requests.ConduitMetadata{}
if options.APIToken != "" {
metadata.Token = options.APIToken
} else if options.SessionKey != "" {
metadata.SessionKey = options.SessionKey
}
request.SetMetadata(&metadata)
}
if body != nil {
jsonBody, err := json.Marshal(body)
if err != nil {
return nil, err
}
form.Add("params", string(jsonBody))
handleConnectRequest(&form, body)
} else {
jsonBody, err := json.Marshal(map[string]interface{}{})
if err != nil {
return nil, err
}
form.Add("params", string(jsonBody))
}
return form, nil
}
func handleConnectRequest(form *url.Values, body interface{}) {
_, isConduitConnect := body.(*requests.ConduitConnectRequest)
if isConduitConnect {
form.Add("__conduit__", "true")
}
}