#define RGW_MAX_CHUNK_SIZE (512*1024)
#define RGW_MAX_PENDING_CHUNKS 16
+#define RGW_MAX_PUT_SIZE (5ULL*1024*1024*1024)
#define RGW_FORMAT_XML 1
#define RGW_FORMAT_JSON 2
#define ERR_NOT_MODIFIED 2016
#define ERR_INVALID_UTF8 2017
#define ERR_UNPROCESSABLE_ENTITY 2018
+#define ERR_TOO_LARGE 2019
#define ERR_USER_SUSPENDED 2100
#define ERR_INTERNAL_ERROR 2200
virtual void init(struct req_state *s) {
this->s = s;
}
+ virtual int verify_params() { return 0; }
virtual bool prefetch_data() { return false; }
virtual int verify_permission() = 0;
virtual void execute() = 0;
{ ERR_INVALID_PART, 400, "InvalidPart" },
{ ERR_INVALID_PART_ORDER, 400, "InvalidPartOrder" },
{ ERR_REQUEST_TIMEOUT, 400, "RequestTimeout" },
+ { ERR_TOO_LARGE, 400, "EntityTooLarge" },
{ ERR_LENGTH_REQUIRED, 411, "MissingContentLength" },
{ EACCES, 403, "AccessDenied" },
{ EPERM, 403, "AccessDenied" },
}
+int RGWPutObj_REST::verify_params()
+{
+ if (s->length) {
+ size_t len = atoll(s->length);
+ if (len > RGW_MAX_PUT_SIZE) {
+ return -ERR_TOO_LARGE;
+ }
+ }
+
+ return 0;
+}
+
int RGWPutObj_REST::get_params()
{
supplied_md5_b64 = s->env->get("HTTP_CONTENT_MD5");
bl.append(bp);
}
+ if ((uint64_t)ofs + len > RGW_MAX_PUT_SIZE) {
+ return -ERR_TOO_LARGE;
+ }
+
if (!ofs)
supplied_md5_b64 = s->env->get("HTTP_CONTENT_MD5");