X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2eaa77dc327c024f2faa3fbd322e7054454b6442..1e3f8ceebd90058e902494fae84b1fd57ac6693b:/sdk/go/arvados/client.go diff --git a/sdk/go/arvados/client.go b/sdk/go/arvados/client.go index 0c18d38974..47a953ac2c 100644 --- a/sdk/go/arvados/client.go +++ b/sdk/go/arvados/client.go @@ -1,3 +1,7 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: Apache-2.0 + package arvados import ( @@ -6,10 +10,12 @@ import ( "fmt" "io" "io/ioutil" + "log" "math" "net/http" "net/url" "os" + "regexp" "strings" "time" ) @@ -62,13 +68,25 @@ var DefaultSecureClient = &http.Client{ // ARVADOS_API_* environment variables. func NewClientFromEnv() *Client { var svcs []string - if s := os.Getenv("ARVADOS_KEEP_SERVICES"); s != "" { - svcs = strings.Split(s, " ") + for _, s := range strings.Split(os.Getenv("ARVADOS_KEEP_SERVICES"), " ") { + if s == "" { + continue + } else if u, err := url.Parse(s); err != nil { + log.Printf("ARVADOS_KEEP_SERVICES: %q: %s", s, err) + } else if !u.IsAbs() { + log.Printf("ARVADOS_KEEP_SERVICES: %q: not an absolute URI", s) + } else { + svcs = append(svcs, s) + } + } + var insecure bool + if s := strings.ToLower(os.Getenv("ARVADOS_API_HOST_INSECURE")); s == "1" || s == "yes" || s == "true" { + insecure = true } return &Client{ APIHost: os.Getenv("ARVADOS_API_HOST"), AuthToken: os.Getenv("ARVADOS_API_TOKEN"), - Insecure: os.Getenv("ARVADOS_API_HOST_INSECURE") != "", + Insecure: insecure, KeepServiceURIs: svcs, } } @@ -180,6 +198,7 @@ func (c *Client) RequestAndDecode(dst interface{}, method, path string, body io. if err != nil { return err } + req.Header.Set("Content-type", "application/x-www-form-urlencoded") return c.DoAndDecode(dst, req) } @@ -241,14 +260,15 @@ func (c *Client) DiscoveryDocument() (*DiscoveryDocument, error) { return c.dd, nil } -func (c *Client) PathForUUID(method, uuid string) (string, error) { +var pdhRegexp = regexp.MustCompile(`^[0-9a-f]{32}\+\d+$`) + +func (c *Client) modelForUUID(dd *DiscoveryDocument, uuid string) (string, error) { + if pdhRegexp.MatchString(uuid) { + return "Collection", nil + } if len(uuid) != 27 { return "", fmt.Errorf("invalid UUID: %q", uuid) } - dd, err := c.DiscoveryDocument() - if err != nil { - return "", err - } infix := uuid[6:11] var model string for m, s := range dd.Schemas { @@ -258,7 +278,31 @@ func (c *Client) PathForUUID(method, uuid string) (string, error) { } } if model == "" { - return "", fmt.Errorf("unrecognized UUID infix: %q", infix) + return "", fmt.Errorf("unrecognized type portion %q in UUID %q", infix, uuid) + } + return model, nil +} + +func (c *Client) KindForUUID(uuid string) (string, error) { + dd, err := c.DiscoveryDocument() + if err != nil { + return "", err + } + model, err := c.modelForUUID(dd, uuid) + if err != nil { + return "", err + } + return "arvados#" + strings.ToLower(model[:1]) + model[1:], nil +} + +func (c *Client) PathForUUID(method, uuid string) (string, error) { + dd, err := c.DiscoveryDocument() + if err != nil { + return "", err + } + model, err := c.modelForUUID(dd, uuid) + if err != nil { + return "", err } var resource string for r, rsc := range dd.Resources {