Skip to content

Commit

Permalink
nip11: always return a struct from Fetch() with URL filled.
Browse files Browse the repository at this point in the history
  • Loading branch information
fiatjaf committed Jun 19, 2024
1 parent 37ef70e commit 3862333
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 17 deletions.
23 changes: 15 additions & 8 deletions nip11/fetch.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,12 @@ import (
"github.com/nbd-wtf/go-nostr"
)

// Fetch fetches the NIP-11 RelayInformationDocument.
func Fetch(ctx context.Context, u string) (info *RelayInformationDocument, err error) {
// Fetch fetches the NIP-11 metadata for a relay.
//
// It will always return `info` with at least `URL` filled -- even if we can't connect to the
// relay or if it doesn't have a NIP-11 handler -- although in that case it will also return
// an error.
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
Expand All @@ -20,24 +24,27 @@ func Fetch(ctx context.Context, u string) (info *RelayInformationDocument, err e
}

// normalize URL to start with http://, https:// or without protocol
u = "http" + nostr.NormalizeURL(u)[2:]
u = nostr.NormalizeURL(u)

info = RelayInformationDocument{
URL: u,
}

// make request
req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil)
req, err := http.NewRequestWithContext(ctx, "GET", "http"+u[2:], 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)
return info, 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)
if err := json.NewDecoder(resp.Body).Decode(&info); err != nil {
return info, fmt.Errorf("invalid json: %w", err)
}

return info, nil
Expand Down
25 changes: 16 additions & 9 deletions nip11/nip11_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package nip11
import (
"context"
"testing"

"github.com/stretchr/testify/assert"
)

func TestAddSupportedNIP(t *testing.T) {
Expand Down Expand Up @@ -34,15 +36,20 @@ func TestAddSupportedNIP(t *testing.T) {

func TestFetch(t *testing.T) {
res, err := Fetch(context.Background(), "wss://relay.nostr.bg")
if err != nil || res.Name == "" {
t.Errorf("failed to fetch from wss")
}
assert.Equal(t, res.URL, "wss://relay.nostr.bg")
assert.Nil(t, err, "failed to fetch from wss")
assert.NotEmpty(t, res.Name)

res, err = Fetch(context.Background(), "https://relay.nostr.bg")
if err != nil || res.Name == "" {
t.Errorf("failed to fetch from https")
}
assert.Nil(t, err, "failed to fetch from https")
assert.NotEmpty(t, res.Name)

res, err = Fetch(context.Background(), "relay.nostr.bg")
if err != nil || res.Name == "" {
t.Errorf("failed to fetch without protocol")
}
assert.Nil(t, err, "failed to fetch without protocol")
assert.NotEmpty(t, res.Name)

res, err = Fetch(context.Background(), "wlenwqkeqwe.asjdaskd")
assert.Error(t, err)
assert.NotNil(t, res)
assert.Equal(t, res.URL, "wss://wlenwqkeqwe.asjdaskd")
}
2 changes: 2 additions & 0 deletions nip11/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package nip11
import "slices"

type RelayInformationDocument struct {
URL string `json:"-"`

Name string `json:"name"`
Description string `json:"description"`
PubKey string `json:"pubkey"`
Expand Down

0 comments on commit 3862333

Please sign in to comment.