From: Babu Shanmugam Date: Tue, 7 May 2013 08:18:13 +0000 (+0530) Subject: Modified PutMetadata::get_data() to handle chunked transfers X-Git-Tag: v0.67-rc1~128^2~117 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b64640764a959cd58f08348dfbde91eb90d6c46d;p=ceph.git Modified PutMetadata::get_data() to handle chunked transfers Signed-off-by: Babu Shanmugam --- diff --git a/src/rgw/rgw_rest_metadata.cc b/src/rgw/rgw_rest_metadata.cc index a0a79eb752c..eb4d107b7f8 100644 --- a/src/rgw/rgw_rest_metadata.cc +++ b/src/rgw/rgw_rest_metadata.cc @@ -11,6 +11,8 @@ * Foundation. See file COPYING. * */ +#include "include/page.h" + #include "rgw_rest.h" #include "rgw_op.h" #include "rgw_rest_s3.h" @@ -104,14 +106,16 @@ void RGWOp_Metadata_List::execute() { int RGWOp_Metadata_Put::get_data(bufferlist& bl) { size_t cl = 0; + char *data; + int read_len; + if (s->length) cl = atoll(s->length); if (cl) { - char *data = (char *)malloc(cl + 1); + data = (char *)malloc(cl + 1); if (!data) { return -ENOMEM; } - int read_len; int r = s->cio->read(data, cl, &read_len); if (cl != (size_t)read_len) { dout(10) << "cio->read incomplete" << dendl; @@ -121,9 +125,27 @@ int RGWOp_Metadata_Put::get_data(bufferlist& bl) { return r; } bl.append(data, read_len); - free(data); + } else { + int chunk_size = CEPH_PAGE_SIZE; + const char *enc = s->env->get("HTTP_TRANSFER_ENCODING"); + if (!enc || strcmp(enc, "chunked")) { + return -ERR_LENGTH_REQUIRED; + } + data = (char *)malloc(chunk_size); + if (!data) { + return -ENOMEM; + } + do { + int r = s->cio->read(data, chunk_size, &read_len); + if (r < 0) { + free(data); + return r; + } + bl.append(data, read_len); + } while ((read_len == chunk_size)); } + free(data); return 0; }