From: Yehuda Sadeh Date: Fri, 12 Dec 2014 19:20:26 +0000 (-0800) Subject: rgw: http headers need to end with \r\n X-Git-Tag: v0.87.1~20^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=84e9b6c32c6fdc38e2c64f3360c185332e691bf4;p=ceph.git rgw: http headers need to end with \r\n Fixes: #9254 Backport: firefly, giant Reported-by: Benedikt Fraunhofer Signed-off-by: Yehuda Sadeh (cherry picked from commit 7409ab3df18fb312dd6c9f79084f889c523afdce) --- diff --git a/src/rgw/rgw_civetweb.cc b/src/rgw/rgw_civetweb.cc index c6094d463d4c4..901b2ded8ac69 100644 --- a/src/rgw/rgw_civetweb.cc +++ b/src/rgw/rgw_civetweb.cc @@ -44,7 +44,7 @@ int RGWMongoose::complete_request() if (0 && data.length() == 0) { has_content_length = true; - print("Transfer-Enconding: %s\n", "chunked"); + print("Transfer-Enconding: %s\r\n", "chunked"); data.append("0\r\n\r\n", sizeof("0\r\n\r\n")-1); } else { int r = send_content_length(data.length()); @@ -130,7 +130,7 @@ int RGWMongoose::send_status(const char *status, const char *status_name) if (!status_name) status_name = ""; - snprintf(buf, sizeof(buf), "HTTP/1.1 %s %s\n", status, status_name); + snprintf(buf, sizeof(buf), "HTTP/1.1 %s %s\r\n", status, status_name); bufferlist bl; bl.append(buf); @@ -170,5 +170,5 @@ int RGWMongoose::send_content_length(uint64_t len) has_content_length = true; char buf[21]; snprintf(buf, sizeof(buf), "%" PRIu64, len); - return print("Content-Length: %s\n", buf); + return print("Content-Length: %s\r\n", buf); } diff --git a/src/rgw/rgw_fcgi.cc b/src/rgw/rgw_fcgi.cc index 1a320e1dc6533..0006834b44970 100644 --- a/src/rgw/rgw_fcgi.cc +++ b/src/rgw/rgw_fcgi.cc @@ -33,7 +33,7 @@ void RGWFCGX::init_env(CephContext *cct) int RGWFCGX::send_status(const char *status, const char *status_name) { - return print("Status: %s %s\n", status, status_name); + return print("Status: %s %s\r\n", status, status_name); } int RGWFCGX::send_100_continue() @@ -49,7 +49,7 @@ int RGWFCGX::send_content_length(uint64_t len) { char buf[21]; snprintf(buf, sizeof(buf), "%" PRIu64, len); - return print("Content-Length: %s\n", buf); + return print("Content-Length: %s\r\n", buf); } int RGWFCGX::complete_header() diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 153628d5722c9..119bad28ef9f3 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -247,7 +247,7 @@ void dump_content_length(struct req_state *s, uint64_t len) if (r < 0) { ldout(s->cct, 0) << "ERROR: s->cio->print() returned err=" << r << dendl; } - r = s->cio->print("Accept-Ranges: %s\n", "bytes"); + r = s->cio->print("Accept-Ranges: %s\r\n", "bytes"); if (r < 0) { ldout(s->cct, 0) << "ERROR: s->cio->print() returned err=" << r << dendl; } @@ -257,9 +257,9 @@ void dump_etag(struct req_state *s, const char *etag) { int r; if (s->prot_flags & RGW_REST_SWIFT) - r = s->cio->print("etag: %s\n", etag); + r = s->cio->print("etag: %s\r\n", etag); else - r = s->cio->print("ETag: \"%s\"\n", etag); + r = s->cio->print("ETag: \"%s\"\r\n", etag); if (r < 0) { ldout(s->cct, 0) << "ERROR: s->cio->print() returned err=" << r << dendl; } @@ -268,7 +268,7 @@ void dump_etag(struct req_state *s, const char *etag) void dump_pair(struct req_state *s, const char *key, const char *value) { if ( (strlen(key) > 0) && (strlen(value) > 0)) - s->cio->print("%s: %s\n", key, value); + s->cio->print("%s: %s\r\n", key, value); } void dump_bucket_from_state(struct req_state *s) @@ -276,16 +276,10 @@ void dump_bucket_from_state(struct req_state *s) int expose_bucket = g_conf->rgw_expose_bucket; if (expose_bucket) { if (!s->bucket_name_str.empty()) - s->cio->print("Bucket: \"%s\"\n", s->bucket_name_str.c_str()); + s->cio->print("Bucket: \"%s\"\r\n", s->bucket_name_str.c_str()); } } -void dump_object_from_state(struct req_state *s) -{ - if (!s->object_str.empty()) - s->cio->print("Key: \"%s\"\n", s->object_str.c_str()); -} - void dump_uri_from_state(struct req_state *s) { if (strcmp(s->info.request_uri.c_str(), "/") == 0) { @@ -299,12 +293,12 @@ void dump_uri_from_state(struct req_state *s) location += "/"; if (!s->object_str.empty()) { location += s->object_str; - s->cio->print("Location: %s\n", location.c_str()); + s->cio->print("Location: %s\r\n", location.c_str()); } } } else { - s->cio->print("Location: \"%s\"\n", s->info.request_uri.c_str()); + s->cio->print("Location: \"%s\"\r\n", s->info.request_uri.c_str()); } } @@ -313,7 +307,7 @@ void dump_redirect(struct req_state *s, const string& redirect) if (redirect.empty()) return; - s->cio->print("Location: %s\n", redirect.c_str()); + s->cio->print("Location: %s\r\n", redirect.c_str()); } static void dump_time_header(struct req_state *s, const char *name, time_t t) @@ -328,7 +322,7 @@ static void dump_time_header(struct req_state *s, const char *name, time_t t) if (strftime(timestr, sizeof(timestr), "%a, %d %b %Y %H:%M:%S %Z", tmp) == 0) return; - int r = s->cio->print("%s: %s\n", name, timestr); + int r = s->cio->print("%s: %s\r\n", name, timestr); if (r < 0) { ldout(s->cct, 0) << "ERROR: s->cio->print() returned err=" << r << dendl; } @@ -344,7 +338,7 @@ void dump_epoch_header(struct req_state *s, const char *name, time_t t) char buf[32]; snprintf(buf, sizeof(buf), "%lld", (long long)t); - int r = s->cio->print("%s: %s\n", name, buf); + int r = s->cio->print("%s: %s\r\n", name, buf); if (r < 0) { ldout(s->cct, 0) << "ERROR: s->cio->print() returned err=" << r << dendl; } @@ -377,16 +371,16 @@ void dump_owner(struct req_state *s, string& id, string& name, const char *secti void dump_access_control(struct req_state *s, const char *origin, const char *meth, const char *hdr, const char *exp_hdr, uint32_t max_age) { if (origin && (origin[0] != '\0')) { - s->cio->print("Access-Control-Allow-Origin: %s\n", origin); + s->cio->print("Access-Control-Allow-Origin: %s\r\n", origin); if (meth && (meth[0] != '\0')) - s->cio->print("Access-Control-Allow-Methods: %s\n", meth); + s->cio->print("Access-Control-Allow-Methods: %s\r\n", meth); if (hdr && (hdr[0] != '\0')) - s->cio->print("Access-Control-Allow-Headers: %s\n", hdr); + s->cio->print("Access-Control-Allow-Headers: %s\r\n", hdr); if (exp_hdr && (exp_hdr[0] != '\0')) { - s->cio->print("Access-Control-Expose-Headers: %s\n", exp_hdr); + s->cio->print("Access-Control-Expose-Headers: %s\r\n", exp_hdr); } if (max_age != CORS_MAX_AGE_INVALID) { - s->cio->print("Access-Control-Max-Age: %d\n", max_age); + s->cio->print("Access-Control-Max-Age: %d\r\n", max_age); } } } @@ -486,7 +480,7 @@ void dump_range(struct req_state *s, uint64_t ofs, uint64_t end, uint64_t total) /* dumping range into temp buffer first, as libfcgi will fail to digest %lld */ snprintf(range_buf, sizeof(range_buf), "%lld-%lld/%lld", (long long)ofs, (long long)end, (long long)total); - int r = s->cio->print("Content-Range: bytes %s\n", range_buf); + int r = s->cio->print("Content-Range: bytes %s\r\n", range_buf); if (r < 0) { ldout(s->cct, 0) << "ERROR: s->cio->print() returned err=" << r << dendl; } diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h index cc43c2ec49fbd..36dc7ce42ddec 100644 --- a/src/rgw/rgw_rest.h +++ b/src/rgw/rgw_rest.h @@ -372,7 +372,6 @@ extern void dump_continue(struct req_state *s); extern void list_all_buckets_end(struct req_state *s); 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 string& redirect); extern void dump_pair(struct req_state *s, const char *key, const char *value); diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index b5a7a7266d6ee..6ea334ff5df56 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -164,7 +164,7 @@ done: dump_errno(s); for (riter = response_attrs.begin(); riter != response_attrs.end(); ++riter) { - s->cio->print("%s: %s\n", riter->first.c_str(), riter->second.c_str()); + s->cio->print("%s: %s\r\n", riter->first.c_str(), riter->second.c_str()); } if (!content_type) @@ -323,9 +323,9 @@ static void dump_bucket_metadata(struct req_state *s, RGWBucketEnt& bucket) { char buf[32]; snprintf(buf, sizeof(buf), "%lld", (long long)bucket.count); - s->cio->print("X-RGW-Object-Count: %s\n", buf); + s->cio->print("X-RGW-Object-Count: %s\r\n", buf); snprintf(buf, sizeof(buf), "%lld", (long long)bucket.size); - s->cio->print("X-RGW-Bytes-Used: %s\n", buf); + s->cio->print("X-RGW-Bytes-Used: %s\r\n", buf); } void RGWStatBucket_ObjStore_S3::send_response() diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index e04e2c0cdd2d8..325fed8933a34 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -225,11 +225,11 @@ static void dump_container_metadata(struct req_state *s, RGWBucketEnt& bucket) { char buf[32]; snprintf(buf, sizeof(buf), "%lld", (long long)bucket.count); - s->cio->print("X-Container-Object-Count: %s\n", buf); + s->cio->print("X-Container-Object-Count: %s\r\n", buf); snprintf(buf, sizeof(buf), "%lld", (long long)bucket.size); - s->cio->print("X-Container-Bytes-Used: %s\n", buf); + s->cio->print("X-Container-Bytes-Used: %s\r\n", buf); snprintf(buf, sizeof(buf), "%lld", (long long)bucket.size_rounded); - s->cio->print("X-Container-Bytes-Used-Actual: %s\n", buf); + s->cio->print("X-Container-Bytes-Used-Actual: %s\r\n", buf); if (!s->object) { RGWAccessControlPolicy_SWIFT *swift_policy = static_cast(s->bucket_acl); @@ -249,13 +249,13 @@ static void dump_account_metadata(struct req_state *s, uint32_t buckets_count, { char buf[32]; snprintf(buf, sizeof(buf), "%lld", (long long)buckets_count); - s->cio->print("X-Account-Container-Count: %s\n", buf); + s->cio->print("X-Account-Container-Count: %s\r\n", buf); snprintf(buf, sizeof(buf), "%lld", (long long)buckets_object_count); - s->cio->print("X-Account-Object-Count: %s\n", buf); + s->cio->print("X-Account-Object-Count: %s\r\n", buf); snprintf(buf, sizeof(buf), "%lld", (long long)buckets_size); - s->cio->print("X-Account-Bytes-Used: %s\n", buf); + s->cio->print("X-Account-Bytes-Used: %s\r\n", buf); snprintf(buf, sizeof(buf), "%lld", (long long)buckets_size_rounded); - s->cio->print("X-Account-Bytes-Used-Actual: %s\n", buf); + s->cio->print("X-Account-Bytes-Used-Actual: %s\r\n", buf); } void RGWStatAccount_ObjStore_SWIFT::send_response() @@ -598,7 +598,7 @@ int RGWGetObj_ObjStore_SWIFT::send_response_data(bufferlist& bl, off_t bl_ofs, o dump_errno(s); for (riter = response_attrs.begin(); riter != response_attrs.end(); ++riter) { - s->cio->print("%s: %s\n", riter->first.c_str(), riter->second.c_str()); + s->cio->print("%s: %s\r\n", riter->first.c_str(), riter->second.c_str()); } if (!content_type) diff --git a/src/rgw/rgw_swift_auth.cc b/src/rgw/rgw_swift_auth.cc index ccbe3db3b5fa2..e5e03d20c898d 100644 --- a/src/rgw/rgw_swift_auth.cc +++ b/src/rgw/rgw_swift_auth.cc @@ -208,7 +208,7 @@ void RGW_SWIFT_Auth_Get::execute() tenant_path.append(g_conf->rgw_swift_tenant_name); } - s->cio->print("X-Storage-Url: %s/%s/v1%s\n", swift_url.c_str(), + s->cio->print("X-Storage-Url: %s/%s/v1%s\r\n", swift_url.c_str(), swift_prefix.c_str(), tenant_path.c_str()); if ((ret = encode_token(s->cct, swift_key->id, swift_key->key, bl)) < 0) @@ -218,8 +218,8 @@ void RGW_SWIFT_Auth_Get::execute() char buf[bl.length() * 2 + 1]; buf_to_hex((const unsigned char *)bl.c_str(), bl.length(), buf); - s->cio->print("X-Storage-Token: AUTH_rgwtk%s\n", buf); - s->cio->print("X-Auth-Token: AUTH_rgwtk%s\n", buf); + s->cio->print("X-Storage-Token: AUTH_rgwtk%s\r\n", buf); + s->cio->print("X-Auth-Token: AUTH_rgwtk%s\r\n", buf); } ret = STATUS_NO_CONTENT;