aboutsummaryrefslogtreecommitdiff
path: root/request.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 /request.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 'request.go')
-rw-r--r--request.go21
1 files changed, 10 insertions, 11 deletions
diff --git a/request.go b/request.go
index e87d2ca..0613716 100644
--- a/request.go
+++ b/request.go
@@ -51,26 +51,25 @@ func NewRequest(rawurl string) (*Request, error) {
// for specialized applications; most code should use the Server
// to read requests and handle them via the Handler interface.
func ReadRequest(r io.Reader) (*Request, error) {
- // Read URL
+ // Limit request size
r = io.LimitReader(r, 1026)
br := bufio.NewReaderSize(r, 1026)
- rawurl, err := br.ReadString('\r')
+ b, err := br.ReadBytes('\n')
if err != nil {
+ if err == io.EOF {
+ return nil, ErrInvalidRequest
+ }
return nil, err
}
- // Read terminating line feed
- if b, err := br.ReadByte(); err != nil {
- return nil, err
- } else if b != '\n' {
+ // Read URL
+ rawurl, ok := trimCRLF(b)
+ if !ok {
return nil, ErrInvalidRequest
}
- // Trim carriage return
- rawurl = rawurl[:len(rawurl)-1]
- // Validate URL
- if len(rawurl) > 1024 {
+ if len(rawurl) == 0 {
return nil, ErrInvalidRequest
}
- u, err := url.Parse(rawurl)
+ u, err := url.Parse(string(rawurl))
if err != nil {
return nil, err
}