package main import ( "bufio" "log/slog" "net" "time" "github.com/pkg/profile" "tilok.dev/go-http-server/config" rh "tilok.dev/go-http-server/response_helper" ) func main() { conf := config.GetConfig() if conf.Profile { defer profile.Start().Stop() } listener, err := net.Listen("tcp", conf.NetInterface) if err != nil { slog.Error("Could not create listener", "err", err.Error()) } defer listener.Close() for { conn, err := listener.Accept() if err != nil { slog.Error("Could not accept connection", "err", err.Error()) continue } go handleConnection(conn) } } func handleConnection(conn net.Conn) { startTime := time.Now() defer conn.Close() durr, err := time.ParseDuration("5m") if err != nil { slog.Error("Could not parse duration", "err", err.Error()) return } plus5min := startTime.Add(durr) conn.SetDeadline(plus5min) reader := bufio.NewReader(conn) headers := readHeaders(reader) if headers == nil { rh.RespondWithStatusCode(400, conn) return } slog.Info("Received request", "method", headers.Method, "uri", headers.Uri, "proto", headers.Proto, "client", conn.RemoteAddr().String()) conn.SetDeadline(time.Now().Add(durr)) HandleHTTPRequest(*headers, conn) if headers.KV["Connection"] == "keep-alive" { handleConnection(conn) } }