提交 467beea9 作者: Steven Allen

commands(feat): use the coreapi in the urlstore command

License: MIT
Signed-off-by: 's avatarSteven Allen <steven@stebalien.com>
上级 2385cccb
...@@ -3,20 +3,15 @@ package commands ...@@ -3,20 +3,15 @@ package commands
import ( import (
"fmt" "fmt"
"io" "io"
"net/http" "net/url"
cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv" cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
filestore "github.com/ipfs/go-ipfs/filestore" filestore "github.com/ipfs/go-ipfs/filestore"
pin "github.com/ipfs/go-ipfs/pin"
cid "github.com/ipfs/go-cid"
chunk "github.com/ipfs/go-ipfs-chunker"
cmdkit "github.com/ipfs/go-ipfs-cmdkit" cmdkit "github.com/ipfs/go-ipfs-cmdkit"
cmds "github.com/ipfs/go-ipfs-cmds" cmds "github.com/ipfs/go-ipfs-cmds"
balanced "github.com/ipfs/go-unixfs/importer/balanced" files "github.com/ipfs/go-ipfs-files"
ihelper "github.com/ipfs/go-unixfs/importer/helpers" "github.com/ipfs/interface-go-ipfs-core/options"
trickle "github.com/ipfs/go-unixfs/importer/trickle"
mh "github.com/multiformats/go-multihash"
) )
var urlStoreCmd = &cmds.Command{ var urlStoreCmd = &cmds.Command{
...@@ -55,17 +50,17 @@ time. ...@@ -55,17 +50,17 @@ time.
Type: &BlockStat{}, Type: &BlockStat{},
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
url := req.Arguments[0] urlString := req.Arguments[0]
n, err := cmdenv.GetNode(env) if !filestore.IsURL(req.Arguments[0]) {
if err != nil { return fmt.Errorf("unsupported url syntax: %s", urlString)
return err
} }
if !filestore.IsURL(url) { url, err := url.Parse(urlString)
return fmt.Errorf("unsupported url syntax: %s", url) if err != nil {
return err
} }
cfg, err := n.Repo.Config() cfg, err := cmdenv.GetConfig(env)
if err != nil { if err != nil {
return err return err
} }
...@@ -74,68 +69,40 @@ time. ...@@ -74,68 +69,40 @@ time.
return filestore.ErrUrlstoreNotEnabled return filestore.ErrUrlstoreNotEnabled
} }
useTrickledag, _ := req.Options[trickleOptionName].(bool)
dopin, _ := req.Options[pinOptionName].(bool)
enc, err := cmdenv.GetCidEncoder(req) enc, err := cmdenv.GetCidEncoder(req)
if err != nil { if err != nil {
return err return err
} }
hreq, err := http.NewRequest("GET", url, nil) api, err := cmdenv.GetApi(env, req)
if err != nil {
return err
}
hres, err := http.DefaultClient.Do(hreq)
if err != nil { if err != nil {
return err return err
} }
if hres.StatusCode != http.StatusOK {
return fmt.Errorf("expected code 200, got: %d", hres.StatusCode)
}
if dopin { useTrickledag, _ := req.Options[trickleOptionName].(bool)
// Take the pinlock dopin, _ := req.Options[pinOptionName].(bool)
defer n.Blockstore.PinLock().Unlock()
}
chk := chunk.NewSizeSplitter(hres.Body, chunk.DefaultBlockSize) opts := []options.UnixfsAddOption{
prefix := cid.NewPrefixV1(cid.DagProtobuf, mh.SHA2_256) options.Unixfs.Pin(dopin),
dbp := &ihelper.DagBuilderParams{ options.Unixfs.CidVersion(1),
Dagserv: n.DAG, options.Unixfs.RawLeaves(true),
RawLeaves: true, options.Unixfs.Nocopy(true),
Maxlinks: ihelper.DefaultLinksPerBlock,
NoCopy: true,
CidBuilder: &prefix,
URL: url,
} }
layout := balanced.Layout
if useTrickledag { if useTrickledag {
layout = trickle.Layout opts = append(opts, options.Unixfs.Layout(options.TrickleLayout))
} }
db, err := dbp.New(chk) file := files.NewWebFile(url)
if err != nil {
return err path, err := api.Unixfs().Add(req.Context, file, opts...)
}
root, err := layout(db)
if err != nil { if err != nil {
return err return err
} }
size, _ := file.Size()
c := root.Cid()
if dopin {
n.Pinning.PinWithMode(c, pin.Recursive)
if err := n.Pinning.Flush(); err != nil {
return err
}
}
return cmds.EmitOnce(res, &BlockStat{ return cmds.EmitOnce(res, &BlockStat{
Key: enc.Encode(c), Key: enc.Encode(path.Cid()),
Size: int(hres.ContentLength), Size: int(size),
}) })
}, },
Encoders: cmds.EncoderMap{ Encoders: cmds.EncoderMap{
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论