aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanos Guljas <janos@resenje.org>2017-12-19 06:07:48 +0800
committerJanos Guljas <janos@resenje.org>2017-12-19 06:07:48 +0800
commit0d6a735a72340130acd6b7e536dad5d8bee40d84 (patch)
tree0dbe9c9c1ca2cf130a790c9e6080e8515965dbf5
parentc0a4d9e1e64a09a19484c8c12e24505d9bacbd57 (diff)
downloaddexon-0d6a735a72340130acd6b7e536dad5d8bee40d84.tar.gz
dexon-0d6a735a72340130acd6b7e536dad5d8bee40d84.tar.zst
dexon-0d6a735a72340130acd6b7e536dad5d8bee40d84.zip
swarm/api: implement NoResolverError with information about TLD
MultiResolver needs to provide information about TLD that has no resolver configured for.
-rw-r--r--swarm/api/api.go26
-rw-r--r--swarm/api/api_test.go10
2 files changed, 29 insertions, 7 deletions
diff --git a/swarm/api/api.go b/swarm/api/api.go
index 2d9db022e..c143d8a3f 100644
--- a/swarm/api/api.go
+++ b/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)
diff --git a/swarm/api/api_test.go b/swarm/api/api_test.go
index 36cbdb83c..dbe7c1dac 100644
--- a/swarm/api/api_test.go
+++ b/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) {