aboutsummaryrefslogtreecommitdiff
path: root/app/reader.go
blob: 0a143a88b22d3284a5591460fb22df42dfeded9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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),
	}
}