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