From dc270a613aca5da67bc19ccbd2deae343c15b69b Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Sat, 29 Apr 2017 21:12:19 +0200 Subject: [PATCH] rgw: add support for HTTP_X_AMZ_DECODED_CONTENT_LENGTH. Signed-off-by: Radoslaw Zarzynski --- src/rgw/rgw_auth_s3.cc | 15 +++++++++++++++ src/rgw/rgw_op.cc | 6 +----- src/rgw/rgw_rest.cc | 2 +- src/rgw/rgw_rest.h | 1 + 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/rgw/rgw_auth_s3.cc b/src/rgw/rgw_auth_s3.cc index d614de3f44b0..c70e3e72ea95 100644 --- a/src/rgw/rgw_auth_s3.cc +++ b/src/rgw/rgw_auth_s3.cc @@ -1021,6 +1021,21 @@ size_t AWSv4ComplMulti::recv_body(char* const buf, const size_t buf_max) void AWSv4ComplMulti::modify_request_state(req_state* const s_rw) { + const char* const decoded_length = \ + s_rw->info.env->get("HTTP_X_AMZ_DECODED_CONTENT_LENGTH"); + + if (!decoded_length) { + throw -EINVAL; + } else { + s_rw->length = decoded_length; + s_rw->content_length = parse_content_length(decoded_length); + + if (s_rw->content_length < 0) { + ldout(cct, 10) << "negative AWSv4's content length, aborting" << dendl; + throw -EINVAL; + } + } + /* Install the filter over rgw::io::RestfulClient. */ AWS_AUTHv4_IO(s_rw)->add_filter( std::static_pointer_cast(shared_from_this())); diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 0a2a565dd931..506c1cf5f018 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -3271,14 +3271,10 @@ void RGWPutObj::execute() } } -#if 0 - if (!chunked_upload && - ofs != s->content_length && - !s->aws4_auth_streaming_mode) { + if (!chunked_upload && ofs != s->content_length) { op_ret = -ERR_REQUEST_TIMEOUT; goto done; } -#endif s->obj_size = ofs; perfcounter->inc(l_rgw_put_b, s->obj_size); diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 4eb45aeb2d77..8a4fa90a1973 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -2035,7 +2035,7 @@ RGWRESTMgr::~RGWRESTMgr() delete default_mgr; } -static int64_t parse_content_length(const char *content_length) +int64_t parse_content_length(const char *content_length) { int64_t len = -1; diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h index 2d24eed9475a..11c951e38b30 100644 --- a/src/rgw/rgw_rest.h +++ b/src/rgw/rgw_rest.h @@ -687,6 +687,7 @@ static inline void dump_header_if_nonempty(struct req_state* s, } extern void dump_content_length(struct req_state *s, uint64_t len); +extern int64_t parse_content_length(const char *content_length); extern void dump_etag(struct req_state *s, const boost::string_ref& etag, bool quoted = false); -- 2.47.3