@@ -4,9 +4,11 @@ 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 {
@@ -15,18 +17,27 @@ type options struct {
1517 Username string
1618 Password string
1719 Realm string
20+ Certificate string
21+ Key string
22+ HTTPS bool
1823 Verbose bool
24+ Upload bool
1925}
2026
2127var opts options
2228
2329func main () {
2430 flag .StringVar (& opts .ListenAddress , "listen" , "0.0.0.0:8000" , "Address:Port" )
2531 flag .StringVar (& opts .Folder , "path" , "." , "Folder" )
32+ flag .BoolVar (& opts .Upload , "upload" , false , "Enable upload via PUT" )
33+ flag .BoolVar (& opts .HTTPS , "https" , false , "HTTPS" )
34+ flag .StringVar (& opts .Certificate , "cert" , "" , "Certificate" )
35+ flag .StringVar (& opts .Key , "key" , "" , "Key" )
2636 flag .BoolVar (& opts .Verbose , "v" , false , "Verbose" )
2737 flag .StringVar (& opts .Username , "username" , "" , "Basic auth username" )
2838 flag .StringVar (& opts .Password , "password" , "" , "Basic auth password" )
2939 flag .StringVar (& opts .Realm , "realm" , "Please enter username and password" , "Realm" )
40+
3041 flag .Parse ()
3142
3243 if flag .NArg () > 0 && opts .Folder == "." {
@@ -39,7 +50,17 @@ func main() {
3950 layers = loglayer (basicauthlayer (http .FileServer (http .Dir (opts .Folder ))))
4051 }
4152
42- fmt .Println (http .ListenAndServe (opts .ListenAddress , layers ))
53+ if opts .Upload {
54+ log .Println ("Upload enabled" )
55+ }
56+ if opts .HTTPS {
57+ if opts .Certificate == "" || opts .Key == "" {
58+ log .Fatal ("Certificate or Key file not specified" )
59+ }
60+ fmt .Println (http .ListenAndServeTLS (opts .ListenAddress , opts .Certificate , opts .Key , layers ))
61+ } else {
62+ fmt .Println (http .ListenAndServe (opts .ListenAddress , layers ))
63+ }
4364}
4465
4566func loglayer (handler http.Handler ) http.Handler {
@@ -48,6 +69,18 @@ func loglayer(handler http.Handler) http.Handler {
4869 lrw := newLoggingResponseWriter (w )
4970 handler .ServeHTTP (lrw , r )
5071
72+ // Handles file write if enabled
73+ if opts .Upload && r .Method == http .MethodPut {
74+ data , err := ioutil .ReadAll (r .Body )
75+ if err != nil {
76+ log .Println (err )
77+ }
78+ err = handleUpload (path .Base (r .URL .Path ), data )
79+ if err != nil {
80+ log .Println (err )
81+ }
82+ }
83+
5184 if opts .Verbose {
5285 headers := new (bytes.Buffer )
5386 lrw .Header ().Write (headers ) //nolint
@@ -94,3 +127,7 @@ func (lrw *loggingResponseWriter) WriteHeader(code int) {
94127 lrw .statusCode = code
95128 lrw .ResponseWriter .WriteHeader (code )
96129}
130+
131+ func handleUpload (file string , data []byte ) error {
132+ return ioutil .WriteFile (file , data , 0655 )
133+ }
0 commit comments