Merge pull request #453 from jrperritt/object-etag-fix
Object create: ETag bug fix
diff --git a/openstack/objectstorage/v1/objects/requests.go b/openstack/objectstorage/v1/objects/requests.go
index 7bc12a4..531d233 100644
--- a/openstack/objectstorage/v1/objects/requests.go
+++ b/openstack/objectstorage/v1/objects/requests.go
@@ -1,12 +1,12 @@
package objects
import (
+ "bytes"
"crypto/hmac"
"crypto/md5"
"crypto/sha1"
"fmt"
"io"
- "net/http"
"strings"
"time"
@@ -212,25 +212,28 @@
url += query
}
+ hash := md5.New()
+
+ contentBuffer := bytes.NewBuffer([]byte{})
+ _, err := io.Copy(contentBuffer, io.TeeReader(content, hash))
+ if err != nil {
+ res.Err = err
+ return res
+ }
+
+ localChecksum := hash.Sum(nil)
+ h["ETag"] = fmt.Sprintf("%x", localChecksum)
+
ropts := gophercloud.RequestOpts{
- RawBody: content,
+ RawBody: strings.NewReader(contentBuffer.String()),
MoreHeaders: h,
}
- doUpload := func() (*http.Response, error) {
+ for i := 1; i <= 3; i++ {
resp, err := c.Request("PUT", url, ropts)
if resp != nil {
res.Header = resp.Header
}
- return resp, err
- }
-
- hash := md5.New()
- io.Copy(hash, content)
- localChecksum := hash.Sum(nil)
-
- for i := 1; i <= 3; i++ {
- resp, err := doUpload()
if resp.Header.Get("ETag") == fmt.Sprintf("%x", localChecksum) {
res.Err = err
break