From 7225eed4e2609ec4ac02a377bd6505370d4442d4 Mon Sep 17 00:00:00 2001 From: jet2tlf Date: Mon, 3 Jun 2024 13:14:09 -0300 Subject: codecrafters submit [skip ci] --- app/reader.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/server.go | 50 +++++++++++++++++++++++++-------------- 2 files changed, 107 insertions(+), 18 deletions(-) create mode 100644 app/reader.go diff --git a/app/reader.go b/app/reader.go new file mode 100644 index 0000000..0a143a8 --- /dev/null +++ b/app/reader.go @@ -0,0 +1,75 @@ +package main + +import ( + "bufio" + "bytes" + "fmt" + "io" +) + +type RequestReader struct { + scanner *bufio.Scanner + lineBuf []byte +} + +func (r *RequestReader) read() ([]byte, error) { + ok := r.scanner.Scan() + if !ok { + err := r.scanner.Err() + if err == nil { + err = io.EOF + } + + return nil, err + } + + return r.scanner.Bytes(), nil +} + +func (r *RequestReader) line() ([]byte, error) { + if r.lineBuf == nil { + lineBuf, err := r.read() + if err != nil { + return nil, err + } + + r.lineBuf = lineBuf + } + + return r.lineBuf, nil +} + +func (r *RequestReader) element(index int) ([]byte, error) { + line, err := r.line() + if err != nil { + return nil, err + } + + return bytes.Split(line, []byte(" "))[index], nil +} + +func (r *RequestReader) Method() (string, error) { + fmt.Println("Reading method...") + element, err := r.element(0) + if err != nil { + return "", err + } + + return string(element), nil +} + +func (r *RequestReader) Target() (string, error) { + fmt.Println("Reading target...") + element, err := r.element(1) + if err != nil { + return "", err + } + + return string(element), nil +} + +func NewRequestReader(reader io.Reader) *RequestReader { + return &RequestReader{ + scanner: bufio.NewScanner(reader), + } +} diff --git a/app/server.go b/app/server.go index 59e20bf..93a45d0 100644 --- a/app/server.go +++ b/app/server.go @@ -2,26 +2,40 @@ package main import ( "fmt" - // Uncomment this block to pass the first stage - // "net" - // "os" + "net" + "os" ) func main() { - // You can use print statements as follows for debugging, they'll be visible when running tests. - fmt.Println("Logs from your program will appear here!") + l, err := net.Listen("tcp", "0.0.0.0:4221") + if err != nil { + fmt.Println("Failed to bind to port 4221") + os.Exit(1) + } - // Uncomment this block to pass the first stage - // - // l, err := net.Listen("tcp", "0.0.0.0:4221") - // if err != nil { - // fmt.Println("Failed to bind to port 4221") - // os.Exit(1) - // } - // - // _, err = l.Accept() - // if err != nil { - // fmt.Println("Error accepting connection: ", err.Error()) - // os.Exit(1) - // } + conn, err := l.Accept() + if err != nil { + fmt.Println("Error accepting connection: ", err.Error()) + os.Exit(1) + } + + reader := NewRequestReader(conn) + + target, err := reader.Target() + if err != nil { + fmt.Println("Error getting target: ", err.Error()) + os.Exit(1) + } + + if target == "/" { + _, err = conn.Write([]byte("HTTP/1.1 200 OK\r\n\r\n")) + if err != nil { + fmt.Println("Error connection write: ", err.Error()) + } + } else { + _, err = conn.Write([]byte("HTTP/1.1 404 Not Found\r\n\r\n")) + if err != nil { + fmt.Println("Error connection write: ", err.Error()) + } + } } -- cgit v1.2.3