{
int ret = -EINVAL;
ldpp_dout(this,2) << "cache override headers" << dendl;
- try {
- RGWEnv* rgw_env = const_cast<RGWEnv *>(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<string> 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<RGWEnv *>(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;
}
// just the status line altered.
int custom_http_ret = 0;
std::map<std::string, std::string> 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;