From: Radoslaw Zarzynski Date: Sat, 29 Apr 2017 19:12:19 +0000 (+0200) Subject: rgw: add support for HTTP_X_AMZ_DECODED_CONTENT_LENGTH. X-Git-Tag: v12.1.0~155^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dc270a613aca5da67bc19ccbd2deae343c15b69b;p=ceph.git rgw: add support for HTTP_X_AMZ_DECODED_CONTENT_LENGTH. Signed-off-by: Radoslaw Zarzynski --- 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);