swarm/api: better name resolver handling (#3754)

Fixes #3608
This commit is contained in:
holisticode
2017-04-13 04:06:19 -05:00
committed by Felix Lange
parent d5d910e8b6
commit 409b61fe3c
4 changed files with 53 additions and 16 deletions

View File

@ -17,7 +17,6 @@
package api
import (
"errors"
"fmt"
"io"
"net/http"
@ -84,25 +83,28 @@ type ErrResolve error
// DNS Resolver
func (self *Api) Resolve(uri *URI) (storage.Key, error) {
log.Trace(fmt.Sprintf("Resolving : %v", uri.Addr))
var err error
if !uri.Immutable() {
if self.dns != nil {
resolved, err := self.dns.Resolve(uri.Addr)
if err == nil {
return resolved[:], nil
}
} else {
err = fmt.Errorf("no DNS to resolve name")
}
}
if hashMatcher.MatchString(uri.Addr) {
log.Trace(fmt.Sprintf("addr is a hash: %q", uri.Addr))
return storage.Key(common.Hex2Bytes(uri.Addr)), nil
}
if uri.Immutable() {
return nil, errors.New("refusing to resolve immutable address")
}
if self.dns == nil {
return nil, fmt.Errorf("unable to resolve addr %q, resolver not configured", uri.Addr)
}
hash, err := self.dns.Resolve(uri.Addr)
if err != nil {
log.Warn(fmt.Sprintf("DNS error resolving addr %q: %s", uri.Addr, err))
return nil, ErrResolve(err)
return nil, fmt.Errorf("'%s' does not resolve: %v but is not a content hash", uri.Addr, err)
}
log.Trace(fmt.Sprintf("addr lookup: %v -> %v", uri.Addr, hash))
return hash[:], nil
return nil, fmt.Errorf("'%s' is not a content hash", uri.Addr)
}
// Put provides singleton manifest creation on top of dpa store
func (self *Api) Put(content, contentType string) (storage.Key, error) {
r := strings.NewReader(content)

View File

@ -99,4 +99,32 @@ func TestBzzrGetPath(t *testing.T) {
}
}
nonhashtests := []string{
srv.URL + "/bzz:/name",
srv.URL + "/bzzi:/nonhash",
srv.URL + "/bzzr:/nonhash",
}
nonhashresponses := []string{
"error resolving name: 'name' does not resolve: no DNS to resolve name but is not a content hash\n",
"error resolving nonhash: 'nonhash' is not a content hash\n",
"error resolving nonhash: 'nonhash' does not resolve: no DNS to resolve name but is not a content hash\n",
}
for i, url := range nonhashtests {
var resp *http.Response
var respbody []byte
resp, err = http.Get(url)
if err != nil {
t.Fatalf("Request failed: %v", err)
}
defer resp.Body.Close()
respbody, err = ioutil.ReadAll(resp.Body)
if string(respbody) != nonhashresponses[i] {
t.Fatalf("Non-Hash response body does not match, expected: %v, got: %v", nonhashresponses[i], string(respbody))
}
}
}