Files
computer-network/server/handler.go
T

63 lines
1.3 KiB
Go
Raw Normal View History

2026-03-30 22:05:57 +08:00
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)
}