diff --git a/server.go b/server.go index 6684d12..7e3b0ae 100644 --- a/server.go +++ b/server.go @@ -2,10 +2,13 @@ package main import ( "crypto/tls" + "net/url" "log" "net" "net/http" + "bufio" "os" + "strconv" "fmt" "encoding/json" "io/ioutil" @@ -95,12 +98,64 @@ func serve(listener net.Listener, baseURL string) { } } +func getRawURL(conn *tls.Conn) (string, error) { + scanner := bufio.NewScanner(conn) + if ok := scanner.Scan(); !ok { + return "", scanner.Err() + } + + rawURL := scanner.Text() + if strings.Contains(rawURL, "://") { + return rawURL, nil + } + + return fmt.Sprintf("gemini://%s", rawURL), nil +} + +func getPath(conn *tls.Conn) (string, error) { + rawURL, err := getRawURL(conn) + if err != nil { + return "", err + } + + parsedURL, err := url.Parse(rawURL) + if err != nil { + return "", err + } + + return parsedURL.Path, nil +} + func handleConn(conn *tls.Conn, baseURL string) { defer conn.Close() - blogs := getBlog(baseURL, "138624") + path, err := getPath(conn) + if err != nil { + log.Println("get url: %s", err) + _, err = fmt.Fprintf(conn, "59 Can't parse request\r\n") + if err != nil { + log.Println("send error: %s", err) + return + } + return + } - _, err := fmt.Fprintf(conn, "20 text/gemini\r\n# Picasoft account toots\n") + path = path[1:] + + _, err = strconv.ParseUint(path, 10, 64) + if err != nil { + log.Println("invalid request: %s", err) + _, err = fmt.Fprintf(conn, "59 Can't parse request\r\n") + if err != nil { + log.Println("send error: %s", err) + return + } + return + } + + blogs := getBlog(baseURL, path) + + _, err = fmt.Fprintf(conn, "20 text/gemini\r\n# Picasoft account toots\n") if err != nil { log.Println("handleConn: %s", err) return