diff --git a/weed/command/filer_copy.go b/weed/command/filer_copy.go index 218abf645..d7b474628 100644 --- a/weed/command/filer_copy.go +++ b/weed/command/filer_copy.go @@ -201,6 +201,7 @@ func uploadFileAsOne(filerAddress, filerGrpcAddress string, urlFolder string, f Offset: 0, Size: uint64(uploadResult.Size), Mtime: time.Now().UnixNano(), + ETag: uploadResult.ETag, }) fmt.Printf("copied %s => http://%s%s%s\n", fileName, filerAddress, urlFolder, fileName) @@ -278,6 +279,7 @@ func uploadFileInChunks(filerAddress, filerGrpcAddress string, urlFolder string, Offset: i * chunkSize, Size: uint64(uploadResult.Size), Mtime: time.Now().UnixNano(), + ETag: uploadResult.ETag, }) fmt.Printf("uploaded %s-%d to %s [%d,%d)\n", fileName, i+1, targetUrl, i*chunkSize, i*chunkSize+int64(uploadResult.Size)) } diff --git a/weed/filesys/dirty_page.go b/weed/filesys/dirty_page.go index eb810d383..8bdb12d4d 100644 --- a/weed/filesys/dirty_page.go +++ b/weed/filesys/dirty_page.go @@ -187,6 +187,7 @@ func (pages *ContinuousDirtyPages) saveToStorage(ctx context.Context, buf []byte Offset: offset, Size: uint64(len(buf)), Mtime: time.Now().UnixNano(), + ETag: uploadResult.ETag, }, nil } diff --git a/weed/operation/upload_content.go b/weed/operation/upload_content.go index 30c7f1ea3..1fd0ed2b9 100644 --- a/weed/operation/upload_content.go +++ b/weed/operation/upload_content.go @@ -22,6 +22,7 @@ type UploadResult struct { Name string `json:"name,omitempty"` Size uint32 `json:"size,omitempty"` Error string `json:"error,omitempty"` + ETag string `json:"error,omitempty"` } var ( @@ -90,6 +91,7 @@ func upload_content(uploadUrl string, fillBufferFunction func(w io.Writer) error return nil, post_err } defer resp.Body.Close() + etag := getEtag(resp) resp_body, ra_err := ioutil.ReadAll(resp.Body) if ra_err != nil { return nil, ra_err @@ -103,5 +105,14 @@ func upload_content(uploadUrl string, fillBufferFunction func(w io.Writer) error if ret.Error != "" { return nil, errors.New(ret.Error) } + ret.ETag = etag return &ret, nil } + +func getEtag(r *http.Response) (etag string) { + etag = r.Header.Get("ETag") + if strings.HasPrefix(etag, "\"") && strings.HasSuffix(etag, "\"") { + etag = etag[1 : len(etag)-1] + } + return +} diff --git a/weed/server/common.go b/weed/server/common.go index 2e3053092..12adbf1b4 100644 --- a/weed/server/common.go +++ b/weed/server/common.go @@ -123,6 +123,7 @@ func submitForClientHandler(w http.ResponseWriter, r *http.Request, masterUrl st m["fid"] = assignResult.Fid m["fileUrl"] = assignResult.PublicUrl + "/" + assignResult.Fid m["size"] = uploadResult.Size + m["eTag"] = uploadResult.ETag writeJsonQuiet(w, r, http.StatusCreated, m) return }