Skip to content

Commit 5b75b48

Browse files
authored
Merge pull request #10 from mayth/https-support
HTTPS support
2 parents be039fa + dba294f commit 5b75b48

File tree

2 files changed

+56
-8
lines changed

2 files changed

+56
-8
lines changed

README.md

+18
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,24 @@ Content-Length: 19
7272
```
7373

7474

75+
# TLS
76+
77+
To enable TLS support, add `-cert` and `-key` options:
78+
79+
```
80+
$ ./simple_upload_server -cert ./cert.pem -key ./key.pem root/
81+
INFO[0000] starting up simple-upload-server
82+
WARN[0000] token generated token=28d93c74c8589ab62b5e
83+
INFO[0000] start listening TLS cert=./cert.pem key=./key.pem port=25443
84+
INFO[0000] start listening ip=0.0.0.0 port=25478 root=root token=28d93c74c8589ab62b5e upload_limit=5242880
85+
...
86+
```
87+
88+
This server listens on `25443/tcp` for TLS connections by default. This can be changed by passing `-tlsport` option.
89+
90+
NOTE: The endpoint using HTTP is still active even if TLS is enabled.
91+
92+
7593
# Security
7694

7795
There is no Basic/Digest authentication. This app implements dead simple authentication: "security token".

simple_upload_server.go

+38-8
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@ var logger *logrus.Logger
1616
func run(args []string) int {
1717
bindAddress := flag.String("ip", "0.0.0.0", "IP address to bind")
1818
listenPort := flag.Int("port", 25478, "port number to listen on")
19+
tlsListenPort := flag.Int("tlsport", 25443, "port number to listen on with TLS")
1920
// 5,242,880 bytes == 5 MiB
2021
maxUploadSize := flag.Int64("upload_limit", 5242880, "max size of uploaded file (byte)")
2122
tokenFlag := flag.String("token", "", "specify the security token (it is automatically generated if empty)")
2223
logLevelFlag := flag.String("loglevel", "info", "logging level")
24+
certFile := flag.String("cert", "", "path to certificate file")
25+
keyFile := flag.String("key", "", "path to key file")
2326
flag.Parse()
2427
serverRoot := flag.Arg(0)
2528
if len(serverRoot) == 0 {
@@ -42,17 +45,44 @@ func run(args []string) int {
4245
token = fmt.Sprintf("%x", b)
4346
logger.WithField("token", token).Warn("token generated")
4447
}
45-
logger.WithFields(logrus.Fields{
46-
"ip": *bindAddress,
47-
"port": *listenPort,
48-
"token": token,
49-
"upload_limit": *maxUploadSize,
50-
"root": serverRoot,
51-
}).Info("start listening")
48+
tlsEnabled := *certFile != "" && *keyFile != ""
5249
server := NewServer(serverRoot, *maxUploadSize, token)
5350
http.Handle("/upload", server)
5451
http.Handle("/files/", server)
55-
http.ListenAndServe(fmt.Sprintf("%s:%d", *bindAddress, *listenPort), nil)
52+
53+
errors := make(chan error)
54+
55+
go func() {
56+
logger.WithFields(logrus.Fields{
57+
"ip": *bindAddress,
58+
"port": *listenPort,
59+
"token": token,
60+
"upload_limit": *maxUploadSize,
61+
"root": serverRoot,
62+
}).Info("start listening")
63+
64+
if err := http.ListenAndServe(fmt.Sprintf("%s:%d", *bindAddress, *listenPort), nil); err != nil {
65+
errors <- err
66+
}
67+
}()
68+
69+
if tlsEnabled {
70+
go func() {
71+
logger.WithFields(logrus.Fields{
72+
"cert": *certFile,
73+
"key": *keyFile,
74+
"port": *tlsListenPort,
75+
}).Info("start listening TLS")
76+
77+
if err := http.ListenAndServeTLS(fmt.Sprintf("%s:%d", *bindAddress, *tlsListenPort), *certFile, *keyFile, nil); err != nil {
78+
errors <- err
79+
}
80+
}()
81+
}
82+
83+
err := <-errors
84+
logger.WithError(err).Info("closing server")
85+
5686
return 0
5787
}
5888

0 commit comments

Comments
 (0)