4869: Based on Go documentation, don't set a body ReadCloser on the request
authorPeter Amstutz <peter.amstutz@curoverse.com>
Mon, 29 Dec 2014 18:51:20 +0000 (13:51 -0500)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Mon, 29 Dec 2014 18:51:20 +0000 (13:51 -0500)
when body length is 0.

sdk/go/keepclient/support.go

index 1f2a97626363aa1b81ba015590e114e37d015a5a..c03578c5d3d868021e6e7f53460838409f172d31 100644 (file)
@@ -104,11 +104,17 @@ func (this KeepClient) uploadToKeepServer(host string, hash string, body io.Read
                return
        }
 
-       if expectedLength > -1 {
-               req.ContentLength = expectedLength
-       }
-       if expectedLength == 0 {
-               defer body.Close()
+       req.ContentLength = expectedLength
+       if expectedLength > 0 {
+               // http.Client.Do will close the body ReadCloser when it is
+               // done with it.
+               req.Body = body
+       } else {
+               // "For client requests, a value of 0 means unknown if Body is
+               // not nil."  In this case we do want the body to be empty, so
+               // don't set req.Body.  However, we still need to close the
+               // body ReadCloser.
+               body.Close()
        }
 
        req.Header.Add("Authorization", fmt.Sprintf("OAuth2 %s", this.Arvados.ApiToken))
@@ -118,8 +124,6 @@ func (this KeepClient) uploadToKeepServer(host string, hash string, body io.Read
                req.Header.Add(X_Keep_Desired_Replicas, fmt.Sprint(this.Want_replicas))
        }
 
-       req.Body = body
-
        var resp *http.Response
        if resp, err = this.Client.Do(req); err != nil {
                log.Printf("[%v] Upload failed %v error: %v", requestId, url, err.Error())