aboutsummaryrefslogtreecommitdiff
path: root/response.go
diff options
context:
space:
mode:
authorAdnan Maolood <[email protected]>2021-03-20 12:27:20 -0400
committerAdnan Maolood <[email protected]>2021-03-20 12:27:20 -0400
commit5141eaafaa991a5ab4221fa466e86a167d8910c7 (patch)
tree4b8939eed193b54d3c53369616385b77274621a9 /response.go
parentresponse: Treat empty meta as invalid (diff)
downloadgo-gemini-5141eaafaa991a5ab4221fa466e86a167d8910c7.tar.xz
go-gemini-5141eaafaa991a5ab4221fa466e86a167d8910c7.zip
Tweak request and response parsing
Diffstat (limited to 'response.go')
-rw-r--r--response.go38
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)