diff options
author | ache <ache@ache.one> | 2019-02-14 05:04:56 +0100 |
---|---|---|
committer | ache <ache@ache.one> | 2019-02-14 05:04:56 +0100 |
commit | 16c8bff93b23ca1bfe33cc744ca0ca1fa06ebce9 (patch) | |
tree | 161744b261d401cf0b0645bed882cc1cf3ea959c | |
parent | Grid CSS (diff) |
Handle Move method
-rw-r--r-- | server.go | 54 |
1 files changed, 51 insertions, 3 deletions
@@ -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) { |