package server import ( "fes/modules/config" "fes/modules/gemini" "fes/modules/ui" "fmt" "net/http" "os" "path/filepath" "sync" ) var Routes map[string]string var Sets DeclarativeSets func Start(dir string) { if err := os.Chdir(dir); err != nil { ui.Error(fmt.Sprintf("failed to change directory to %s", dir), err) } root := filepath.Clean(dir) if root == "." { if res, err := filepath.Abs(root); err == nil { root = filepath.Base(res) } else { ui.Error("failed to get absolute path", err) } } ui.Log("running root=%s, port=%d.", root, *config.Port) ui.LogVerbose("start loading directories") Routes = loadDirs() http.HandleFunc("/", httpHandler) gemini.HandleFunc("/", geminiHandler) var wg sync.WaitGroup errs := make(chan error, 2) wg.Add(2) go func() { defer wg.Done() errs <- http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", *config.Port), nil) }() go func() { defer wg.Done() errs <- gemini.ListenAndServeTLS(fmt.Sprintf("0.0.0.0:%d", *config.Port-1035), "cert.pem", "key.pem", nil) }() ui.Log("Server initialized") wg.Wait() close(errs) var collected []error for err := range errs { if err != nil { collected = append(collected, err) } } if len(collected) > 0 { fmt.Printf("errors: %v\n", collected) return } }