diff options
| -rw-r--r-- | app/reader.go | 75 | ||||
| -rw-r--r-- | app/request.go | 37 | ||||
| -rw-r--r-- | app/server.go | 34 |
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 { |