diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2012-10-11 09:40:39 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2012-10-23 10:43:09 -0700 |
commit | 3faf6ab56d573b9a77fec653e9c3c9a017af991d (patch) | |
tree | c8a1ddd8009c548cfa4843d9b31657cbebb0dfec | |
parent | 846bb34335f2069eaf911609399ffbd4f5c5d97b (diff) | |
download | ceph-3faf6ab56d573b9a77fec653e9c3c9a017af991d.tar.gz |
rgw: handle success_action_redirect
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_common.h | 1 | ||||
-rw-r--r-- | src/rgw/rgw_html_errors.h | 1 | ||||
-rw-r--r-- | src/rgw/rgw_op.h | 1 | ||||
-rw-r--r-- | src/rgw/rgw_rest.cc | 10 | ||||
-rw-r--r-- | src/rgw/rgw_rest.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_rest_s3.cc | 13 |
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; |