diff options
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 28 |
1 files changed, 24 insertions, 4 deletions
@@ -22,6 +22,7 @@ var tmplFS embed.FS type BoxHandler struct { dataPath string token string + deleteEnabled bool } func serve(w http.ResponseWriter, token string, views ...string) { @@ -44,13 +45,29 @@ func (handler BoxHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { f, err := os.Open(filepath.Join(handler.dataPath, resourceId)) if err != nil { log.Println(err) - fmt.Fprint(w, err.Error()) w.WriteHeader(http.StatusBadRequest) + fmt.Fprint(w, err.Error()) return } io.Copy(w, f) } return + case http.MethodDelete: + if !handler.deleteEnabled { + w.WriteHeader(http.StatusForbidden) + return + } + resourceId := path.Base(r.URL.Path) + filename := filepath.Join(handler.dataPath, resourceId) + log.Printf("Deleting %s...", filename) + err := os.Remove(filename) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusBadRequest) + fmt.Fprint(w, err.Error()) + return + } + w.WriteHeader(http.StatusNoContent) case http.MethodPost: token := r.Header.Get("X-Upload-Token") if token != handler.token { @@ -66,18 +83,19 @@ func (handler BoxHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } filename := filepath.Join(handler.dataPath, u.String()) - log.Printf("boxing %s\n", filename) + log.Printf("Boxing %s...\n", filename) f, err := os.Create(filename) if err != nil { log.Println(err) - fmt.Fprint(w, err.Error()) w.WriteHeader(http.StatusInternalServerError) + fmt.Fprint(w, err.Error()) return } defer r.Body.Close() io.Copy(f, r.Body) w.Header().Add("X-Resource-ID", filepath.Base(filename)) - log.Printf("boxed %s\n", filename) + + log.Printf("Boxed %s\n", filename) default: w.WriteHeader(http.StatusMethodNotAllowed) } @@ -87,10 +105,12 @@ func main() { host := flag.String("n", "", "The hostname to listen on") port := flag.Int("p", 8080, "The port to listen on") token := flag.String("t", "", "The token to use to protect uploads") + deleteEnabled := flag.Bool("d", false, "Enable deleting resources") flag.Parse() boxHandler := BoxHandler { "data", *token, + *deleteEnabled, } err := os.MkdirAll(boxHandler.dataPath, 0750) if err != nil { |
