This repository has been archived by the owner on Sep 14, 2022. It is now read-only.
/
main.go
134 lines (116 loc) · 4.11 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
// Command qvain-backend is the backend server for the Qvain API.
package main
import (
"flag"
"fmt"
"net/http"
"os"
"time"
"github.com/CSCfi/qvain-api/internal/version"
"github.com/CSCfi/qvain-api/pkg/env" //"github.com/CSCfi/qvain-api/internal/jwt"
)
const (
// service name, used for instance in logs
ServiceName = "qvain"
// http server setup
HttpProxyPort = "8080"
// timeouts
HttpReadTimeout = 10 * time.Second
HttpWriteTimeout = 25 * time.Second
HttpIdleTimeout = 120 * time.Second
// additional info message when Go web server returns
strHttpServerPanic = "http server crashed"
)
// startHttpsRedirector spawns a background HTTP server that redirects to https://.
// NOTE: This function returns immediately.
func startHttpsRedirector(config *Config) {
logger := config.NewLogger("main")
srv := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Connection", "close")
url := "https://" + r.Host + r.URL.String()
http.Redirect(w, r, url, http.StatusMovedPermanently)
}),
ReadTimeout: HttpReadTimeout,
WriteTimeout: HttpWriteTimeout,
ErrorLog: adaptToStdlibLogger(config.NewLogger("go.http")),
}
srv.SetKeepAlivesEnabled(false)
logger.Info().Msg("starting https redirect server")
go func() { logger.Fatal().Err(srv.ListenAndServe()).Msg(strHttpServerPanic) }()
}
// Defined command line flags (some of which take their defaults from the environment).
var (
appDebug = flag.Bool("d", env.GetBool("APP_DEBUG"), "log debug output (env APP_DEBUG)")
appDevMode = flag.Bool("dev", env.GetBool("APP_DEV_MODE"), "dev mode: debug, http-only, CORS:all (env APP_DEV_MODE)")
disableLogging = flag.Bool("q", false, "quiet: disable all logging")
disableHttpLog = flag.Bool("nrl", false, "disable http request logging")
forceHttpOnly = flag.Bool("http", env.GetBool("APP_FORCE_HTTP_SCHEME"), "use http for generated links (env APP_FORCE_HTTP_SCHEME)")
appHttpPort = flag.String("port", env.GetDefault("APP_HTTP_PORT", HttpProxyPort), "port to run web server on (env APP_HTTP_PORT)")
)
func main() {
flag.Parse()
// configure application from environment; exit if there was an error
config, err := ConfigFromEnv()
if err != nil {
fmt.Fprintln(os.Stderr, "fatal:", err)
os.Exit(1)
}
// logger just for this main() function
logger := config.NewLogger("main")
setStdlibLogger(config.NewLogger("log"))
// initialise database pool
err = config.initDB(config.NewLogger("psql"))
if err != nil {
logger.Error().Err(err).Msg("daba baad")
}
// initialise session manager
err = config.initSessions()
if err != nil {
logger.Error().Err(err).Msg("session manager failed")
}
// initialise secure messaging service
err = config.initMessenger()
if err != nil {
logger.Error().Err(err).Msg("secure messaging service initialisation failed")
}
// default server, without TLSConfig
srv := &http.Server{
Handler: Root(config),
ReadTimeout: HttpReadTimeout,
ReadHeaderTimeout: HttpReadTimeout,
WriteTimeout: HttpWriteTimeout,
IdleTimeout: HttpIdleTimeout,
ErrorLog: adaptToStdlibLogger(config.NewLogger("go.http")),
}
// if standalone, run on 443 and start redirecting port 80; else run on 8080 or whatever is configured above
var listen string
if config.Standalone {
if can, err := canNetBindService(); err == nil {
if !can {
// print to STDERR, because the server will crash
fmt.Fprintln(os.Stderr, "warning: need cap_net_bind_service capability to run stand-alone")
}
} else {
logger.Error().Err(err).Msg("capability check returned error")
}
srv.TLSConfig = tlsIntermediateConfig
listen = "*"
config.Port = "https"
startHttpsRedirector(config)
} else {
listen = "localhost"
srv.Addr = listen + ":" + config.Port
}
logger.Info().
Str("hash", version.CommitHash).
Str("tag", version.CommitTag).
Str("port", config.Port).
Str("host", config.Hostname).
Str("iface", listen).
Bool("standalone", config.Standalone).
Bool("debug", config.Debug).
Bool("dev", config.DevMode).
Msg("starting http server")
logger.Fatal().Err(srv.ListenAndServe()).Msg(strHttpServerPanic)
}