From 0c4a9bdf032924b6cdc59068d56d63e2d6c12f7c Mon Sep 17 00:00:00 2001 From: Pavel Pogodaev Date: Thu, 5 Sep 2024 10:47:05 +0300 Subject: [PATCH] [#450] Fix aws-chunked header workflow Signed-off-by: Pavel Pogodaev --- api/handler/multipart_upload.go | 6 ++++-- api/handler/put.go | 24 ++++++++++++++---------- api/layer/object.go | 2 +- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/api/handler/multipart_upload.go b/api/handler/multipart_upload.go index 1795c29..18d717c 100644 --- a/api/handler/multipart_upload.go +++ b/api/handler/multipart_upload.go @@ -199,14 +199,16 @@ func (h *handler) UploadPartHandler(w http.ResponseWriter, r *http.Request) { return } - body, err := h.getBodyReader(r) + body, decodedSize, err := h.getBodyReader(r) if err != nil { h.logAndSendError(w, "failed to get body reader", reqInfo, err, additional...) return } var size uint64 - if r.ContentLength > 0 { + if decodedSize > 0 { + size = uint64(decodedSize) + } else if r.ContentLength > 0 { size = uint64(r.ContentLength) } diff --git a/api/handler/put.go b/api/handler/put.go index e740cbb..c4f0453 100644 --- a/api/handler/put.go +++ b/api/handler/put.go @@ -233,7 +233,7 @@ func (h *handler) PutObjectHandler(w http.ResponseWriter, r *http.Request) { return } - body, err := h.getBodyReader(r) + body, decodedSize, err := h.getBodyReader(r) if err != nil { h.logAndSendError(w, "failed to get body reader", reqInfo, err) return @@ -243,7 +243,10 @@ func (h *handler) PutObjectHandler(w http.ResponseWriter, r *http.Request) { } var size uint64 - if r.ContentLength > 0 { + + if decodedSize > 0 { + size = uint64(decodedSize) + } else if r.ContentLength > 0 { size = uint64(r.ContentLength) } @@ -310,9 +313,9 @@ func (h *handler) PutObjectHandler(w http.ResponseWriter, r *http.Request) { } } -func (h *handler) getBodyReader(r *http.Request) (io.ReadCloser, error) { +func (h *handler) getBodyReader(r *http.Request) (io.ReadCloser, int, error) { if !api.IsSignedStreamingV4(r) { - return r.Body, nil + return r.Body, -1, nil } encodings := r.Header.Values(api.ContentEncoding) @@ -331,25 +334,26 @@ func (h *handler) getBodyReader(r *http.Request) (io.ReadCloser, error) { r.Header.Set(api.ContentEncoding, strings.Join(resultContentEncoding, ",")) if !chunkedEncoding && !h.cfg.BypassContentEncodingInChunks() { - return nil, fmt.Errorf("%w: request is not chunk encoded, encodings '%s'", + return nil, -1, fmt.Errorf("%w: request is not chunk encoded, encodings '%s'", errors.GetAPIError(errors.ErrInvalidEncodingMethod), strings.Join(encodings, ",")) } decodeContentSize := r.Header.Get(api.AmzDecodedContentLength) if len(decodeContentSize) == 0 { - return nil, errors.GetAPIError(errors.ErrMissingContentLength) + return nil, -1, errors.GetAPIError(errors.ErrMissingContentLength) } - if _, err := strconv.Atoi(decodeContentSize); err != nil { - return nil, fmt.Errorf("%w: parse decoded content length: %s", errors.GetAPIError(errors.ErrMissingContentLength), err.Error()) + decoded, err := strconv.Atoi(decodeContentSize) + if err != nil { + return nil, -1, fmt.Errorf("%w: parse decoded content length: %s", errors.GetAPIError(errors.ErrMissingContentLength), err.Error()) } chunkReader, err := newSignV4ChunkedReader(r) if err != nil { - return nil, fmt.Errorf("initialize chunk reader: %w", err) + return nil, -1, fmt.Errorf("initialize chunk reader: %w", err) } - return chunkReader, nil + return chunkReader, decoded, nil } func formEncryptionParams(r *http.Request) (enc encryption.Params, err error) { diff --git a/api/layer/object.go b/api/layer/object.go index 8c4549d..52e950e 100644 --- a/api/layer/object.go +++ b/api/layer/object.go @@ -310,7 +310,7 @@ func (n *Layer) PutObject(ctx context.Context, p *PutObjectParams) (*data.Extend OID: createdObj.ID, ETag: hex.EncodeToString(createdObj.HashSum), FilePath: p.Object, - Size: p.Size, + Size: createdObj.Size, Created: &now, Owner: &n.gateOwner, CreationEpoch: createdObj.CreationEpoch,