aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjet2tlf <jet2tlf@gmail.com>2024-06-03 16:28:07 +0000
committerjet2tlf <jet2tlf@gmail.com>2024-06-03 16:28:07 +0000
commit8a94110728cca144388958d4bd322045f8bfb9e4 (patch)
tree898e27b416ad1a8c828a6af27d122b7fc83be307
parent7225eed4e2609ec4ac02a377bd6505370d4442d4 (diff)
downloadhttp-server-go-8a94110728cca144388958d4bd322045f8bfb9e4.tar.gz
http-server-go-8a94110728cca144388958d4bd322045f8bfb9e4.zip
codecrafters submit [skip ci]
-rw-r--r--app/reader.go75
-rw-r--r--app/request.go37
-rw-r--r--app/server.go34
3 files changed, 67 insertions, 79 deletions
diff --git a/app/reader.go b/app/reader.go
deleted file mode 100644
index 0a143a8..0000000
--- a/app/reader.go
+++ /dev/null
@@ -1,75 +0,0 @@
-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/request.go b/app/request.go
new file mode 100644
index 0000000..a859154
--- /dev/null
+++ b/app/request.go
@@ -0,0 +1,37 @@
+package main
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "io"
+)
+
+type Request struct {
+ Method string
+ Target string
+ Version string
+}
+
+func NewRequest(reader io.Reader) (*Request, error) {
+ scanner := bufio.NewScanner(reader)
+
+ ok := scanner.Scan()
+ if !ok {
+ err := scanner.Err()
+ if err == nil {
+ err = io.EOF
+ }
+
+ return nil, err
+ }
+
+ line := scanner.Bytes()
+ elements := bytes.Split(line, []byte(" "))
+
+ if len(elements) != 3 {
+ return nil, fmt.Errorf("invalid request, excepted 3 elements, got %d", len(elements))
+ }
+
+ return &Request{Method: string(elements[0]), Target: string(elements[1]), Version: string(elements[2])}, nil
+}
diff --git a/app/server.go b/app/server.go
index 93a45d0..b4dd7ee 100644
--- a/app/server.go
+++ b/app/server.go
@@ -4,6 +4,7 @@ import (
"fmt"
"net"
"os"
+ "strings"
)
func main() {
@@ -19,19 +20,44 @@ func main() {
os.Exit(1)
}
- reader := NewRequestReader(conn)
-
- target, err := reader.Target()
+ request, err := NewRequest(conn)
if err != nil {
fmt.Println("Error getting target: ", err.Error())
os.Exit(1)
}
- if target == "/" {
+ if request.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 if strings.HasPrefix(request.Target, "/echo/") {
+ message := strings.SplitN(request.Target, "/", 3)[2]
+
+ _, err = conn.Write([]byte("HTTP/1.1 200 OK\r\n"))
+ if err != nil {
+ fmt.Println("Error connection write: ", err.Error())
+ }
+
+ _, err = conn.Write([]byte("Content-Type: text/plain\r\n"))
+ if err != nil {
+ fmt.Println("Error connection write: ", err.Error())
+ }
+
+ _, err = conn.Write([]byte(fmt.Sprintf("Content-Length: %d\r\n", len(message))))
+ if err != nil {
+ fmt.Println("Error connection write: ", err.Error())
+ }
+
+ _, err = conn.Write([]byte("\r\n"))
+ if err != nil {
+ fmt.Println("Error connection write: ", err.Error())
+ }
+
+ _, err = conn.Write([]byte(message))
+ 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 {