/
main.go
164 lines (147 loc) · 4 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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
package main
//####################################//
// Packages importing
//====================================//
// Global packages
import (
"flag"
"fmt"
"log"
// File handling
"os"
// HTTP Server, FastCGI
"net"
"net/http"
"net/http/fcgi"
// Router
"github.com/gorilla/mux"
)
//====================================//
// Local packages
import ()
//####################################//
// Global variables
//====================================//
// Engine variables
var c *ServerConf // Parsed config structure
var Stddebug *log.Logger
// Flags
// FIXME add flags
var flagDebug bool
var flagQuiet bool
//####################################//
// Code
//====================================//
// Init code
func init() {
// FIXME init flags
const (
flagDef_Debug = false
flagDescDebug = " -debug enable debug"
flagDef_Quiet = false
flagDescQuiet = "-q -quiet suppress output"
)
flag.BoolVar(&flagDebug, "debug", false, flagDescDebug)
flag.BoolVar(&flagQuiet, "q", false, flagDescQuiet)
flag.BoolVar(&flagQuiet, "quiet", false, flagDescQuiet)
//----------------------------------//
// Help
// FIXME update help
flag.Usage = func() {
usage := `Usage: %s [options]
Options:
` + flag.Lookup("q").Usage + `
` + flag.Lookup("debug").Usage + `
No more options for now.
MIT, BSD or something. There is no help.
`
fmt.Fprintf(os.Stderr, usage, os.Args[0])
}
//----------------------------------//
}
// Main code
func main() {
flag.Parse()
engineInit()
c := parseConfig()
debug(c)
configure(c)
router := mux.NewRouter()
debug("c.Config.Path.BasePath =", c.Config.Path.BasePath)
// FIXME add routes
// Serve static content
router.
//Host(c.Config.Path.Domain.Static).
PathPrefix("/static/").
Handler(http.FileServer(http.Dir("htdocs/")))
router.
//Host(c.Config.Path.Domain.Images).
PathPrefix("/src/").
Handler(http.FileServer(http.Dir("htdocs/img/")))
router.
//Host(c.Config.Path.Domain.Images).
PathPrefix("/thumb/").
Handler(http.FileServer(http.Dir("htdocs/img/")))
// Main subrouter
r := router.
//FIXME Host("{subdomain:[a-z]+}."+c.Config.Path.Domain.Main).
//FIXME Host(c.Config.Path.Domain.Main).
PathPrefix(c.Config.Path.BasePath + "/").
Subrouter()
//----------------------------------//
// Slash redirect
r.HandleFunc("/{request}", slashHandler)
//----------------------------------//
// Handle dynamic pages
// Handle panel
panel := r.PathPrefix("/" + c.Config.Path.Panel).Subrouter()
panel.HandleFunc("/", panelHandler)
panel.HandleFunc("/{page}", panelHandler)
// Handle custom webpages
// FIXME
r.HandleFunc("/", helloWorldHandler)
r.HandleFunc("/hello/", helloWorldHandler)
r.HandleFunc("/hello/{subject}", helloWorldHandler)
// Handle JSON API
// FIXME
j := r.PathPrefix("/json").Subrouter()
j.HandleFunc("/example.json", exampleHandlerJSON)
//----------------------------------//
// Main HTTP handler
http.Handle("/", router)
//----------------------------------//
// Start webserver
if !c.Config.Server.FCGI && c.Config.Server.Type == "unix" {
err := "\nI'm not sure using unix socket with http server is good idea." +
"\nConsider changing type to 'tcp' or enabling 'fcgi' in config."
log.Fatalln("Error: main():", err)
}
var listener net.Listener
var err error
switch c.Config.Server.Type {
case "unix":
listener, err = net.Listen(c.Config.Server.Type, c.Config.Server.Socket)
if err != nil {
log.Fatalln("Error: main():", err)
}
case "tcp", "tcp4", "tcp6":
listener, err = net.Listen(c.Config.Server.Type,
net.JoinHostPort(c.Config.Server.Addr, c.Config.Server.Port))
if err != nil {
log.Fatalln("Error: main():", err)
}
default:
log.Fatalln("Error: main(): unsupported type", c.Config.Server.Type)
}
if c.Config.Server.FCGI {
log.Println("Info: Starting FastCGI")
if err := fcgi.Serve(listener, nil); err != nil {
log.Fatalln("Error: main():", err)
}
} else {
log.Println("Info: Starting HTTP Server")
if err := http.Serve(listener, nil); err != nil {
log.Fatalln("Error: main():", err)
}
}
}