From de78b2c054c0b30beb84ab41961fe80ed04d3f37 Mon Sep 17 00:00:00 2001 From: Dylan Cant Date: Tue, 31 Jan 2023 11:48:48 -0500 Subject: [PATCH] added function to fetch NIP-11 documents --- nip11/fetch.go | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ normalize.go | 1 + 2 files changed, 55 insertions(+) create mode 100644 nip11/fetch.go diff --git a/nip11/fetch.go b/nip11/fetch.go new file mode 100644 index 0000000..5de7820 --- /dev/null +++ b/nip11/fetch.go @@ -0,0 +1,54 @@ +package nip11 + +import ( + "context" + "encoding/json" + "fmt" + + "net/http" + "net/url" + "strings" + + "time" +) + + +// Fetch fetches the NIP-11 RelayInformationDocument. +func Fetch(ctx context.Context, u string) (info *RelayInformationDocument, err error) { + if _, ok := ctx.Deadline(); !ok { + // if no timeout is set, force it to 7 seconds + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, 7*time.Second) + defer cancel() + } + + // normalize URL to start with http:// or https:// + if !strings.HasPrefix(u, "http") && !strings.HasPrefix(u, "ws") { + u = "wss://" + u + } + p, err := url.Parse(u) + if err != nil { + return nil, fmt.Errorf("Cannot parse url: %s", u) + } + if p.Scheme == "ws" { + p.Scheme = "http" + } else if p.Scheme == "wss" { + p.Scheme = "https" + } + p.Path = strings.TrimRight(p.Path, "/") + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, p.String(), nil) + + // add the NIP-11 header + req.Header.Add("Accept", "application/nostr+json") + + // send the request + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + info = &RelayInformationDocument{} + dec := json.NewDecoder(resp.Body) + err = dec.Decode(info) + return info, err +} diff --git a/normalize.go b/normalize.go index 659d51e..6dcdc13 100644 --- a/normalize.go +++ b/normalize.go @@ -5,6 +5,7 @@ import ( "strings" ) +// NormalizeURL normalizes the url and replaces http://, https:// schemes by ws://, wss://. func NormalizeURL(u string) string { if u == "" { return ""