|
|
|
@ -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)) |
|
|
|
|
if hashMatcher.MatchString(uri.Addr) { |
|
|
|
|
log.Trace(fmt.Sprintf("addr is a hash: %q", uri.Addr)) |
|
|
|
|
return storage.Key(common.Hex2Bytes(uri.Addr)), nil |
|
|
|
|
|
|
|
|
|
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 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) |
|
|
|
|
if hashMatcher.MatchString(uri.Addr) { |
|
|
|
|
return storage.Key(common.Hex2Bytes(uri.Addr)), nil |
|
|
|
|
} |
|
|
|
|
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) |
|
|
|
|