[#450] Fix aws-chunked header workflow
Signed-off-by: Pavel Pogodaev <p.pogodaev@yadro.com>
This commit is contained in:
parent
67a72f2d74
commit
48ad6191e3
3 changed files with 29 additions and 24 deletions
|
@ -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{
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue