@@ -4,30 +4,38 @@ import (
44 "bytes"
55 "flag"
66 "fmt"
7+ "io/ioutil"
78 "log"
89 "net/http"
910 "net/http/httputil"
11+ "path"
1012)
1113
1214type options struct {
1315 ListenAddress string
1416 Folder string
1517 Verbose bool
18+ Upload bool
1619}
1720
1821var opts options
1922
2023func main () {
2124 flag .StringVar (& opts .ListenAddress , "listen" , "0.0.0.0:8000" , "Address:Port" )
2225 flag .StringVar (& opts .Folder , "path" , "." , "Folder" )
26+ flag .BoolVar (& opts .Upload , "upload" , false , "Enable upload via PUT" )
2327 flag .BoolVar (& opts .Verbose , "v" , false , "Verbose" )
28+
2429 flag .Parse ()
2530
2631 if flag .NArg () > 0 && opts .Folder == "." {
2732 opts .Folder = flag .Args ()[0 ]
2833 }
2934
3035 log .Printf ("Serving %s on http://%s/..." , opts .Folder , opts .ListenAddress )
36+ if opts .Upload {
37+ log .Println ("Upload enabled" )
38+ }
3139 fmt .Println (http .ListenAndServe (opts .ListenAddress , loglayer (http .FileServer (http .Dir (opts .Folder )))))
3240}
3341
@@ -37,6 +45,18 @@ func loglayer(handler http.Handler) http.Handler {
3745 lrw := newLoggingResponseWriter (w )
3846 handler .ServeHTTP (lrw , r )
3947
48+ // Handles file write if enabled
49+ if opts .Upload && r .Method == http .MethodPut {
50+ data , err := ioutil .ReadAll (r .Body )
51+ if err != nil {
52+ log .Println (err )
53+ }
54+ err = handleUpload (path .Base (r .URL .Path ), data )
55+ if err != nil {
56+ log .Println (err )
57+ }
58+ }
59+
4060 if opts .Verbose {
4161 headers := new (bytes.Buffer )
4262 lrw .Header ().Write (headers ) //nolint
@@ -70,3 +90,7 @@ func (lrw *loggingResponseWriter) WriteHeader(code int) {
7090 lrw .statusCode = code
7191 lrw .ResponseWriter .WriteHeader (code )
7292}
93+
94+ func handleUpload (file string , data []byte ) error {
95+ return ioutil .WriteFile (file , data , 0655 )
96+ }
0 commit comments