aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authoradnano <[email protected]>2020-09-21 18:25:31 -0400
committeradnano <[email protected]>2020-09-21 18:25:31 -0400
commit0b6d3d8633d9770e5692bb54dfe81d4b8ea72bb0 (patch)
tree7b78b4d9b537abf8a2aa4cd6608bd651e48367c9 /examples
parentAdd support for client-side certificates (diff)
downloadgo-gemini-0b6d3d8633d9770e5692bb54dfe81d4b8ea72bb0.tar.xz
go-gemini-0b6d3d8633d9770e5692bb54dfe81d4b8ea72bb0.zip
Rename example directory to examples
Diffstat (limited to 'examples')
-rw-r--r--examples/client/.gitignore2
-rw-r--r--examples/client/client.go73
-rw-r--r--examples/server/.gitignore2
-rw-r--r--examples/server/server.go41
4 files changed, 118 insertions, 0 deletions
diff --git a/examples/client/.gitignore b/examples/client/.gitignore
new file mode 100644
index 0000000..37278c1
--- /dev/null
+++ b/examples/client/.gitignore
@@ -0,0 +1,2 @@
+client.crt
+client.key
diff --git a/examples/client/client.go b/examples/client/client.go
new file mode 100644
index 0000000..6289e95
--- /dev/null
+++ b/examples/client/client.go
@@ -0,0 +1,73 @@
+// +build example
+
+package main
+
+import (
+ "bufio"
+ "crypto/tls"
+ "fmt"
+ "log"
+ "os"
+
+ "git.sr.ht/~adnano/go-gemini"
+)
+
+var client gemini.Client
+
+func init() {
+ // Configure a client side certificate.
+ // To generate a certificate, run:
+ //
+ // openssl genrsa -out client.key 2048
+ // openssl ecparam -genkey -name secp384r1 -out client.key
+ // openssl req -new -x509 -sha256 -key client.key -out client.crt -days 3650
+ //
+ config := tls.Config{}
+ cert, err := tls.LoadX509KeyPair("examples/client/client.crt", "examples/client/client.key")
+ if err != nil {
+ log.Fatal(err)
+ }
+ config.Certificates = append(config.Certificates, cert)
+ client.TLSConfig = config
+}
+
+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/examples/server/.gitignore b/examples/server/.gitignore
new file mode 100644
index 0000000..10cdeb2
--- /dev/null
+++ b/examples/server/.gitignore
@@ -0,0 +1,2 @@
+server.crt
+server.key
diff --git a/examples/server/server.go b/examples/server/server.go
new file mode 100644
index 0000000..9165898
--- /dev/null
+++ b/examples/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("examples/server/server.crt", "examples/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()
+}