diff --git a/simplehttpserver.go b/simplehttpserver.go index 1aa7c54..26ca4bc 100644 --- a/simplehttpserver.go +++ b/simplehttpserver.go @@ -4,9 +4,11 @@ import ( "bytes" "flag" "fmt" + "io/ioutil" "log" "net/http" "net/http/httputil" + "path" ) type options struct { @@ -16,6 +18,7 @@ type options struct { Key string HTTPS bool Verbose bool + Upload bool } var opts options @@ -23,10 +26,12 @@ var opts options func main() { flag.StringVar(&opts.ListenAddress, "listen", "0.0.0.0:8000", "Address:Port") flag.StringVar(&opts.Folder, "path", ".", "Folder") + flag.BoolVar(&opts.Upload, "upload", false, "Enable upload via PUT") flag.BoolVar(&opts.HTTPS, "https", false, "HTTPS") flag.StringVar(&opts.Certificate, "cert", "", "Certificate") flag.StringVar(&opts.Key, "key", "", "Key") flag.BoolVar(&opts.Verbose, "v", false, "Verbose") + flag.Parse() if flag.NArg() > 0 && opts.Folder == "." { @@ -34,6 +39,9 @@ func main() { } log.Printf("Serving %s on http://%s/...", opts.Folder, opts.ListenAddress) + if opts.Upload { + log.Println("Upload enabled") + } if opts.HTTPS { if opts.Certificate == "" || opts.Key == "" { log.Fatal("Certificate or Key file not specified") @@ -50,6 +58,18 @@ func loglayer(handler http.Handler) http.Handler { lrw := newLoggingResponseWriter(w) handler.ServeHTTP(lrw, r) + // Handles file write if enabled + if opts.Upload && r.Method == http.MethodPut { + data, err := ioutil.ReadAll(r.Body) + if err != nil { + log.Println(err) + } + err = handleUpload(path.Base(r.URL.Path), data) + if err != nil { + log.Println(err) + } + } + if opts.Verbose { headers := new(bytes.Buffer) lrw.Header().Write(headers) //nolint @@ -83,3 +103,7 @@ func (lrw *loggingResponseWriter) WriteHeader(code int) { lrw.statusCode = code lrw.ResponseWriter.WriteHeader(code) } + +func handleUpload(file string, data []byte) error { + return ioutil.WriteFile(file, data, 0655) +}