diff options
| author | Stefan Majewsky <majewsky@gmx.net> | 2018-04-27 20:07:43 +0200 |
|---|---|---|
| committer | Stefan Majewsky <majewsky@gmx.net> | 2018-04-27 20:07:43 +0200 |
| commit | 55851ab5d1eb31f868ae45abdbdef152dd97b1ac (patch) | |
| tree | 90ec997a28037bdf8ecb063e6aed1a9a02e11efd /object.go | |
| parent | 30bbe06e039ae4e1de04c54ac82574afb81d5f69 (diff) | |
| download | go-schwift-55851ab5d1eb31f868ae45abdbdef152dd97b1ac.tar.gz | |
tryCompute{ContentLength, Etag}: add special cases for strings.Reader, nil
Diffstat (limited to 'object.go')
| -rw-r--r-- | object.go | 26 |
1 files changed, 20 insertions, 6 deletions
@@ -203,33 +203,47 @@ func (o *Object) Upload(content io.Reader, opts *RequestOptions) error { return nil } -//TODO add support for strings.Reader below +type readerWithLen interface { + //Returns the number of bytes in the unread portion of the buffer. + //Implemented by bytes.Reader, bytes.Buffer and strings.Reader. + Len() int +} func tryComputeContentLength(content io.Reader, headers ObjectHeaders) { h := headers.SizeBytes() if h.Exists() { return } - switch r := content.(type) { - case *bytes.Buffer: - h.Set(uint64(r.Len())) - case *bytes.Reader: + + if content == nil { + h.Set(0) + } else if r, ok := content.(readerWithLen); ok { h.Set(uint64(r.Len())) } } +//This covers both bytes.Reader and strings.Reader in a way that is compatible +//with earlier versions of Go that don't have strings.Reader yet. +type likeBytesReader interface { + io.WriterTo + io.Seeker +} + func tryComputeEtag(content io.Reader, headers ObjectHeaders) { h := headers.Etag() if h.Exists() { return } switch r := content.(type) { + case nil: + sum := md5.Sum(nil) + h.Set(hex.EncodeToString(sum[:])) case *bytes.Buffer: //bytes.Buffer has a method that returns the unread portion of the buffer, //so this one is easy sum := md5.Sum(r.Bytes()) h.Set(hex.EncodeToString(sum[:])) - case *bytes.Reader: + case likeBytesReader: //bytes.Reader does not have such a method, but it is an io.Seeker, so we //can read the entire thing and then seek back to where we started hash := md5.New() |
