mirror of
https://github.com/ipfs/kubo.git
synced 2026-03-02 14:58:03 +08:00
Implement missing methods
This commit was moved from ipfs/go-ipfs-http-client@b76413dfe5
This commit is contained in:
parent
f7dd0c6909
commit
e1b14d78c7
@ -1,7 +1,6 @@
|
||||
package httpapi
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
gohttp "net/http"
|
||||
@ -23,8 +22,6 @@ const (
|
||||
EnvDir = "IPFS_PATH"
|
||||
)
|
||||
|
||||
var ErrNotImplemented = errors.New("not implemented")
|
||||
|
||||
type HttpApi struct {
|
||||
url string
|
||||
httpcli gohttp.Client
|
||||
|
||||
@ -2,7 +2,9 @@ package httpapi
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
"github.com/ipfs/interface-go-ipfs-core"
|
||||
caopts "github.com/ipfs/interface-go-ipfs-core/options"
|
||||
@ -38,11 +40,11 @@ func (api *NameAPI) Publish(ctx context.Context, p iface.Path, opts ...caopts.Na
|
||||
req := api.core().request("name/publish", p.String()).
|
||||
Option("key", options.Key).
|
||||
Option("allow-offline", options.AllowOffline).
|
||||
Option("lifetime", options.ValidTime.String()).
|
||||
Option("lifetime", options.ValidTime).
|
||||
Option("resolve", false)
|
||||
|
||||
if options.TTL != nil {
|
||||
req.Option("ttl", options.TTL.String())
|
||||
req.Option("ttl", options.TTL)
|
||||
}
|
||||
|
||||
var out ipnsEntry
|
||||
@ -57,7 +59,60 @@ func (api *NameAPI) Publish(ctx context.Context, p iface.Path, opts ...caopts.Na
|
||||
}
|
||||
|
||||
func (api *NameAPI) Search(ctx context.Context, name string, opts ...caopts.NameResolveOption) (<-chan iface.IpnsResult, error) {
|
||||
return nil, ErrNotImplemented
|
||||
options, err := caopts.NameResolveOptions(opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ropts := nsopts.ProcessOpts(options.ResolveOpts)
|
||||
if ropts.Depth != nsopts.DefaultDepthLimit && ropts.Depth != 1 {
|
||||
return nil, fmt.Errorf("Name.Resolve: depth other than 1 or %d not supported", nsopts.DefaultDepthLimit)
|
||||
}
|
||||
|
||||
req := api.core().request("name/resolve", name).
|
||||
Option("nocache", !options.Cache).
|
||||
Option("recursive", ropts.Depth != 1).
|
||||
Option("dht-record-count", ropts.DhtRecordCount).
|
||||
Option("dht-timeout", ropts.DhtTimeout).
|
||||
Option("stream", true)
|
||||
resp, err := req.Send(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if resp.Error != nil {
|
||||
return nil, resp.Error
|
||||
}
|
||||
|
||||
res := make(chan iface.IpnsResult)
|
||||
|
||||
go func() {
|
||||
defer close(res)
|
||||
defer resp.Close()
|
||||
|
||||
dec := json.NewDecoder(resp.Output)
|
||||
|
||||
for {
|
||||
var out struct{ Path string }
|
||||
err := dec.Decode(&out)
|
||||
if err == io.EOF {
|
||||
return
|
||||
}
|
||||
var ires iface.IpnsResult
|
||||
if err == nil {
|
||||
ires.Path, err = iface.ParsePath(out.Path)
|
||||
}
|
||||
|
||||
select {
|
||||
case res <- ires:
|
||||
case <-ctx.Done():
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (api *NameAPI) Resolve(ctx context.Context, name string, opts ...caopts.NameResolveOption) (iface.Path, error) {
|
||||
@ -75,7 +130,7 @@ func (api *NameAPI) Resolve(ctx context.Context, name string, opts ...caopts.Nam
|
||||
Option("nocache", !options.Cache).
|
||||
Option("recursive", ropts.Depth != 1).
|
||||
Option("dht-record-count", ropts.DhtRecordCount).
|
||||
Option("dht-timeout", ropts.DhtTimeout.String())
|
||||
Option("dht-timeout", ropts.DhtTimeout)
|
||||
|
||||
var out struct{ Path string }
|
||||
if err := req.Exec(ctx, &out); err != nil {
|
||||
|
||||
@ -42,6 +42,11 @@ func (api *HttpApi) ResolvePath(ctx context.Context, path iface.Path) (iface.Res
|
||||
return iface.NewResolvedPath(ipath, out.Cid, root, out.RemPath), nil
|
||||
}
|
||||
|
||||
func (api *HttpApi) ResolveNode(context.Context, iface.Path) (ipld.Node, error) {
|
||||
return nil, ErrNotImplemented
|
||||
func (api *HttpApi) ResolveNode(ctx context.Context, p iface.Path) (ipld.Node, error) {
|
||||
rp, err := api.ResolvePath(ctx, p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return api.Dag().Get(ctx, rp.Cid())
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user