From: Or Friedmann Date: Tue, 12 May 2020 15:20:34 +0000 (+0300) Subject: rgw: fixes to override_range_hdr X-Git-Tag: v15.2.5~52^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aa43b828532db087ae1c7abcc51e1776348a73d4;p=ceph.git rgw: fixes to override_range_hdr Signed-off-by: Or Friedmann (cherry picked from commit e6e1dd868140e7ed356e007d4bf95a5bd2415035) --- diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index f9bd0a83f2c5..e3c8025e5168 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -457,40 +457,29 @@ int RGWGetObj_ObjStore_S3::override_range_hdr(const rgw::auth::StrategyRegistry& { int ret = -EINVAL; ldpp_dout(this,2) << "cache override headers" << dendl; - try { - RGWEnv* rgw_env = const_cast(s->info.env); - // Maybe we need to change env inside req_info to non const var, maybe we can use const_cast or maybe keep it that way (changing rgw_env from the ref) - const char *backup_range = rgw_env->get("HTTP_RANGE"); - const char hdrs_split[2] = {(char)178,'\0'}; - const char kv_split[2] = {(char)177,'\0'}; - std::string cache_hdr(rgw_env->get("HTTP_X_AMZ_CACHE")); // we are calling process_cache_request method only if the header exists - vector cache_hdrs, cache_kvs; - boost::split(cache_hdrs,cache_hdr,boost::is_any_of(hdrs_split)); - cache_hdrs.erase(cache_hdrs.begin()); - ldpp_dout(this,2) << "starting parse cache headers" << dendl; - for (auto i = 0; i < cache_hdrs.size(); ++i) - { - boost::split(cache_kvs,cache_hdrs[i],boost::is_any_of(kv_split)); - ldpp_dout(this,2) << "after splitting cache kv " << dendl; - if(cache_kvs.size() == 2) { - boost::replace_all(cache_kvs[0],"-","_"); - rgw_env->set("HTTP_" + cache_kvs[0],cache_kvs[1]); - ldpp_dout(this,2) << "after splitting cache kv key: " << "HTTP_" + cache_kvs[0] << rgw_env->get((std::string("HTTP_") + cache_kvs[0]).c_str()) << dendl; - } else { - return -EINVAL; - } - } - ret = RGWOp::verify_requester(auth_registry); - if(!ret && backup_range) { - rgw_env->set("HTTP_RANGE",backup_range); - } else { - rgw_env->remove("HTTP_RANGE"); - } - + RGWEnv* rgw_env = const_cast(s->info.env); + const char *backup_range = rgw_env->get("HTTP_RANGE"); + const char hdrs_split[2] = {(char)178,'\0'}; + const char kv_split[2] = {(char)177,'\0'}; + const char* cache_hdr = rgw_env->get("HTTP_X_AMZ_CACHE"); + for (std::string_view hdr : ceph::split(cache_hdr, hdrs_split)) { + auto kv = ceph::split(hdr, kv_split); + auto k = kv.begin(); + if (std::distance(k, kv.end()) != 2) { + return -EINVAL; + } + auto v = std::next(k); + std::string key = "HTTP_"; + key.append(*k); + boost::replace_all(key, "-", "_"); + rgw_env->set(std::move(key), *v); + ldpp_dout(this,2) << "after splitting cache kv key: " << key << " " << rgw_env->get(key.c_str()) << dendl; } - catch(const ceph::crypto::DigestException& e) { - dout(0) << "cache authentication failed" << e.what() << dendl; - abort_early(s, this, -EINVAL, dialect_handler); + ret = RGWOp::verify_requester(auth_registry); + if(!ret && backup_range) { + rgw_env->set("HTTP_RANGE",backup_range); + } else { + rgw_env->remove("HTTP_RANGE"); } return ret; } diff --git a/src/rgw/rgw_rest_s3.h b/src/rgw/rgw_rest_s3.h index 6fee978f36bc..a4f9fb41ce3a 100644 --- a/src/rgw/rgw_rest_s3.h +++ b/src/rgw/rgw_rest_s3.h @@ -42,12 +42,12 @@ protected: // just the status line altered. int custom_http_ret = 0; std::map crypt_http_responses; + int override_range_hdr(const rgw::auth::StrategyRegistry& auth_registry); public: RGWGetObj_ObjStore_S3() {} ~RGWGetObj_ObjStore_S3() override {} int verify_requester(const rgw::auth::StrategyRegistry& auth_registry) override; - int override_range_hdr(const rgw::auth::StrategyRegistry& auth_registry); int get_params() override; int send_response_data_error() override; int send_response_data(bufferlist& bl, off_t ofs, off_t len) override;