diff options
| author | Adnan Maolood <[email protected]> | 2021-03-20 12:27:20 -0400 |
|---|---|---|
| committer | Adnan Maolood <[email protected]> | 2021-03-20 12:27:20 -0400 |
| commit | 5141eaafaa991a5ab4221fa466e86a167d8910c7 (patch) | |
| tree | 4b8939eed193b54d3c53369616385b77274621a9 /response.go | |
| parent | response: Treat empty meta as invalid (diff) | |
| download | go-gemini-5141eaafaa991a5ab4221fa466e86a167d8910c7.tar.xz go-gemini-5141eaafaa991a5ab4221fa466e86a167d8910c7.zip | |
Tweak request and response parsing
Diffstat (limited to 'response.go')
| -rw-r--r-- | response.go | 38 |
1 files changed, 17 insertions, 21 deletions
diff --git a/response.go b/response.go index 03d65ef..48d2e53 100644 --- a/response.go +++ b/response.go @@ -46,43 +46,39 @@ func ReadResponse(r io.ReadCloser) (*Response, error) { resp := &Response{} br := bufio.NewReader(r) - // Read the status - statusB := make([]byte, 2) - if _, err := br.Read(statusB); err != nil { + // Read response header + b, err := br.ReadBytes('\n') + if err != nil { + if err == io.EOF { + return nil, ErrInvalidResponse + } return nil, err } - status, err := strconv.Atoi(string(statusB)) + if len(b) < 3 { + return nil, ErrInvalidResponse + } + + // Read the status + status, err := strconv.Atoi(string(b[:2])) if err != nil { return nil, ErrInvalidResponse } resp.Status = Status(status) // Read one space - if b, err := br.ReadByte(); err != nil { - return nil, err - } else if b != ' ' { + if b[2] != ' ' { return nil, ErrInvalidResponse } // Read the meta - meta, err := br.ReadString('\r') - if err != nil { - return nil, err - } - // Trim carriage return - meta = meta[:len(meta)-1] - // Ensure meta is less than or equal to 1024 bytes - if len(meta) == 0 || len(meta) > 1024 { + meta, ok := trimCRLF(b[3:]) + if !ok { return nil, ErrInvalidResponse } - resp.Meta = meta - - // Read terminating newline - if b, err := br.ReadByte(); err != nil { - return nil, err - } else if b != '\n' { + if len(meta) == 0 || len(meta) > 1024 { return nil, ErrInvalidResponse } + resp.Meta = string(meta) if resp.Status.Class() == StatusSuccess { resp.Body = newBufReadCloser(br, r) |