Initial commit
This commit is contained in:
71
internal/server/server.go
Normal file
71
internal/server/server.go
Normal file
@@ -0,0 +1,71 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
|
||||
"httpfromtcp/internal/response"
|
||||
"httpfromtcp/internal/request"
|
||||
)
|
||||
|
||||
type HandlerError struct{
|
||||
StatusCode response.StatusCode
|
||||
Message string
|
||||
}
|
||||
|
||||
type Handler func(w *response.Writer, req *request.Request)
|
||||
|
||||
type Server struct {
|
||||
Closed bool
|
||||
Handler Handler
|
||||
}
|
||||
|
||||
func runConnection(s *Server, conn io.ReadWriteCloser) {
|
||||
defer conn.Close()
|
||||
|
||||
responseWriter := response.NewWriter(conn)
|
||||
headers := response.GetDefaultHeaders(0)
|
||||
r,err:= request.RequestFromReader(conn)
|
||||
if err != nil{
|
||||
responseWriter.WriteStatusLine(response.StatusBadRequest)
|
||||
responseWriter.WriteHeaders(*headers)
|
||||
return
|
||||
}
|
||||
|
||||
s.Handler(responseWriter,r)
|
||||
}
|
||||
|
||||
func runServer(s *Server, listener net.Listener) {
|
||||
for {
|
||||
conn, err := listener.Accept()
|
||||
|
||||
if s.Closed {
|
||||
return
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
go runConnection(s, conn)
|
||||
}
|
||||
}
|
||||
|
||||
func Serve(port uint16, handler Handler) (*Server, error) {
|
||||
listener, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
server := &Server{
|
||||
Closed: false,
|
||||
Handler: handler,
|
||||
}
|
||||
go runServer(server, listener)
|
||||
|
||||
return server, nil
|
||||
}
|
||||
|
||||
func (s *Server) Close() error {
|
||||
s.Closed = true
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user