summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2012-10-11 09:40:39 -0700
committerYehuda Sadeh <yehuda@inktank.com>2012-10-23 10:43:09 -0700
commit3faf6ab56d573b9a77fec653e9c3c9a017af991d (patch)
treec8a1ddd8009c548cfa4843d9b31657cbebb0dfec
parent846bb34335f2069eaf911609399ffbd4f5c5d97b (diff)
downloadceph-3faf6ab56d573b9a77fec653e9c3c9a017af991d.tar.gz
rgw: handle success_action_redirect
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_common.h1
-rw-r--r--src/rgw/rgw_html_errors.h1
-rw-r--r--src/rgw/rgw_op.h1
-rw-r--r--src/rgw/rgw_rest.cc10
-rw-r--r--src/rgw/rgw_rest.h2
-rw-r--r--src/rgw/rgw_rest_s3.cc13
6 files changed, 16 insertions, 12 deletions
diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h
index 1349a614061..0ebaa9fa4e0 100644
--- a/src/rgw/rgw_common.h
+++ b/src/rgw/rgw_common.h
@@ -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
diff --git a/src/rgw/rgw_html_errors.h b/src/rgw/rgw_html_errors.h
index c4335bcaf0a..9fa370940c6 100644
--- a/src/rgw/rgw_html_errors.h
+++ b/src/rgw/rgw_html_errors.h
@@ -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" },
diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h
index 41b64e1a391..e41d189aa75 100644
--- a/src/rgw/rgw_op.h
+++ b/src/rgw/rgw_op.h
@@ -320,7 +320,6 @@ protected:
bool data_pending;
string content_type;
RGWAccessControlPolicy policy;
- map<string, string> form_param;
map<string, bufferlist> attrs;
public:
diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc
index 2b68a79b78a..1099d5ee479 100644
--- a/src/rgw/rgw_rest.cc
+++ b/src/rgw/rgw_rest.cc
@@ -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)
diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h
index ef46c0c12a8..4ac5a5383e3 100644
--- a/src/rgw/rgw_rest.h
+++ b/src/rgw/rgw_rest.h
@@ -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);
diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc
index 5e8ed449fed..97edfb94eb5 100644
--- a/src/rgw/rgw_rest_s3.cc
+++ b/src/rgw/rgw_rest_s3.cc
@@ -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;