Skip to content

Commit 04ff1b9

Browse files
authored
Merge pull request #6 from projectdiscovery/feature-file-upload
adding file upload support
2 parents 655ee57 + f8d7740 commit 04ff1b9

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

simplehttpserver.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1214
type options struct {
@@ -16,24 +18,30 @@ type options struct {
1618
Key string
1719
HTTPS bool
1820
Verbose bool
21+
Upload bool
1922
}
2023

2124
var opts options
2225

2326
func main() {
2427
flag.StringVar(&opts.ListenAddress, "listen", "0.0.0.0:8000", "Address:Port")
2528
flag.StringVar(&opts.Folder, "path", ".", "Folder")
29+
flag.BoolVar(&opts.Upload, "upload", false, "Enable upload via PUT")
2630
flag.BoolVar(&opts.HTTPS, "https", false, "HTTPS")
2731
flag.StringVar(&opts.Certificate, "cert", "", "Certificate")
2832
flag.StringVar(&opts.Key, "key", "", "Key")
2933
flag.BoolVar(&opts.Verbose, "v", false, "Verbose")
34+
3035
flag.Parse()
3136

3237
if flag.NArg() > 0 && opts.Folder == "." {
3338
opts.Folder = flag.Args()[0]
3439
}
3540

3641
log.Printf("Serving %s on http://%s/...", opts.Folder, opts.ListenAddress)
42+
if opts.Upload {
43+
log.Println("Upload enabled")
44+
}
3745
if opts.HTTPS {
3846
if opts.Certificate == "" || opts.Key == "" {
3947
log.Fatal("Certificate or Key file not specified")
@@ -50,6 +58,18 @@ func loglayer(handler http.Handler) http.Handler {
5058
lrw := newLoggingResponseWriter(w)
5159
handler.ServeHTTP(lrw, r)
5260

61+
// Handles file write if enabled
62+
if opts.Upload && r.Method == http.MethodPut {
63+
data, err := ioutil.ReadAll(r.Body)
64+
if err != nil {
65+
log.Println(err)
66+
}
67+
err = handleUpload(path.Base(r.URL.Path), data)
68+
if err != nil {
69+
log.Println(err)
70+
}
71+
}
72+
5373
if opts.Verbose {
5474
headers := new(bytes.Buffer)
5575
lrw.Header().Write(headers) //nolint
@@ -83,3 +103,7 @@ func (lrw *loggingResponseWriter) WriteHeader(code int) {
83103
lrw.statusCode = code
84104
lrw.ResponseWriter.WriteHeader(code)
85105
}
106+
107+
func handleUpload(file string, data []byte) error {
108+
return ioutil.WriteFile(file, data, 0655)
109+
}

0 commit comments

Comments
 (0)