10764: Test v0 session.
[arvados.git] / sdk / go / arvados / client.go
index 0c18d38974f8be6ce99460ef2713e220a2cff403..9691e7a07e475668cc73a80dffba466addb3b4ef 100644 (file)
@@ -10,6 +10,7 @@ import (
        "net/http"
        "net/url"
        "os"
+       "regexp"
        "strings"
        "time"
 )
@@ -180,6 +181,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 +243,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 +261,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 {