[#450] Fix aws-chunked header workflow
All checks were successful
/ DCO (pull_request) Successful in 54s
/ Builds (pull_request) Successful in 1m19s
/ Vulncheck (pull_request) Successful in 1m15s
/ Lint (pull_request) Successful in 2m18s
/ Tests (pull_request) Successful in 1m21s

Signed-off-by: Pavel Pogodaev <p.pogodaev@yadro.com>
This commit is contained in:
Pavel Pogodaev 2024-09-05 10:47:05 +03:00 committed by pogpp
parent 67a72f2d74
commit 48ad6191e3
3 changed files with 29 additions and 24 deletions

View file

@ -199,18 +199,13 @@ func (h *handler) UploadPartHandler(w http.ResponseWriter, r *http.Request) {
return return
} }
body, decodedSize, err := h.getBodyReader(r) body, err := h.getBodyReader(r)
if err != nil { if err != nil {
h.logAndSendError(w, "failed to get body reader", reqInfo, err, additional...) h.logAndSendError(w, "failed to get body reader", reqInfo, err, additional...)
return return
} }
var size uint64 size := h.getPutPayloadSize(r)
if decodedSize > 0 {
size = uint64(decodedSize)
} else if r.ContentLength > 0 {
size = uint64(r.ContentLength)
}
p := &layer.UploadPartParams{ p := &layer.UploadPartParams{
Info: &layer.UploadInfoParams{ Info: &layer.UploadInfoParams{

View file

@ -233,7 +233,7 @@ func (h *handler) PutObjectHandler(w http.ResponseWriter, r *http.Request) {
return return
} }
body, decodedSize, err := h.getBodyReader(r) body, err := h.getBodyReader(r)
if err != nil { if err != nil {
h.logAndSendError(w, "failed to get body reader", reqInfo, err) h.logAndSendError(w, "failed to get body reader", reqInfo, err)
return return
@ -242,13 +242,7 @@ func (h *handler) PutObjectHandler(w http.ResponseWriter, r *http.Request) {
metadata[api.ContentEncoding] = encodings metadata[api.ContentEncoding] = encodings
} }
var size uint64 size := h.getPutPayloadSize(r)
if decodedSize > 0 {
size = uint64(decodedSize)
} else if r.ContentLength > 0 {
size = uint64(r.ContentLength)
}
params := &layer.PutObjectParams{ params := &layer.PutObjectParams{
BktInfo: bktInfo, BktInfo: bktInfo,
@ -313,9 +307,9 @@ func (h *handler) PutObjectHandler(w http.ResponseWriter, r *http.Request) {
} }
} }
func (h *handler) getBodyReader(r *http.Request) (io.ReadCloser, int, error) { func (h *handler) getBodyReader(r *http.Request) (io.ReadCloser, error) {
if !api.IsSignedStreamingV4(r) { if !api.IsSignedStreamingV4(r) {
return r.Body, -1, nil return r.Body, nil
} }
encodings := r.Header.Values(api.ContentEncoding) encodings := r.Header.Values(api.ContentEncoding)
@ -334,26 +328,25 @@ func (h *handler) getBodyReader(r *http.Request) (io.ReadCloser, int, error) {
r.Header.Set(api.ContentEncoding, strings.Join(resultContentEncoding, ",")) r.Header.Set(api.ContentEncoding, strings.Join(resultContentEncoding, ","))
if !chunkedEncoding && !h.cfg.BypassContentEncodingInChunks() { if !chunkedEncoding && !h.cfg.BypassContentEncodingInChunks() {
return nil, -1, fmt.Errorf("%w: request is not chunk encoded, encodings '%s'", return nil, fmt.Errorf("%w: request is not chunk encoded, encodings '%s'",
errors.GetAPIError(errors.ErrInvalidEncodingMethod), strings.Join(encodings, ",")) errors.GetAPIError(errors.ErrInvalidEncodingMethod), strings.Join(encodings, ","))
} }
decodeContentSize := r.Header.Get(api.AmzDecodedContentLength) decodeContentSize := r.Header.Get(api.AmzDecodedContentLength)
if len(decodeContentSize) == 0 { if len(decodeContentSize) == 0 {
return nil, -1, errors.GetAPIError(errors.ErrMissingContentLength) return nil, errors.GetAPIError(errors.ErrMissingContentLength)
} }
decoded, err := strconv.Atoi(decodeContentSize) if _, err := strconv.Atoi(decodeContentSize); err != nil {
if err != nil { return nil, fmt.Errorf("%w: parse decoded content length: %s", errors.GetAPIError(errors.ErrMissingContentLength), err.Error())
return nil, -1, fmt.Errorf("%w: parse decoded content length: %s", errors.GetAPIError(errors.ErrMissingContentLength), err.Error())
} }
chunkReader, err := newSignV4ChunkedReader(r) chunkReader, err := newSignV4ChunkedReader(r)
if err != nil { if err != nil {
return nil, -1, fmt.Errorf("initialize chunk reader: %w", err) return nil, fmt.Errorf("initialize chunk reader: %w", err)
} }
return chunkReader, decoded, nil return chunkReader, nil
} }
func formEncryptionParams(r *http.Request) (enc encryption.Params, err error) { func formEncryptionParams(r *http.Request) (enc encryption.Params, err error) {

View file

@ -106,6 +106,23 @@ func (h *handler) getBucketAndCheckOwner(r *http.Request, bucket string, header
return bktInfo, checkOwner(bktInfo, expected) return bktInfo, checkOwner(bktInfo, expected)
} }
func (h *handler) getPutPayloadSize(r *http.Request) uint64 {
decodeContentSize := r.Header.Get(api.AmzDecodedContentLength)
decodedSize, err := strconv.Atoi(decodeContentSize)
if err != nil {
decodedSize = 0
}
var size uint64
if decodedSize > 0 {
size = uint64(decodedSize)
} else if r.ContentLength > 0 {
size = uint64(r.ContentLength)
}
return size
}
func parseRange(s string) (*layer.RangeParams, error) { func parseRange(s string) (*layer.RangeParams, error) {
if s == "" { if s == "" {
return nil, nil return nil, nil