|
|
|
@ -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) |
|
|
|
|