From 6778d230901612db927698996e123c7b63b46cd7 Mon Sep 17 00:00:00 2001 From: Lena Fuhrimann <6780471+cloudlena@users.noreply.github.com> Date: Fri, 14 Apr 2017 19:52:16 +0200 Subject: [PATCH] Separate handlers for create object --- create-object.go | 96 ++++++++++++++++++++++++------------------------ glide.lock | 4 +- main.go | 12 +++++- minio.go | 4 +- 4 files changed, 64 insertions(+), 52 deletions(-) diff --git a/create-object.go b/create-object.go index 80e3503..61be02e 100644 --- a/create-object.go +++ b/create-object.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "net/http" - "strings" "github.com/gorilla/mux" minio "github.com/minio/minio-go" @@ -18,57 +17,60 @@ type CopyObjectInfo struct { SourceObjectName string `json:"sourceObjectName"` } -// CreateObjectHandler allows to upload a new object -func CreateObjectHandler(s3 S3Client) http.Handler { +// CreateObjectFromJSONHandler allows to copy an existing object +func CreateObjectFromJSONHandler(s3 S3Client) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) + var copy CopyObjectInfo - if strings.Contains(r.Header.Get(headerContentType), contentTypeJSON) { - var copy CopyObjectInfo + err := json.NewDecoder(r.Body).Decode(©) + if err != nil { + handleHTTPError(w, http.StatusInternalServerError, err) + return + } - err := json.NewDecoder(r.Body).Decode(©) - if err != nil { - handleHTTPError(w, http.StatusInternalServerError, err) - return - } + copyConds := minio.NewCopyConditions() + objectSource := fmt.Sprintf("/%s/%s", copy.SourceBucketName, copy.SourceObjectName) + err = s3.CopyObject(copy.BucketName, copy.ObjectName, objectSource, copyConds) + if err != nil { + handleHTTPError(w, http.StatusInternalServerError, err) + return + } - copyConds := minio.NewCopyConditions() - objectSource := fmt.Sprintf("/%s/%s", copy.SourceBucketName, copy.SourceObjectName) - err = s3.CopyObject(copy.BucketName, copy.ObjectName, objectSource, copyConds) - if err != nil { - handleHTTPError(w, http.StatusInternalServerError, err) - return - } + w.Header().Set(headerContentType, contentTypeJSON) + w.WriteHeader(http.StatusCreated) - w.Header().Set(headerContentType, contentTypeJSON) - w.WriteHeader(http.StatusCreated) - - err = json.NewEncoder(w).Encode(copy) - if err != nil { - handleHTTPError(w, http.StatusInternalServerError, err) - return - } - } else { - err := r.ParseMultipartForm(32 << 20) - if err != nil { - handleHTTPError(w, http.StatusUnprocessableEntity, err) - return - } - - file, handler, err := r.FormFile("file") - if err != nil { - handleHTTPError(w, http.StatusInternalServerError, err) - return - } - defer file.Close() - - _, err = s3.PutObject(vars["bucketName"], handler.Filename, file, contentTypeOctetStream) - if err != nil { - handleHTTPError(w, http.StatusInternalServerError, err) - return - } - - w.WriteHeader(http.StatusCreated) + err = json.NewEncoder(w).Encode(copy) + if err != nil { + handleHTTPError(w, http.StatusInternalServerError, err) + return } }) } + +// CreateObjectFromFormHandler allows to upload a new object +func CreateObjectFromFormHandler(s3 S3Client) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + + err := r.ParseMultipartForm(32 << 20) + if err != nil { + handleHTTPError(w, http.StatusUnprocessableEntity, err) + return + } + + file, handler, err := r.FormFile("file") + if err != nil { + handleHTTPError(w, http.StatusInternalServerError, err) + return + } + defer file.Close() + + _, err = s3.PutObject(vars["bucketName"], handler.Filename, file, contentTypeOctetStream) + if err != nil { + handleHTTPError(w, http.StatusInternalServerError, err) + return + } + + w.WriteHeader(http.StatusCreated) + }) +} diff --git a/glide.lock b/glide.lock index 611db9b..e44071a 100644 --- a/glide.lock +++ b/glide.lock @@ -1,8 +1,8 @@ hash: 9b88c8ce183463a407bdb87f79b6b857d8343a7bb5ce4723223c539c654d6d6d -updated: 2017-04-11T20:07:50.857342641+02:00 +updated: 2017-04-14T19:23:49.562207386+02:00 imports: - name: github.com/gorilla/context - version: 08b5f424b9271eedf6f9f0ce86cb9396ed337a42 + version: 1ea25387ff6f684839d82767c1733ff4d4d15d0a - name: github.com/gorilla/mux version: 392c28fe23e1c45ddba891b0320b3b5df220beea - name: github.com/mastertinner/adapters diff --git a/main.go b/main.go index b252586..83751e2 100644 --- a/main.go +++ b/main.go @@ -15,6 +15,7 @@ const ( headerContentType = "Content-Type" headerContentDisposition = "Content-Disposition" contentTypeJSON = "application/json" + contentTypeMultipartForm = "multipart/form-data" contentTypeOctetStream = "application/octet-stream" ) @@ -68,9 +69,18 @@ func main() { )) br. Methods(http.MethodPost). + Headers(headerContentType, contentTypeJSON). Path("/{bucketName}/objects"). Handler(adapters.Adapt( - CreateObjectHandler(s3), + CreateObjectFromJSONHandler(s3), + logging.Handler(logger), + )) + br. + Methods(http.MethodPost). + HeadersRegexp(headerContentType, contentTypeMultipartForm). + Path("/{bucketName}/objects"). + Handler(adapters.Adapt( + CreateObjectFromFormHandler(s3), logging.Handler(logger), )) br. diff --git a/minio.go b/minio.go index 30ee88d..6762828 100644 --- a/minio.go +++ b/minio.go @@ -19,12 +19,12 @@ func newMinioClient() (*minio.Client, error) { s3AccessKeyID := os.Getenv("S3_ACCESS_KEY_ID") if s3AccessKeyID == "" { - return c, errors.New("no S3_ACCESS_KEY_ID found") + return nil, errors.New("no S3_ACCESS_KEY_ID found") } s3SecretAccessKey := os.Getenv("S3_SECRET_ACCESS_KEY") if s3SecretAccessKey == "" { - return c, errors.New("no S3_SECRET_ACCESS_KEY found") + return nil, errors.New("no S3_SECRET_ACCESS_KEY found") } if os.Getenv("V2_SIGNING") == "true" {