go-nostr/nip11/fetch.go
2023-11-20 14:59:12 -03:00

56 lines
1.3 KiB
Go

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, fmt.Errorf("request failed: %w", err)
}
defer resp.Body.Close()
info = &RelayInformationDocument{}
if err := json.NewDecoder(resp.Body).Decode(info); err != nil {
return nil, fmt.Errorf("invalid json: %w", err)
}
return info, nil
}