]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: handle success_action_redirect
authorYehuda Sadeh <yehuda@inktank.com>
Thu, 11 Oct 2012 16:40:39 +0000 (09:40 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Tue, 23 Oct 2012 17:43:09 +0000 (10:43 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_common.h
src/rgw/rgw_html_errors.h
src/rgw/rgw_op.h
src/rgw/rgw_rest.cc
src/rgw/rgw_rest.h
src/rgw/rgw_rest_s3.cc

index 1349a614061c48157938fd55fcb766941af16397..0ebaa9fa4e047500f0e6018a8f938859ef361b56 100644 (file)
@@ -81,6 +81,7 @@ using ceph::crypto::MD5;
 #define STATUS_ACCEPTED          1901
 #define STATUS_NO_CONTENT        1902
 #define STATUS_PARTIAL_CONTENT   1903
+#define STATUS_REDIRECT          1904
 
 #define ERR_INVALID_BUCKET_NAME  2000
 #define ERR_INVALID_OBJECT_NAME  2001
index c4335bcaf0a6cfde136c436e3ab957d64376ad6e..9fa370940c683cd09ef00728dc10e1d6334240c0 100644 (file)
@@ -15,6 +15,7 @@ const static struct rgw_html_errors RGW_HTML_ERRORS[] = {
     { STATUS_ACCEPTED, 202, "Accepted" },
     { STATUS_NO_CONTENT, 204, "NoContent" },
     { STATUS_PARTIAL_CONTENT, 206, "" },
+    { STATUS_REDIRECT, 303, "" },
     { ERR_NOT_MODIFIED, 304, "NotModified" },
     { EINVAL, 400, "InvalidArgument" },
     { ERR_INVALID_REQUEST, 400, "InvalidRequest" },
index 41b64e1a391a2afe61688a8186a7b9ef9dd26e39..e41d189aa75fb11b54e59d4eb3f02bf4c51b4278 100644 (file)
@@ -320,7 +320,6 @@ protected:
   bool data_pending;
   string content_type;
   RGWAccessControlPolicy policy;
-  map<string, string> form_param;
   map<string, bufferlist> attrs;
 
 public:
index 2b68a79b78aba2f37e85b771fcd827fa8f205dbe..1099d5ee479b6a9c5b1e94f2251282241d9c4352 100644 (file)
@@ -203,12 +203,12 @@ void dump_uri_from_state(struct req_state *s)
   }
 }
 
-void dump_redirect(struct req_state *s, const char *url)
+void dump_redirect(struct req_state *s, const string& redirect)
 {
-  if (strlen(url) > 0) {
-    dump_errno(s, 301);
-    s->cio->print("Location: %s\n", url);
-  }
+  if (redirect.empty())
+    return;
+
+  s->cio->print("Location: %s\n", redirect.c_str());
 }
 
 void dump_last_modified(struct req_state *s, time_t t)
index ef46c0c12a881eb4a27a801b3fd7c1dcdc10b9a8..4ac5a5383e3f09b03c0a3a61c5ba807deadff2f7 100644 (file)
@@ -294,7 +294,7 @@ extern void dump_time(struct req_state *s, const char *name, time_t *t);
 extern void dump_bucket_from_state(struct req_state *s);
 extern void dump_object_from_state(struct req_state *s);
 extern void dump_uri_from_state(struct req_state *s);
-extern void dump_redirect(struct req_state *s, const char *url);
+extern void dump_redirect(struct req_state *s, const string& redirect);
 extern void dump_pair(struct req_state *s, const char *key, const char *value);
 extern bool is_valid_url(const char *url);
 
index 5e8ed449fed06874feb8bea50c34be248da94480..97edfb94eb5f77be1a79d0f26bf2227dbdad95b5 100644 (file)
@@ -926,18 +926,19 @@ int RGWPostObj_ObjStore_S3::get_data(bufferlist& bl)
 
 void RGWPostObj_ObjStore_S3::send_response()
 {
-  set_req_state_err(s, ret);
-
   if (ret == 0 && parts.count("success_action_redirect")) {
     string success_action_redirect;
     part_str("success_action_redirect", &success_action_redirect);
-    if (check_utf8(success_action_redirect.c_str(), success_action_redirect.size())) {
-      dump_redirect(s, form_param["success_action_redirect"].c_str());
+    if (check_utf8(success_action_redirect.c_str(), success_action_redirect.size()) == 0) {
+      dump_redirect(s, success_action_redirect);
+      set_req_state_err(s, STATUS_REDIRECT);
+      dump_errno(s);
       end_header(s, "text/plain");
       return;
     }
   } else if (ret == 0 && parts.count("success_action_status")) {
-    string status_string = form_param["success_action_status"];
+    string status_string;
+    part_str("success_action_status", &status_string);
     int status_int;
     if ( !(istringstream(status_string) >> status_int) )
       status_int = 200;
@@ -946,6 +947,8 @@ void RGWPostObj_ObjStore_S3::send_response()
   } else {
     dump_errno(s);
   }
+  set_req_state_err(s, ret);
+
   end_header(s);
   if (ret < 0)
     return;