]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fixes to override_range_hdr
authorOr Friedmann <ofriedma@redhat.com>
Tue, 12 May 2020 15:20:34 +0000 (18:20 +0300)
committerNathan Cutler <ncutler@suse.com>
Sat, 15 Aug 2020 12:59:07 +0000 (14:59 +0200)
Signed-off-by: Or Friedmann <ofriedma@redhat.com>
(cherry picked from commit e6e1dd868140e7ed356e007d4bf95a5bd2415035)

src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_s3.h

index f9bd0a83f2c59fe40b269dda371a02af71442199..e3c8025e516833434a6306d47c8b874e737fb7e5 100644 (file)
@@ -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<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;
 }
index 6fee978f36bca018c03fd467b1039cc1df008ca0..a4f9fb41ce3abe00efaeee2f5ce78836d956ef72 100644 (file)
@@ -42,12 +42,12 @@ protected:
   // 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;