소스 검색

swarm/api: implement NoResolverError with information about TLD

MultiResolver needs to provide information about TLD that has
no resolver configured for.
Janos Guljas 8 년 전
부모
커밋
0d6a735a72
2개의 변경된 파일29개의 추가작업 그리고 7개의 파일을 삭제
  1. 20 6
      swarm/api/api.go
  2. 9 1
      swarm/api/api_test.go

+ 20 - 6
swarm/api/api.go

@@ -17,7 +17,6 @@
 package api
 
 import (
-	"errors"
 	"fmt"
 	"io"
 	"net/http"
@@ -42,9 +41,22 @@ type Resolver interface {
 	Resolve(string) (common.Hash, error)
 }
 
-// errNoResolver is returned by MultiResolver.Resolve if no resolver
+// NoResolverError is returned by MultiResolver.Resolve if no resolver
 // can be found for the address.
-var errNoResolver = errors.New("no resolver")
+type NoResolverError struct {
+	TLD string
+}
+
+func NewNoResolverError(tld string) *NoResolverError {
+	return &NoResolverError{TLD: tld}
+}
+
+func (e *NoResolverError) Error() string {
+	if e.TLD == "" {
+		return "no ENS resolver"
+	}
+	return fmt.Sprintf("no ENS endpoint configured to resolve .%s TLD names", e.TLD)
+}
 
 // MultiResolver is used to resolve URL addresses based on their TLDs.
 // Each TLD can have multiple resolvers, and the resoluton from the
@@ -84,14 +96,16 @@ func NewMultiResolver(opts ...MultiResolverOption) (m *MultiResolver) {
 // will be returned.
 func (m MultiResolver) Resolve(addr string) (h common.Hash, err error) {
 	rs := m.resolvers[""]
-	if ext := path.Ext(addr); ext != "" {
-		rstld, ok := m.resolvers[ext[1:]]
+	tld := path.Ext(addr)
+	if tld != "" {
+		tld = tld[1:]
+		rstld, ok := m.resolvers[tld]
 		if ok {
 			rs = rstld
 		}
 	}
 	if rs == nil {
-		return h, errNoResolver
+		return h, NewNoResolverError(tld)
 	}
 	for _, r := range rs {
 		h, err = r.Resolve(addr)

+ 9 - 1
swarm/api/api_test.go

@@ -259,7 +259,7 @@ func TestMultiResolver(t *testing.T) {
 		{
 			desc: "No resolvers, returns error",
 			r:    NewMultiResolver(),
-			err:  errNoResolver,
+			err:  NewNoResolverError(""),
 		},
 		{
 			desc:   "One default resolver, returns resolved address",
@@ -332,6 +332,14 @@ func TestMultiResolver(t *testing.T) {
 			addr:   testAddr,
 			result: testHash,
 		},
+		{
+			desc: "One TLD resolver, no default resolver, returns error for different TLD",
+			r: NewMultiResolver(
+				MultiResolverOptionWithResolver(ethResolve, "eth"),
+			),
+			addr: testAddr,
+			err:  NewNoResolverError("test"),
+		},
 	}
 	for _, x := range tests {
 		t.Run(x.desc, func(t *testing.T) {