diff options
| author | jet2tlf <jet2tlf@gmail.com> | 2024-06-03 16:14:09 +0000 |
|---|---|---|
| committer | jet2tlf <jet2tlf@gmail.com> | 2024-06-03 16:14:09 +0000 |
| commit | 7225eed4e2609ec4ac02a377bd6505370d4442d4 (patch) | |
| tree | 7cdf19dc53cba6e7a155b3177efa4a7526698800 /app/reader.go | |
| parent | 8630cc7003942c3692184f3d1a3ec36a0b7e3df7 (diff) | |
| download | http-server-go-7225eed4e2609ec4ac02a377bd6505370d4442d4.tar.gz http-server-go-7225eed4e2609ec4ac02a377bd6505370d4442d4.zip | |
codecrafters submit [skip ci]
Diffstat (limited to 'app/reader.go')
| -rw-r--r-- | app/reader.go | 75 |
1 files changed, 75 insertions, 0 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), + } +} |