-
Notifications
You must be signed in to change notification settings - Fork 0
/
servers.go
126 lines (93 loc) · 3.38 KB
/
servers.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
package servers
import (
"crypto/tls"
"net"
"net/http"
"github.com/aaronriekenberg/go-httpd/config"
"github.com/aaronriekenberg/go-httpd/handlers"
"github.com/aaronriekenberg/go-httpd/logging"
"github.com/aaronriekenberg/go-httpd/requestlogging"
)
var logger = logging.GetLogger()
type serverRunFunc func(handler http.Handler)
var networkAndListenAddressToServerRunFunc = map[config.NetworkAndListenAddress]serverRunFunc{}
func createServer(
serverConfig config.Server,
networkAndListenAddress config.NetworkAndListenAddress,
) {
if _, exists := networkAndListenAddressToServerRunFunc[networkAndListenAddress]; exists {
logger.Fatalf("duplicate networkAndListenAddress %+v", networkAndListenAddress)
}
netListener, err := net.Listen(networkAndListenAddress.Network, networkAndListenAddress.ListenAddress)
if err != nil {
logger.Fatalf("net.Listen %+v: %v", networkAndListenAddress, err)
}
httpServer := &http.Server{
Addr: networkAndListenAddress.ListenAddress,
}
serverConfig.Timeouts.ApplyToHTTPServer(httpServer)
usingTLS := serverConfig.TLSInfo != nil
if usingTLS {
cert, err := tls.LoadX509KeyPair(serverConfig.TLSInfo.CertFile, serverConfig.TLSInfo.KeyFile)
if err != nil {
logger.Fatalf("Can't load certificates for server %v: %v", serverConfig.ServerID, err)
}
httpServer.TLSConfig = &tls.Config{
Certificates: []tls.Certificate{cert},
}
}
networkAndListenAddressToServerRunFunc[networkAndListenAddress] = func(handler http.Handler) {
httpServer.Handler = handler
if usingTLS {
logger.Printf("before httpServer.ServeTLS serverID = %q networkAndListenAddress = %+v", serverConfig.ServerID, networkAndListenAddress)
err := httpServer.ServeTLS(netListener, "", "")
logger.Fatalf("httpServer.ServeTLS err = %v serverID = %q networkAndListenAddress = %+v", err, serverConfig.ServerID, networkAndListenAddress)
} else {
logger.Printf("before httpServer.Serve serverID = %q networkAndListenAddress = %+v", serverConfig.ServerID, networkAndListenAddress)
err := httpServer.Serve(netListener)
logger.Fatalf("httpServer.Serve err = %v serverID = %q networkAndListenAddress = %+v", err, serverConfig.ServerID, networkAndListenAddress)
}
}
}
func CreateServers(
servers []config.Server,
) {
logger.Printf("begin CreateServers")
for _, serverConfig := range servers {
for _, networkAndListenAddress := range serverConfig.NetworkAndListenAddressList {
createServer(serverConfig, networkAndListenAddress)
}
}
logger.Printf("end CreateServers")
}
func StartServers(
servers []config.Server,
requestLogger requestlogging.RequestLogger,
) {
logger.Printf("begin StartServers")
for _, serverConfig := range servers {
logger.Printf("StartServers serverID %q", serverConfig.ServerID)
handler := handlers.NewServerLocationsHandler(
serverConfig.Locations,
serverConfig.ResponseHeaders,
)
handler = requestLogger.WrapHttpHandler(handler)
for _, networkAndListenAddress := range serverConfig.NetworkAndListenAddressList {
go runServer(
networkAndListenAddress,
handler,
)
}
}
logger.Printf("end StartServers")
}
func runServer(
networkAndListenAddress config.NetworkAndListenAddress,
handler http.Handler,
) {
runFunc, ok := networkAndListenAddressToServerRunFunc[networkAndListenAddress]
if !ok {
logger.Fatalf("unable to find runFunc networkAndListenAddress = %+v", networkAndListenAddress)
}
runFunc(handler)
}