-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
105 lines (88 loc) · 2.65 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main
import (
"flag"
"fmt"
"log"
"net"
"github.com/valyala/fasthttp"
)
// Global variables
var pathMap *map[string]fileModel = nil
var origins string = ""
// Main entry
func main() {
// Initialize required parameters
domain := "localhost"
port := "8080"
portTLS := ""
certFile := ""
keyFile := ""
// Get parameters from flags
flag.StringVar(&domain, "domain", domain, helpArgs["domain"])
flag.StringVar(&port, "port", port, helpArgs["port"])
flag.StringVar(&origins, "origins", origins, helpArgs["origins"])
flag.StringVar(&portTLS, "port-tls", portTLS, helpArgs["port-tls"])
flag.StringVar(&certFile, "cert", certFile, helpArgs["cert"])
flag.StringVar(&keyFile, "key", keyFile, helpArgs["key"])
flag.Parse()
// If user doesn't put required arguments, then show help info
if flag.NArg() == 0 {
help()
return
}
// Public root directory
dir := flag.Args()[0]
// If using TLS, check for certificate and secret key availability
if len(portTLS) > 0 && len(keyFile) == 0 {
fmt.Println("You forgot \"--key=...\" flag!")
return
}
if len(portTLS) > 0 && len(certFile) == 0 {
fmt.Println("You forgot \"--cert=...\" flag!")
return
}
// Load all files at public directory to RAM
load(dir)
// Check if currently working on local or production environtment
domainAsIP, _ := fasthttp.ParseIPv4(net.IP{}, []byte(domain))
isLocal := (domain == "localhost") || (domainAsIP != nil)
// Pre-process origins
if isLocal {
if len(portTLS) > 0 {
origins = domain + ":" + portTLS + "," + origins
} else {
origins = domain + ":" + port + "," + origins
}
} else {
origins = domain + "," + origins
}
fmt.Printf("Kuda is listening at %s port...\n", port)
// Configure server connection and only allow GET method
server := fasthttp.Server{
Handler: handler,
ErrorHandler: errorHandler,
GetOnly: true,
DisablePreParseMultipartForm: true,
DisableHeaderNamesNormalizing: true,
}
// Remember, emptied port-tls means disabled TLS
var err error = nil
if len(portTLS) > 0 {
fmt.Printf("Kuda also securely listening at %s port...\n", portTLS)
// Listen for incoming HTTP request and redirect them to HTTPS
go fasthttp.ListenAndServe(":"+port, func(ctx *fasthttp.RequestCtx) {
path := string(ctx.URI().Path())
if isLocal {
ctx.Redirect("https://"+domain+":"+portTLS+"/"+path, 302)
} else {
ctx.Redirect("https://"+domain+"/"+path, 302)
}
})
// Listen for incoming HTTPS request:
err = server.ListenAndServeTLS(":"+portTLS, certFile, keyFile)
} else {
// Listen for incoming HTTP request:
err = server.ListenAndServe(":" + port)
}
log.Fatalln(err)
}