-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.go
More file actions
102 lines (89 loc) · 2.59 KB
/
main.go
File metadata and controls
102 lines (89 loc) · 2.59 KB
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
// httpserver.go
package main
import (
"encoding/json"
"flag"
"log"
"net/http"
"net/http/httputil"
"net/url"
"os"
"strconv"
"strings"
)
type Redirection struct {
Path string
URL string
}
type Router struct {
Host string
Port int
Redirections []Redirection
}
const DefaultPort = 8888
const DefaultHost = "0.0.0.0"
var logFlag = flag.String("log", "", "Define log file")
var routerFilePath = flag.String("router", "router.json", "Define router file")
var sslKeyFile = flag.String("sslKey", "", "Path to key file")
var sslCertFile = flag.String("sslCert", "", "Path to certificate file")
var logger *log.Logger
func Log(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
logger.Printf("%s %s %s%s", r.RemoteAddr, r.Method, r.Host, r.URL)
handler.ServeHTTP(w, r)
})
}
func main() {
flag.Parse()
if *logFlag == "" {
// use default logger
logger = log.New(os.Stderr, "", log.LstdFlags)
log.Println("Log to stderr")
} else {
logFile, err := os.Create(*logFlag)
if err != nil {
log.Println(err)
return
}
defer logFile.Close()
log.Printf("Log to %s", *logFlag)
logger = log.New(logFile, "", log.LstdFlags)
}
var router Router
router.Port = DefaultPort
router.Host = DefaultHost
routerFile, err := os.Open(*routerFilePath)
if err != nil {
log.Println(err)
router.Redirections = []Redirection{{Path: "/", URL: "."}}
} else {
json.NewDecoder(routerFile).Decode(&router)
routerFile.Close()
}
routerStr, _ := json.MarshalIndent(router, "", " ")
logger.Printf("Router: %s", routerStr)
for _, redirection := range router.Redirections {
relativePath := redirection.Path
i := strings.Index(redirection.Path, "/")
if i != -1 {
relativePath = redirection.Path[i:]
}
if strings.HasPrefix(redirection.URL, "http") {
redirectUrl, err := url.Parse(redirection.URL)
if err != nil {
log.Println(err)
return
}
http.Handle(redirection.Path, http.StripPrefix(relativePath, Log(httputil.NewSingleHostReverseProxy(redirectUrl))))
} else {
http.Handle(redirection.Path, http.StripPrefix(relativePath, http.FileServer(http.Dir(redirection.URL))))
}
}
if *sslKeyFile != "" && *sslCertFile != "" {
logger.Printf("Listen on port https://%s:%d", router.Host, router.Port)
panic(http.ListenAndServeTLS(router.Host+":"+strconv.Itoa(router.Port), *sslCertFile, *sslKeyFile, Log(http.DefaultServeMux)))
} else {
logger.Printf("Listen on port http://%s:%d", router.Host, router.Port)
panic(http.ListenAndServe(router.Host+":"+strconv.Itoa(router.Port), Log(http.DefaultServeMux)))
}
}