X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/3e1c43866e5b523c3f1d273c25942ad56dc66d3f..b3d57ff3ccf9c612a11fcf53a451a0f61a362da6:/sdk/go/arvados/client.go diff --git a/sdk/go/arvados/client.go b/sdk/go/arvados/client.go index ce2c5aea3d..cbc2ca72f0 100644 --- a/sdk/go/arvados/client.go +++ b/sdk/go/arvados/client.go @@ -69,6 +69,21 @@ var InsecureHTTPClient = &http.Client{ var DefaultSecureClient = &http.Client{ Timeout: 5 * time.Minute} +// NewClientFromConfig creates a new Client that uses the endpoints in +// the given cluster. +// +// AuthToken is left empty for the caller to populate. +func NewClientFromConfig(cluster *Cluster) (*Client, error) { + ctrlURL := cluster.Services.Controller.ExternalURL + if ctrlURL.Host == "" { + return nil, fmt.Errorf("no host in config Services.Controller.ExternalURL: %v", ctrlURL) + } + return &Client{ + APIHost: ctrlURL.Host, + Insecure: cluster.TLS.Insecure, + }, nil +} + // NewClientFromEnv creates a new Client that uses the default HTTP // client with the API endpoint and credentials given by the // ARVADOS_API_* environment variables. @@ -106,15 +121,16 @@ func (c *Client) Do(req *http.Request) (*http.Response, error) { req.Header.Add("Authorization", "OAuth2 "+c.AuthToken) } - reqid, ok := c.context().Value(contextKeyRequestID).(string) - if !ok { - reqid = reqIDGen.Next() - } 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{} + req.Header = http.Header{"X-Request-Id": {reqid}} + } else { + req.Header.Set("X-Request-Id", reqid) } - req.Header.Set("X-Request-Id", reqid) } return c.httpClient().Do(req) } @@ -209,14 +225,19 @@ func (c *Client) RequestAndDecode(dst interface{}, method, path string, body io. if err != nil { return err } - if (method == "GET" || body != nil) && urlValues != nil { - // FIXME: what if params don't fit in URL + if urlValues == nil { + // Nothing to send + } else if method == "GET" || method == "HEAD" || body != nil { + // Must send params in query part of URL (FIXME: what + // if resulting URL is too long?) u, err := url.Parse(urlString) if err != nil { return err } u.RawQuery = urlValues.Encode() urlString = u.String() + } else { + body = strings.NewReader(urlValues.Encode()) } req, err := http.NewRequest(method, urlString, body) if err != nil {