diff options
Diffstat (limited to 'internal/router/router.go')
-rw-r--r-- | internal/router/router.go | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/internal/router/router.go b/internal/router/router.go index aef5c32e4..aa588906f 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -26,6 +26,7 @@ import ( "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" + "github.com/spf13/viper" "github.com/superseriousbusiness/gotosocial/internal/config" "github.com/superseriousbusiness/gotosocial/internal/db" "golang.org/x/crypto/acme/autocert" @@ -58,7 +59,6 @@ type Router interface { type router struct { engine *gin.Engine srv *http.Server - config *config.Config certManager *autocert.Manager } @@ -69,10 +69,16 @@ func (r *router) AttachStaticFS(relativePath string, fs http.FileSystem) { // Start starts the router nicely. It will serve two handlers if letsencrypt is enabled, and only the web/API handler if letsencrypt is not enabled. func (r *router) Start() { - if r.config.LetsEncryptConfig.Enabled { + keys := config.Keys + leEnabled := viper.GetBool(keys.LetsEncryptEnabled) + + if leEnabled { + bindAddress := viper.GetString(keys.BindAddress) + lePort := viper.GetInt(keys.LetsEncryptPort) + // serve the http handler on the selected letsencrypt port, for receiving letsencrypt requests and solving their devious riddles go func() { - listen := fmt.Sprintf("%s:%d", r.config.BindAddress, r.config.LetsEncryptConfig.Port) + listen := fmt.Sprintf("%s:%d", bindAddress, lePort) if err := http.ListenAndServe(listen, r.certManager.HTTPHandler(http.HandlerFunc(httpsRedirect))); err != nil && err != http.ErrServerClosed { logrus.Fatalf("listen: %s", err) } @@ -103,7 +109,9 @@ func (r *router) Stop(ctx context.Context) error { // // The given DB is only used in the New function for parsing config values, and is not otherwise // pinned to the router. -func New(ctx context.Context, cfg *config.Config, db db.DB) (Router, error) { +func New(ctx context.Context, db db.DB) (Router, error) { + keys := config.Keys + gin.SetMode(gin.ReleaseMode) // create the actual engine here -- this is the core request routing handler for gts @@ -116,12 +124,13 @@ func New(ctx context.Context, cfg *config.Config, db db.DB) (Router, error) { engine.MaxMultipartMemory = 8 << 20 // set up IP forwarding via x-forward-* headers. - if err := engine.SetTrustedProxies(cfg.TrustedProxies); err != nil { + trustedProxies := viper.GetStringSlice(keys.TrustedProxies) + if err := engine.SetTrustedProxies(trustedProxies); err != nil { return nil, err } // enable cors on the engine - if err := useCors(cfg, engine); err != nil { + if err := useCors(engine); err != nil { return nil, err } @@ -129,17 +138,19 @@ func New(ctx context.Context, cfg *config.Config, db db.DB) (Router, error) { loadTemplateFunctions(engine) // load templates onto the engine - if err := loadTemplates(cfg, engine); err != nil { + if err := loadTemplates(engine); err != nil { return nil, err } // enable session store middleware on the engine - if err := useSession(ctx, cfg, db, engine); err != nil { + if err := useSession(ctx, db, engine); err != nil { return nil, err } // create the http server here, passing the gin engine as handler - listen := fmt.Sprintf("%s:%d", cfg.BindAddress, cfg.Port) + bindAddress := viper.GetString(keys.BindAddress) + port := viper.GetInt(keys.Port) + listen := fmt.Sprintf("%s:%d", bindAddress, port) s := &http.Server{ Addr: listen, Handler: engine, @@ -151,15 +162,19 @@ func New(ctx context.Context, cfg *config.Config, db db.DB) (Router, error) { // We need to spawn the underlying server slightly differently depending on whether lets encrypt is enabled or not. // In either case, the gin engine will still be used for routing requests. + leEnabled := viper.GetBool(keys.LetsEncryptEnabled) var m *autocert.Manager - if cfg.LetsEncryptConfig.Enabled { + if leEnabled { // le IS enabled, so roll up an autocert manager for handling letsencrypt requests + host := viper.GetString(keys.Host) + leCertDir := viper.GetString(keys.LetsEncryptCertDir) + leEmailAddress := viper.GetString(keys.LetsEncryptEmailAddress) m = &autocert.Manager{ Prompt: autocert.AcceptTOS, - HostPolicy: autocert.HostWhitelist(cfg.Host), - Cache: autocert.DirCache(cfg.LetsEncryptConfig.CertDir), - Email: cfg.LetsEncryptConfig.EmailAddress, + HostPolicy: autocert.HostWhitelist(host), + Cache: autocert.DirCache(leCertDir), + Email: leEmailAddress, } s.TLSConfig = m.TLSConfig() } @@ -167,7 +182,6 @@ func New(ctx context.Context, cfg *config.Config, db db.DB) (Router, error) { return &router{ engine: engine, srv: s, - config: cfg, certManager: m, }, nil } |