diff options
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), + } +} |