aboutsummaryrefslogtreecommitdiff
path: root/request.go
diff options
context:
space:
mode:
authorAdnan Maolood <[email protected]>2020-12-18 01:41:14 -0500
committerAdnan Maolood <[email protected]>2020-12-18 01:42:05 -0500
commitd34d5df89e9a0d1cf8b3f8e95ce10d08ff91600b (patch)
treeab893d372686e431241e599e2ce819929d37ffc4 /request.go
parentExpose Request.Write and Response.Read functions (diff)
downloadgo-gemini-d34d5df89e9a0d1cf8b3f8e95ce10d08ff91600b.tar.xz
go-gemini-d34d5df89e9a0d1cf8b3f8e95ce10d08ff91600b.zip
Add ReadRequest and ReadResponse functions
Diffstat (limited to 'request.go')
-rw-r--r--request.go32
1 files changed, 32 insertions, 0 deletions
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()