summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorache <ache@ache.one>2019-02-14 05:04:56 +0100
committerache <ache@ache.one>2019-02-14 05:04:56 +0100
commit16c8bff93b23ca1bfe33cc744ca0ca1fa06ebce9 (patch)
tree161744b261d401cf0b0645bed882cc1cf3ea959c
parentGrid CSS (diff)
Handle Move method
-rw-r--r--server.go54
1 files 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) {