diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-09-02 22:20:13 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-09-03 01:24:44 +0300 |
| commit | 9cd014c3d6872582854e36a4df6c0a4633f3eb57 (patch) | |
| tree | c86d21965bc623a1e8693bb638e7ba39fc46f153 /pkg/http | |
| parent | 144f66574706c9e251c964b694e80406206cb10b (diff) | |
fix data steal by proxy
Diffstat (limited to 'pkg/http')
| -rw-r--r-- | pkg/http/http.go | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/pkg/http/http.go b/pkg/http/http.go index eefe348..4180c81 100644 --- a/pkg/http/http.go +++ b/pkg/http/http.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "io" + "net/textproto" "regexp" "strconv" "strings" @@ -27,6 +28,8 @@ type Response struct { Header Header } +type handler func(string) error + var version = "HTTP/[0-9]+\\.[0-9]+" var requestLine = regexp.MustCompile("^([A-Z]+) +([^ ]+) +(" + version + ")$") var statusLine = regexp.MustCompile("^(" + version + ") +([0-9]+) +(.*)$") @@ -52,31 +55,34 @@ func addHeader(m Header, k, v string) Header { return m } -func parse(r io.Reader, init func(string) error, f func(string) error) error { - scanner := bufio.NewScanner(r) - ok := false +func parse(r *bufio.Reader, init handler, f handler) error { + proto := textproto.NewReader(r) + first := true - if scanner.Scan() { - if err := init(scanner.Text()); err != nil { + for { + line, err := proto.ReadLine() + if err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } return err } - } - for scanner.Scan() { - if scanner.Text() == "" { - ok = true - break + if first { + if err := init(line); err != nil { + return err + } + first = false + continue } - if err := f(scanner.Text()); err != nil { - return err + if line == "" { + return nil } - } - if err := scanner.Err(); err != nil { - return err - } else if !ok { - return io.ErrUnexpectedEOF + if err := f(line); err != nil { + return err + } } return nil @@ -108,7 +114,7 @@ func (r *Request) parseHeader(s string) error { } } -func ParseRequest(r io.Reader) (*Request, error) { +func ParseRequest(r *bufio.Reader) (*Request, error) { req := new(Request) if err := parse(r, req.parseRequestLine, req.parseHeader); err != nil { @@ -146,7 +152,7 @@ func (r *Response) parseHeader(s string) error { } } -func ParseResponse(r io.Reader) (*Response, error) { +func ParseResponse(r *bufio.Reader) (*Response, error) { resp := new(Response) if err := parse(r, resp.parseStatusLine, resp.parseHeader); err != nil { |
