package server import ( "bufio" "computer-network/logger" "fmt" "net" "time" ) type Handler struct { rootDir string } func NewHandler(rootDir string) *Handler { return &Handler{ rootDir: rootDir, } } func (h *Handler) HandleConnection(conn net.Conn) { defer conn.Close() startTime := time.Now() clientIP := logger.GetClientIP(conn) reader := bufio.NewReader(conn) req, err := ParseRequest(reader) if err != nil { response := BuildErrorResponse(StatusBadRequest, "", h.rootDir) SendResponse(conn, response) duration := time.Since(startTime) logger.Log(clientIP, "-", "-", "-", 400, duration) return } var statusCode int var response *Response if !req.IsGET() { statusCode = 501 response = BuildErrorResponse(StatusNotImplemented, "/501.html", h.rootDir) } else { path := req.GetPath() data, contentType, err := ReadFile(h.rootDir, path) if err != nil { statusCode = 404 response = BuildErrorResponse(StatusNotFound, "/404.html", h.rootDir) } else { statusCode = 200 response = BuildOKResponse(data, contentType) } } err = SendResponse(conn, response) if err != nil { fmt.Printf("Error sending response to %s: %v\n", clientIP, err) } duration := time.Since(startTime) logger.Log(clientIP, req.Method, req.URL, req.HTTPVersion, statusCode, duration) }