package server import ( "fmt" "net" "net/http" "os" "strings" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "github.com/urfave/cli/v2" "pages-server/config" "pages-server/server/cache" "pages-server/server/gitea" "pages-server/server/handler" ) // Serve sets up and starts the web server. func Serve(ctx *cli.Context) error { // initialize logger with Trace, overridden later with actual level log.Logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).With().Timestamp().Logger().Level(zerolog.TraceLevel) cfg, err := config.ReadConfig(ctx) if err != nil { log.Error().Err(err).Msg("could not read config") } config.MergeConfig(ctx, cfg) // Initialize the logger. logLevel, err := zerolog.ParseLevel(cfg.LogLevel) if err != nil { return err } log.Logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).With().Timestamp().Logger().Level(logLevel) listeningHTTPAddress := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port) if cfg.Server.RawDomain != "" { cfg.Server.AllowedCorsDomains = append(cfg.Server.AllowedCorsDomains, cfg.Server.RawDomain) } // Make sure MainDomain has a leading dot if !strings.HasPrefix(cfg.Server.MainDomain, ".") { // TODO make this better cfg.Server.MainDomain = "." + cfg.Server.MainDomain } if len(cfg.Server.PagesBranches) == 0 { return fmt.Errorf("no default branches set (PAGES_BRANCHES)") } // canonicalDomainCache stores canonical domains canonicalDomainCache := cache.NewInMemoryCache() // redirectsCache stores redirects in _redirects files redirectsCache := cache.NewInMemoryCache() // clientResponseCache stores responses from the Gitea server clientResponseCache := cache.NewInMemoryCache() giteaClient, err := gitea.NewClient(cfg.Forge, clientResponseCache) if err != nil { return fmt.Errorf("could not create new gitea client: %v", err) } // Create listener log.Info().Msgf("Create TCP listener on %s", listeningHTTPAddress) listener, err := net.Listen("tcp", listeningHTTPAddress) if err != nil { return fmt.Errorf("couldn't create listener: %v", err) } // // Create listener for http and start listening // go func() { // log.Info().Msgf("Start HTTP server listening on %s", listeningHTTPAddress) // err := http.ListenAndServe(listeningHTTPAddress, nil) // if err != nil { // log.Error().Err(err).Msg("Couldn't start HTTP server") // } // }() if ctx.IsSet("enable-profiling") { StartProfilingServer(ctx.String("profiling-address")) } // Create handler based on settings httpHandler := handler.Handler(cfg.Server, giteaClient, canonicalDomainCache, redirectsCache) // Start the listener log.Info().Msgf("Start server using TCP listener on %s", listener.Addr()) return http.Serve(listener, httpHandler) }