49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package server
|
|
|
|
import (
|
|
"net"
|
|
"serveg/internal/http"
|
|
"serveg/internal/log"
|
|
"strconv"
|
|
)
|
|
|
|
type TcpConnection struct {
|
|
srv *Server
|
|
socket *net.TCPConn
|
|
log log.LoggerContext
|
|
http *http.Connection
|
|
}
|
|
|
|
func NewTcpConnection(srv *Server, socket *net.TCPConn, n int64) *TcpConnection {
|
|
conn := &TcpConnection{
|
|
srv: srv,
|
|
socket: socket,
|
|
log: log.LoggerContext{Name: "conn-" + strconv.FormatInt(n, 10)},
|
|
}
|
|
conn.http = http.NewConnection(socket, &conn.log, conn.handleHttpRequest)
|
|
return conn
|
|
}
|
|
|
|
func (conn *TcpConnection) Start() {
|
|
conn.http.Start()
|
|
}
|
|
|
|
func (conn *TcpConnection) handleHttpRequest(req *http.Request) (res *http.Response) {
|
|
switch req.Method {
|
|
case "GET", "HEAD":
|
|
res = conn.serveFileOrDir(req)
|
|
case "PUT", "OPTIONS":
|
|
res = conn.handleUpload(req)
|
|
default:
|
|
res = conn.createErrorResponse(req, false, http.StatusMethodNotAllowed, req.Method)
|
|
res.Headers["allow"] = "GET, HEAD, PUT, OPTIONS"
|
|
}
|
|
return
|
|
}
|
|
|
|
func (conn *TcpConnection) createErrorResponse(
|
|
req *http.Request, wantsClose bool, status http.StatusCode, msg string,
|
|
) *http.Response {
|
|
return conn.http.CreateErrorResponse(req, wantsClose, http.NewHttpError(status, msg))
|
|
}
|