aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorjet2tlf <jet2tlf@gmail.com>2024-06-03 16:14:09 +0000
committerjet2tlf <jet2tlf@gmail.com>2024-06-03 16:14:09 +0000
commit7225eed4e2609ec4ac02a377bd6505370d4442d4 (patch)
tree7cdf19dc53cba6e7a155b3177efa4a7526698800 /app
parent8630cc7003942c3692184f3d1a3ec36a0b7e3df7 (diff)
downloadhttp-server-go-7225eed4e2609ec4ac02a377bd6505370d4442d4.tar.gz
http-server-go-7225eed4e2609ec4ac02a377bd6505370d4442d4.zip
codecrafters submit [skip ci]
Diffstat (limited to 'app')
-rw-r--r--app/reader.go75
-rw-r--r--app/server.go50
2 files changed, 107 insertions, 18 deletions
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())
+ }
+ }
}