Correct method for new file/directory

pull/144/head
Henrique Dias 2017-07-04 21:02:46 +01:00
parent a48617de6a
commit d0e7631bc8
No known key found for this signature in database
GPG Key ID: 936F5EB68D786730
6 changed files with 54 additions and 9 deletions

View File

@ -164,7 +164,7 @@ export default {
let promises = [] let promises = []
for (let file of files) { for (let file of files) {
promises.push(api.put(this.$route.path + base + file.name, file)) promises.push(api.post(this.$route.path + base + file.name, file))
} }
Promise.all(promises) Promise.all(promises)

View File

@ -202,7 +202,7 @@ export default {
// Del! // Del!
if (event.keyCode === 46) { if (event.keyCode === 46) {
if (this.showDeleteButton()) { if (this.showDeleteButton) {
this.$store.commit('showHover', 'delete') this.$store.commit('showHover', 'delete')
} }
} }
@ -215,7 +215,7 @@ export default {
// F2! // F2!
if (event.keyCode === 113) { if (event.keyCode === 113) {
if (this.showRenameButton()) { if (this.showRenameButton) {
this.$store.commit('showHover', 'rename') this.$store.commit('showHover', 'rename')
} }
} }

View File

@ -34,7 +34,7 @@ export default {
uri += this.name + '/' uri += this.name + '/'
uri = uri.replace('//', '/') uri = uri.replace('//', '/')
api.put(uri) api.post(uri)
.then(() => { .then(() => {
this.$router.push({ path: uri }) this.$router.push({ path: uri })
}) })

View File

@ -34,7 +34,7 @@ export default {
uri += this.name uri += this.name
uri = uri.replace('//', '/') uri = uri.replace('//', '/')
api.put(uri) api.post(uri)
.then(() => { .then(() => {
this.$router.push({ path: uri }) this.$router.push({ path: uri })
}) })

View File

@ -57,6 +57,27 @@ function rm (url) {
}) })
} }
function post (url, content = '') {
url = removePrefix(url)
return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest()
request.open('POST', `${store.state.baseURL}/api/resource${url}`, true)
request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
request.onload = () => {
if (request.status === 200) {
resolve(request.responseText)
} else {
reject(request.responseText)
}
}
request.onerror = (error) => reject(error)
request.send(content)
})
}
function put (url, content = '') { function put (url, content = '') {
url = removePrefix(url) url = removePrefix(url)
@ -175,6 +196,7 @@ export default {
checksum, checksum,
move, move,
put, put,
post,
command, command,
search, search,
download download

31
api.go
View File

@ -77,9 +77,11 @@ func resourceHandler(c *requestContext, w http.ResponseWriter, r *http.Request)
case http.MethodDelete: case http.MethodDelete:
return deleteHandler(c, w, r) return deleteHandler(c, w, r)
case http.MethodPut: case http.MethodPut:
return putHandler(c, w, r) return postPutHandler(c, w, r)
case http.MethodPatch:
return patchHandler(c, w, r)
case http.MethodPost: case http.MethodPost:
return postHandler(c, w, r) return postPutHandler(c, w, r)
} }
/* // Execute beforeSave if it is a PUT request. /* // Execute beforeSave if it is a PUT request.
@ -183,12 +185,30 @@ func deleteHandler(c *requestContext, w http.ResponseWriter, r *http.Request) (i
return http.StatusOK, nil return http.StatusOK, nil
} }
func putHandler(c *requestContext, w http.ResponseWriter, r *http.Request) (int, error) { func postPutHandler(c *requestContext, w http.ResponseWriter, r *http.Request) (int, error) {
// Checks if the current request is for a directory and not a file.
if strings.HasSuffix(r.URL.Path, "/") { if strings.HasSuffix(r.URL.Path, "/") {
// If the method is PUT, we return 405 Method not Allowed, because
// POST should be used instead.
if r.Method == http.MethodPut {
return http.StatusMethodNotAllowed, nil
}
// Otherwise we try to create the directory.
err := c.us.FileSystem.Mkdir(context.TODO(), r.URL.Path, 0666) err := c.us.FileSystem.Mkdir(context.TODO(), r.URL.Path, 0666)
return errorToHTTP(err, false), err return errorToHTTP(err, false), err
} }
// If using POST method, we are trying to create a new file so it is not
// desirable to override an already existent file. Thus, we check
// if the file already exists. If so, we just return a 409 Conflict.
if r.Method == http.MethodPost {
if _, err := c.us.FileSystem.Stat(context.TODO(), r.URL.Path); err == nil {
return http.StatusConflict, nil
}
}
// Create/Open the file.
f, err := c.us.FileSystem.OpenFile(context.TODO(), r.URL.Path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) f, err := c.us.FileSystem.OpenFile(context.TODO(), r.URL.Path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
defer f.Close() defer f.Close()
@ -196,22 +216,25 @@ func putHandler(c *requestContext, w http.ResponseWriter, r *http.Request) (int,
return errorToHTTP(err, false), err return errorToHTTP(err, false), err
} }
// Copies the new content for the file.
_, err = io.Copy(f, r.Body) _, err = io.Copy(f, r.Body)
if err != nil { if err != nil {
return errorToHTTP(err, false), err return errorToHTTP(err, false), err
} }
// Gets the info about the file.
fi, err := f.Stat() fi, err := f.Stat()
if err != nil { if err != nil {
return errorToHTTP(err, false), err return errorToHTTP(err, false), err
} }
// Writes the ETag Header.
etag := fmt.Sprintf(`"%x%x"`, fi.ModTime().UnixNano(), fi.Size()) etag := fmt.Sprintf(`"%x%x"`, fi.ModTime().UnixNano(), fi.Size())
w.Header().Set("ETag", etag) w.Header().Set("ETag", etag)
return http.StatusOK, nil return http.StatusOK, nil
} }
func postHandler(c *requestContext, w http.ResponseWriter, r *http.Request) (int, error) { func patchHandler(c *requestContext, w http.ResponseWriter, r *http.Request) (int, error) {
dst := r.Header.Get("Destination") dst := r.Header.Get("Destination")
dst, err := url.QueryUnescape(dst) dst, err := url.QueryUnescape(dst)
if err != nil { if err != nil {