diff options
| author | Adnan Maolood <[email protected]> | 2020-12-18 01:41:14 -0500 |
|---|---|---|
| committer | Adnan Maolood <[email protected]> | 2020-12-18 01:42:05 -0500 |
| commit | d34d5df89e9a0d1cf8b3f8e95ce10d08ff91600b (patch) | |
| tree | ab893d372686e431241e599e2ce819929d37ffc4 /request.go | |
| parent | Expose Request.Write and Response.Read functions (diff) | |
| download | go-gemini-d34d5df89e9a0d1cf8b3f8e95ce10d08ff91600b.tar.xz go-gemini-d34d5df89e9a0d1cf8b3f8e95ce10d08ff91600b.zip | |
Add ReadRequest and ReadResponse functions
Diffstat (limited to 'request.go')
| -rw-r--r-- | request.go | 32 |
1 files changed, 32 insertions, 0 deletions
@@ -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() |