package main import ( "crypto/tls" "flag" "fmt" "log" "net/url" "os" "strconv" "strings" ) var port = 1965 func get_host(path string) (string, error) { if !strings.HasPrefix(path, "gemini://") { path = "gemini://" + path } url, err := url.Parse(path) if err != nil { return "", err } return url.Host + ":" + strconv.Itoa(port), nil } func usage() { fmt.Printf("Usage: %s [options] url\n", os.Args[0]) flag.PrintDefaults() } func main() { flag.Usage = usage flag.IntVar(&port, "p", port, "server port number") flag.Parse() if flag.NArg() != 1 { fmt.Printf("Got %d arguments, expected 1\n", flag.NArg()) flag.Usage() os.Exit(1) } url, err := get_host(flag.Arg(0)) if err != nil { panic("Error parsing hostname: " + err.Error()) } request := flag.Arg(0) + "\r\n" if !strings.HasPrefix(request, "gemini://") { request = "gemini://" + request } conf := tls.Config{ InsecureSkipVerify: true, } log.Println("connecting to: " + url) log.Println("request: " + request) conn, err := tls.Dial("tcp", url, &conf) if err != nil { panic("failed to connect: " + err.Error()) } else { log.Println("connected to " + url) } defer conn.Close() n, err := conn.Write([]byte(request)) if err != nil { log.Println(n, err) return } buf := make([]byte, 1024) for { n, err = conn.Read(buf) if err != nil { log.Println(n, err) return } else { println(string(buf[:n])) } if n == 0 { break } } }