From e20b8a0a5e8474b14b0c6702ffc1fdc7df76756e Mon Sep 17 00:00:00 2001 From: adnano Date: Mon, 21 Sep 2020 17:23:51 -0400 Subject: Add examples --- example/client/client.go | 54 +++++++++++++++++++++++++++++++++++++++++++++++ example/server/.gitignore | 2 ++ example/server/server.go | 41 +++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 example/client/client.go create mode 100644 example/server/.gitignore create mode 100644 example/server/server.go (limited to 'example') diff --git a/example/client/client.go b/example/client/client.go new file mode 100644 index 0000000..5b6fde2 --- /dev/null +++ b/example/client/client.go @@ -0,0 +1,54 @@ +// +build example + +package main + +import ( + "bufio" + "fmt" + "git.sr.ht/~adnano/go-gemini" + "log" + "os" +) + +var client gemini.Client + +func makeRequest(url string) { + resp, err := client.Request(url) + if err != nil { + log.Fatal(err) + } + + fmt.Println("Status code:", resp.Status) + fmt.Println("Meta:", resp.Meta) + + switch resp.Status / 10 { + case gemini.StatusClassInput: + scanner := bufio.NewScanner(os.Stdin) + fmt.Printf("%s: ", resp.Meta) + scanner.Scan() + query := scanner.Text() + makeRequest(url + "?" + query) + return + case gemini.StatusClassSuccess: + fmt.Print("Body:\n", string(resp.Body)) + case gemini.StatusClassRedirect: + log.Print("Redirecting to ", resp.Meta) + makeRequest(resp.Meta) + return + case gemini.StatusClassTemporaryFailure: + log.Fatal("Temporary failure") + case gemini.StatusClassPermanentFailure: + log.Fatal("Permanent failure") + case gemini.StatusClassClientCertificateRequired: + log.Fatal("Client Certificate Required") + default: + log.Fatal("Protocol Error") + } +} + +func main() { + if len(os.Args) < 2 { + log.Fatalf("usage: %s gemini://...", os.Args[0]) + } + makeRequest(os.Args[1]) +} diff --git a/example/server/.gitignore b/example/server/.gitignore new file mode 100644 index 0000000..10cdeb2 --- /dev/null +++ b/example/server/.gitignore @@ -0,0 +1,2 @@ +server.crt +server.key diff --git a/example/server/server.go b/example/server/server.go new file mode 100644 index 0000000..3f0a3e3 --- /dev/null +++ b/example/server/server.go @@ -0,0 +1,41 @@ +// +build example + +package main + +import ( + "crypto/tls" + "git.sr.ht/~adnano/go-gemini" + "log" + "net/url" +) + +func main() { + // Load a TLS key pair. + // To generate a TLS key pair, run: + // + // openssl genrsa -out server.key 2048 + // openssl ecparam -genkey -name secp384r1 -out server.key + // openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650 + // + config := &tls.Config{} + cert, err := tls.LoadX509KeyPair("example/server/server.crt", "example/server/server.key") + if err != nil { + log.Fatal(err) + } + config.Certificates = append(config.Certificates, cert) + + mux := &gemini.Mux{} + mux.HandleFunc("/", func(url *url.URL) *gemini.Response { + return &gemini.Response{ + Status: gemini.StatusSuccess, + Meta: "text/gemini", + Body: []byte("You requested " + url.String()), + } + }) + + server := gemini.Server{ + TLSConfig: config, + Handler: mux, + } + server.ListenAndServe() +} -- cgit v1.2.3