From d34d5df89e9a0d1cf8b3f8e95ce10d08ff91600b Mon Sep 17 00:00:00 2001 From: Adnan Maolood Date: Fri, 18 Dec 2020 01:41:14 -0500 Subject: Add ReadRequest and ReadResponse functions --- request.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'request.go') diff --git a/request.go b/request.go index a18dcab..8313e81 100644 --- a/request.go +++ b/request.go @@ -4,6 +4,7 @@ import ( "bufio" "context" "crypto/tls" + "io" "net" "net/url" ) @@ -65,6 +66,37 @@ func NewRequestFromURL(url *url.URL) *Request { } } +// ReadRequest reads a Gemini request from the provided io.Reader +func ReadRequest(r io.Reader) (*Request, error) { + // Read URL + br := bufio.NewReader(r) + rawurl, err := br.ReadString('\r') + if err != nil { + return nil, err + } + // Read terminating line feed + if b, err := br.ReadByte(); err != nil { + return nil, err + } else if b != '\n' { + return nil, ErrInvalidRequest + } + // Trim carriage return + rawurl = rawurl[:len(rawurl)-1] + // Validate URL + if len(rawurl) > 1024 { + return nil, ErrInvalidRequest + } + u, err := url.Parse(rawurl) + if err != nil { + return nil, err + } + if u.User != nil { + // User is not allowed + return nil, ErrInvalidURL + } + return &Request{URL: u}, nil +} + // Write writes the Gemini request to the provided buffered writer. func (r *Request) Write(w *bufio.Writer) error { url := r.URL.String() -- cgit v1.2.3