From 16c8bff93b23ca1bfe33cc744ca0ca1fa06ebce9 Mon Sep 17 00:00:00 2001 From: ache Date: Thu, 14 Feb 2019 05:04:56 +0100 Subject: Handle Move method --- server.go | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/server.go b/server.go index d072342..13cc673 100644 --- a/server.go +++ b/server.go @@ -177,16 +177,64 @@ func handleMove( w http.ResponseWriter, r *http.Request) { overwrite = r.Header.Get("Overwrite") } + /* 5 cases + src doesn't exist => error + src is a directory, dest a file => error + src is a directory, dest doesn't exist => rename + src is a file, dest doesn't exist or is a file => overwrite or not + dest is a directory => move src to that directory + */ + if filename == "" || filename == "." { w.WriteHeader(http.StatusBadRequest) fmt.Fprintln(w, "Cannot move root directory") return } - if tmpDir, err := os.Stat( path.Dir( dest ) ) ; err == nil && tmpDir.IsDir() { - + tmpStatDest, errDest := os.Stat( dest ) + + // Case 1 + if tmpStat, err := os.Stat( filename ) ; err != nil { + if os.IsNotExist( err ) { + w.WriteHeader(http.StatusBadRequest) + fmt.Fprintf(w, "%s doesn't exist bro\n", filename) + } else { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "¯\\_(ツ)_/¯ with [%s]\n", filename) + } + return + } else if tmpStat.IsDir() { // Case 2 & 3 + if errDest != nil { + if !os.IsNotExist( errDest ) { // Case 3 just rename + w.WriteHeader(http.StatusConflict) + fmt.Fprintf(w, "Error %s\n", err.Error()) + return + } + } else if tmpStatDest.Mode().IsRegular() { + w.WriteHeader(http.StatusConflict) + fmt.Fprintf(w, "Can't write a collection over a file\n") + return + } + } + if errDest == nil { + if tmpStatDest.IsDir() { // Case 5 + if dest[len(dest) - 1] != '/' { + dest += "/" + } + dest += path.Base(filename) + } else if tmpStatDest.Mode().IsRegular() && overwrite == "F" { + os.Remove(dest) + } + } + + err := os.Rename( filename, dest ) + + if err != nil { + w.WriteHeader(http.StatusConflict) + fmt.Fprintf(w, "Error : %s\n", err.Error()) + } else { + w.WriteHeader(http.StatusCreated) } - fmt.Printf("Trying to move [%s] to [%s]\n", filename, dest) } func handleMethod( w http.ResponseWriter, r *http.Request) { -- cgit v1.2.3