66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
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)
|
|
}
|
|
}
|