15864: Use POST/X-Http-Method-Override instead of long request URLs.
authorTom Clegg <tclegg@veritasgenetics.com>
Fri, 29 Nov 2019 07:42:09 +0000 (02:42 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Fri, 29 Nov 2019 07:42:09 +0000 (02:42 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/client.go

index 8545cb969d92f8fbc716175d5c9820f47ed6680a..58c0de8255c944d70342133aa97bfc1a16ccbe6e 100644 (file)
@@ -281,9 +281,8 @@ func (c *Client) RequestAndDecodeContext(ctx context.Context, dst interface{}, m
        }
        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?)
+       } else if body != nil || ((method == "GET" || method == "HEAD") && len(urlValues.Encode()) < 1000) {
+               // Send params in query part of URL
                u, err := url.Parse(urlString)
                if err != nil {
                        return err
@@ -297,6 +296,10 @@ func (c *Client) RequestAndDecodeContext(ctx context.Context, dst interface{}, m
        if err != nil {
                return err
        }
+       if (method == "GET" || method == "HEAD") && body != nil {
+               req.Header.Set("X-Http-Method-Override", method)
+               req.Method = "POST"
+       }
        req = req.WithContext(ctx)
        req.Header.Set("Content-type", "application/x-www-form-urlencoded")
        for k, v := range c.SendHeader {