summaryrefslogtreecommitdiff
path: root/examples/fetch/main.go
blob: 109a0421fe3e0966de7b8b50018b87629a4b6d00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main

import (
	"fmt"
	"io"
	"log"
	"net/url"
	"os"
	"strings"

	"tildegit.org/tjp/gus"
	"tildegit.org/tjp/gus/gemini"
)

func main() {
	if len(os.Args) < 2 {
		fmt.Fprintf(os.Stderr, "usage: %s <gemini url>\n", os.Args[0])
	}

	certfile, keyfile := envConfig()

	// build a client
	var client gemini.Client
	if certfile != "" && keyfile != "" {
		tlsConf, err := gemini.FileTLS(certfile, keyfile)
		if err != nil {
			log.Fatal(err)
		}
		client = gemini.NewClient(tlsConf)
	}

	// parse the URL and build the request
	request := &gus.Request{URL: buildURL()}

	// fetch the response
	response, err := client.RoundTrip(request)
	if err != nil {
		log.Fatal(err)
	}
	defer response.Close()

	if response.Status != gemini.StatusSuccess {
		log.Fatalf("%d %s\n", response.Status, response.Meta)
	}

	//io.Copy(os.Stdout, response)
	buf, err := io.ReadAll(gemini.NewResponseReader(response))
	fmt.Printf("response: %s\n", buf)
}

func envConfig() (string, string) {
	return os.Getenv("SERVER_CERTIFICATE"), os.Getenv("SERVER_PRIVATEKEY")
}

func buildURL() *url.URL {
	raw := os.Args[1]
	if strings.HasPrefix(raw, "//") {
		raw = "gemini:" + raw
	}

	u, err := url.Parse(raw)
	if err != nil {
		log.Fatal(err)
	}

	return u
}