From b18bb230dacadd62f53935b254170e3f74584334 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Wed, 29 Apr 2015 02:19:51 -0700 Subject: [PATCH] maxObjectSize and minObjectSize limitation added at putObjectHandler() Put() replies back with - EntityTooLarge with > 5GB in single PUT operation - EntityTooSmall with < 1B in single PUT operation - IncompleteBody with ho Content-Length found in HTTP request header --- pkg/api/api_object_handlers.go | 15 +++++++++- pkg/api/utils.go | 50 ++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/pkg/api/api_object_handlers.go b/pkg/api/api_object_handlers.go index aeb35e338..fa13b4076 100644 --- a/pkg/api/api_object_handlers.go +++ b/pkg/api/api_object_handlers.go @@ -139,7 +139,7 @@ func (server *minioAPI) putObjectHandler(w http.ResponseWriter, req *http.Reques return } - // handle PublicRead ACL here + // handle ACL's here at bucket level if !server.isValidOp(w, req, acceptsContentType) { return } @@ -155,6 +155,19 @@ func (server *minioAPI) putObjectHandler(w http.ResponseWriter, req *http.Reques writeErrorResponse(w, req, InvalidDigest, acceptsContentType, req.URL.Path) return } + size := req.Header.Get("Content-Length") + if size == "" { + writeErrorResponse(w, req, IncompleteBody, acceptsContentType, req.URL.Path) + return + } + if isMaxObjectSize(size) { + writeErrorResponse(w, req, EntityTooLarge, acceptsContentType, req.URL.Path) + return + } + if isMinObjectSize(size) { + writeErrorResponse(w, req, EntityTooSmall, acceptsContentType, req.URL.Path) + return + } err := server.driver.CreateObject(bucket, object, "", md5, req.Body) switch err := iodine.ToError(err).(type) { case nil: diff --git a/pkg/api/utils.go b/pkg/api/utils.go index 1828317fb..abc05c3e2 100644 --- a/pkg/api/utils.go +++ b/pkg/api/utils.go @@ -1,10 +1,28 @@ +/* + * Minimalist Object Storage, (C) 2015 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package api import ( "encoding/base64" + "strconv" "strings" ) +// isValidMD5 - verify if valid md5 func isValidMD5(md5 string) bool { if md5 == "" { return true @@ -15,3 +33,35 @@ func isValidMD5(md5 string) bool { } return true } + +// these should be configurable? +const ( + // maximum object size per PUT request is 5GB + maxObjectSize = 1024 * 1024 * 1024 * 5 + // minimum object size per PUT request is 1B + minObjectSize = 1 +) + +// isMaxObjectSize - verify if max object size +func isMaxObjectSize(size string) bool { + i, err := strconv.ParseInt(size, 10, 64) + if err != nil { + return true + } + if i > maxObjectSize { + return true + } + return false +} + +// isMinObjectSize - verify if min object size +func isMinObjectSize(size string) bool { + i, err := strconv.ParseInt(size, 10, 64) + if err != nil { + return true + } + if i < minObjectSize { + return true + } + return false +}