Browse Source

implemented HTTP DELETE for token/filename , local storage provider only

pull/114/head
Marko Rizvic 6 years ago
parent
commit
b0c32bfcf7
3 changed files with 67 additions and 0 deletions
  1. +41
    -0
      server/handlers.go
  2. +3
    -0
      server/server.go
  3. +23
    -0
      server/storage.go

+ 41
- 0
server/handlers.go View File

@@ -729,6 +729,47 @@ func (s *Server) getHandler(w http.ResponseWriter, r *http.Request) {
}
}

func (s *Server) deleteHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)

token := vars["token"]
filename := vars["filename"]

var metadata Metadata

reader, _, _, err := s.storage.Get(token, fmt.Sprintf("%s.metadata", filename))
if s.storage.IsNotExist(err) {
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
} else if err != nil {
log.Printf("#1 %s", err.Error())
http.Error(w, "Could not delete file.", 500)
return
}

defer reader.Close()

if err := json.NewDecoder(reader).Decode(&metadata); err != nil {
log.Printf("#2 %s", err.Error())
http.Error(w, "Could not delete file.", 500)
return
}
if metadata.Downloads >= metadata.MaxDownloads || time.Now().After(metadata.MaxDate) {
// DELETE FILE AND METADATA
if err := s.storage.Delete(token, filename); err != nil {
log.Printf("#3 %s", err.Error())
http.Error(w, "Could not delete file.", 500)
return
}
} else {
http.Error(w, "MaxDownloads or MaxDays not exceeded yet.", 500)
return
}

return

}

func (s *Server) RedirectHandler(h http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if !s.forceHTTPs {


+ 3
- 0
server/server.go View File

@@ -311,6 +311,9 @@ func (s *Server) Run() {
getHandlerFn = ratelimit.Request(ratelimit.IP).Rate(s.rateLimitRequests, 60*time.Second).LimitBy(memory.New())(http.HandlerFunc(getHandlerFn)).ServeHTTP
}

deleteHandlerFn := s.deleteHandler
r.HandleFunc("/{token}/{filename}", deleteHandlerFn).Methods("DELETE")

r.HandleFunc("/{token}/{filename}", getHandlerFn).Methods("GET")
r.HandleFunc("/get/{token}/{filename}", getHandlerFn).Methods("GET")
r.HandleFunc("/download/{token}/{filename}", getHandlerFn).Methods("GET")


+ 23
- 0
server/storage.go View File

@@ -10,6 +10,7 @@ import (
"path/filepath"
"strconv"
"sync"
"errors"

"github.com/goamz/goamz/s3"
)
@@ -18,6 +19,7 @@ type Storage interface {
Get(token string, filename string) (reader io.ReadCloser, contentType string, contentLength uint64, err error)
Head(token string, filename string) (contentType string, contentLength uint64, err error)
Put(token string, filename string, reader io.Reader, contentType string, contentLength uint64) error
Delete(token string, filename string) error
IsNotExist(err error) bool

Type() string
@@ -103,6 +105,27 @@ func (s *LocalStorage) Put(token string, filename string, reader io.Reader, cont
return nil
}

func (s *LocalStorage) Delete(token string, filename string) error {
var err error

userdatafile := filepath.Join(s.basedir, token, filename)
metadatafile := filepath.Join(s.basedir, token, fmt.Sprintf("%s.metadata", filename))

if err = os.Remove(userdatafile); err != nil {
return err
}

if err = os.Remove(metadatafile); err != nil {
return err
}

return nil
}

func (s *S3Storage) Delete(token string, filename string) error {
return errors.New("Delete function for S3Storage not yet implemented")
}

type S3Storage struct {
Storage
bucket *s3.Bucket


Loading…
Cancel
Save