]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Modified PutMetadata::get_data() to handle chunked transfers
authorBabu Shanmugam <anbu@enovance.com>
Tue, 7 May 2013 08:18:13 +0000 (13:48 +0530)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 15 May 2013 01:52:33 +0000 (18:52 -0700)
Signed-off-by: Babu Shanmugam <anbu@enovance.com>
src/rgw/rgw_rest_metadata.cc

index a0a79eb752c4de91b537646d3f52baf068f91cf0..eb4d107b7f8ae26449fa6f3566f34c1b1a095a17 100644 (file)
@@ -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;
 }