Files
fes/modules/server/server.go
2026-02-24 15:59:26 -05:00

78 lines
1.3 KiB
Go

package server
import (
"fes/modules/config"
"fes/modules/gemini"
"fes/modules/ui"
"fmt"
"net/http"
"os"
"path/filepath"
"sync"
)
type Protocols int
const (
HTTP Protocols = iota
GEMINI
)
var Routes map[string]string
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
}
}