Skip to content

Commit 7bd8512

Browse files
authored
fix: ens error handling (#5213)
1 parent 41f26a4 commit 7bd8512

File tree

5 files changed

+40
-9
lines changed

5 files changed

+40
-9
lines changed

pkg/api/api.go

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import (
4343
"github.com/ethersphere/bee/v2/pkg/pss"
4444
"github.com/ethersphere/bee/v2/pkg/resolver"
4545
"github.com/ethersphere/bee/v2/pkg/resolver/client/ens"
46+
"github.com/ethersphere/bee/v2/pkg/resolver/multiresolver"
4647
"github.com/ethersphere/bee/v2/pkg/sctx"
4748
"github.com/ethersphere/bee/v2/pkg/settlement"
4849
"github.com/ethersphere/bee/v2/pkg/settlement/swap"
@@ -109,9 +110,8 @@ const (
109110
)
110111

111112
const (
112-
multiPartFormData = "multipart/form-data"
113-
contentTypeTar = "application/x-tar"
114-
boolHeaderSetValue = "true"
113+
multiPartFormData = "multipart/form-data"
114+
contentTypeTar = "application/x-tar"
115115
)
116116

117117
var (
@@ -449,6 +449,10 @@ func (s *Service) resolveNameOrAddress(str string) (swarm.Address, error) {
449449
return addr, nil
450450
}
451451

452+
if errors.Is(err, multiresolver.ErrResolverService) || errors.Is(err, resolver.ErrServiceNotAvailable) {
453+
return swarm.ZeroAddress, err
454+
}
455+
452456
return swarm.ZeroAddress, fmt.Errorf("%w: %w", errInvalidNameOrAddress, err)
453457
}
454458

@@ -651,13 +655,23 @@ func (s *Service) mapStructure(input, output interface{}) func(string, log.Logge
651655
Message: msg,
652656
Code: http.StatusBadRequest,
653657
}
658+
hasServiceUnavailable := false
654659
for _, err := range merr.Errors {
660+
if errors.Is(err, resolver.ErrServiceNotAvailable) {
661+
hasServiceUnavailable = true
662+
resp.Reasons = append(resp.Reasons, jsonhttp.Reason{
663+
Field: "address",
664+
Error: err.Error(),
665+
})
666+
continue
667+
}
655668
var perr *parseError
656669
if errors.As(err, &perr) {
657670
resp.Reasons = append(resp.Reasons, jsonhttp.Reason{
658671
Field: perr.Entry,
659672
Error: perr.Cause.Error(),
660673
})
674+
continue
661675
}
662676
var verr *validationError
663677
if errors.As(err, &verr) {
@@ -667,7 +681,14 @@ func (s *Service) mapStructure(input, output interface{}) func(string, log.Logge
667681
})
668682
}
669683
}
670-
jsonhttp.BadRequest(w, resp)
684+
685+
if hasServiceUnavailable {
686+
resp.Message = "service unavailable"
687+
resp.Code = http.StatusServiceUnavailable
688+
jsonhttp.ServiceUnavailable(w, resp)
689+
} else {
690+
jsonhttp.BadRequest(w, resp)
691+
}
671692
}
672693
}
673694

pkg/resolver/client/ens/ens.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,10 @@ func wrapDial(endpoint, contractAddr string) (*ethclient.Client, *goens.Registry
167167
}
168168

169169
func wrapResolve(registry *goens.Registry, _ common.Address, name string) (string, error) {
170-
// Ensure the name is registered.
171170
ownerAddress, err := registry.Owner(name)
171+
// it returns error only if the service is not available
172172
if err != nil {
173-
return "", fmt.Errorf("owner: %w: %w", err, resolver.ErrNotFound)
173+
return "", fmt.Errorf("%w: %w", resolver.ErrServiceNotAvailable, err)
174174
}
175175

176176
// If the name is not registered, return an error.
@@ -181,12 +181,16 @@ func wrapResolve(registry *goens.Registry, _ common.Address, name string) (strin
181181
// Obtain the resolver for this domain name.
182182
ensR, err := registry.Resolver(name)
183183
if err != nil {
184-
return "", fmt.Errorf("resolver: %w: %w", err, resolver.ErrServiceNotAvailable)
184+
return "", fmt.Errorf("%w: %w", resolver.ErrServiceNotAvailable, err)
185185
}
186186

187187
// Try and read out the content hash record.
188188
ch, err := ensR.Contenthash()
189189
if err != nil {
190+
// Check if it's a service error (rate limiting, network issues)
191+
if strings.Contains(err.Error(), "429") || strings.Contains(err.Error(), "rate limit") {
192+
return "", fmt.Errorf("%w: %w", resolver.ErrServiceNotAvailable, err)
193+
}
190194
return "", fmt.Errorf("contenthash: %w: %w", err, resolver.ErrInvalidContentHash)
191195
}
192196

pkg/resolver/multiresolver/multiresolver.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/ethersphere/bee/v2/pkg/resolver"
1515
"github.com/ethersphere/bee/v2/pkg/resolver/cidv1"
1616
"github.com/ethersphere/bee/v2/pkg/resolver/client/ens"
17+
"github.com/ethersphere/bee/v2/pkg/swarm"
1718
"github.com/hashicorp/go-multierror"
1819
)
1920

@@ -35,6 +36,8 @@ var (
3536
ErrResolverChainFailed = errors.New("resolver chain failed")
3637
// ErrCloseFailed denotes that closing the multiresolver failed.
3738
ErrCloseFailed = errors.New("close failed")
39+
// ErrResolverService denotes that no resolver service is configured for the requested name or the resolver service is not available.
40+
ErrResolverService = errors.New("cannot communicate with the resolver or no resolver service configured")
3841
)
3942

4043
type resolverMap map[string][]resolver.Interface
@@ -160,6 +163,9 @@ func (mr *MultiResolver) Resolve(name string) (addr resolver.Address, err error)
160163
// If no resolver chain is found, switch to the default chain.
161164
if len(chain) == 0 {
162165
chain = mr.resolvers[""]
166+
if len(chain) == 1 && tld != "" { // only the CID resolver is defined
167+
return swarm.ZeroAddress, resolver.ErrServiceNotAvailable
168+
}
163169
}
164170

165171
var errs *multierror.Error

pkg/resolver/multiresolver/multiresolver_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ func TestResolve(t *testing.T) {
217217
},
218218
{
219219
// Switch to the default chain:
220-
name: "this.empty",
220+
name: "defaultChainIsCidTriggerItWithoutTld",
221221
wantAdr: addr,
222222
},
223223
{

pkg/resolver/resolver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ var (
2020
// ErrNotFound denotes that given name was not found
2121
ErrNotFound = errors.New("not found")
2222
// ErrServiceNotAvailable denotes that remote ENS service is not available
23-
ErrServiceNotAvailable = errors.New("not available")
23+
ErrServiceNotAvailable = errors.New("ENS service is not available")
2424
// ErrInvalidContentHash denotes that the value of the response contenthash record is not valid.
2525
ErrInvalidContentHash = errors.New("invalid swarm content hash")
2626
)

0 commit comments

Comments
 (0)