提交 34b1313d 作者: Łukasz Magiera

coreapi unixfs: remove Cat, use sessions

License: MIT
Signed-off-by: 's avatarŁukasz Magiera <magik6k@gmail.com>
上级 dd4d8bb2
......@@ -10,6 +10,7 @@ import (
"github.com/ipfs/go-ipfs/core/coreapi/interface"
cmds "gx/ipfs/QmRRovo1DE6i5cMjCbf19mQCSuszF6SKwdZNUMS7MtBnH1/go-ipfs-cmds"
"gx/ipfs/QmZMWMvWMVKCbHetJ4RgndbuEF1io2UpUxwQwtNjtYPzSC/go-ipfs-files"
"gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
)
......@@ -123,6 +124,12 @@ var CatCmd = &cmds.Command{
},
}
type catFile interface {
files.SizeFile
io.Seeker
}
func cat(ctx context.Context, api iface.CoreAPI, paths []string, offset int64, max int64) ([]io.Reader, uint64, error) {
readers := make([]io.Reader, 0, len(paths))
length := uint64(0)
......@@ -135,32 +142,46 @@ func cat(ctx context.Context, api iface.CoreAPI, paths []string, offset int64, m
return nil, 0, err
}
read, err := api.Unixfs().Cat(ctx, fpath)
f, err := api.Unixfs().Get(ctx, fpath)
if err != nil {
return nil, 0, err
}
file := f.(catFile)
fsize, err := file.Size()
if err != nil {
return nil, 0, err
}
if offset > int64(read.Size()) {
offset = offset - int64(read.Size())
if offset > fsize {
offset = offset - fsize
continue
}
count, err := read.Seek(offset, io.SeekStart)
count, err := file.Seek(offset, io.SeekStart)
if err != nil {
return nil, 0, err
}
offset = 0
size := uint64(read.Size() - uint64(count))
fsize, err = file.Size()
if err != nil {
return nil, 0, err
}
size := uint64(fsize - count)
length += size
if max > 0 && length >= uint64(max) {
var r io.Reader = read
var r io.Reader = file
if overshoot := int64(length - uint64(max)); overshoot != 0 {
r = io.LimitReader(read, int64(size)-overshoot)
r = io.LimitReader(file, int64(size)-overshoot)
length = uint64(max)
}
readers = append(readers, r)
break
}
readers = append(readers, read)
readers = append(readers, file)
}
return readers, length, nil
}
......@@ -31,10 +31,6 @@ type UnixfsAPI interface {
// to operations performed on the returned file
Get(context.Context, Path) (files.File, error)
// Cat returns a reader for the file
// TODO: Remove in favour of Get (if we use Get on a file we still have reader directly, so..)
Cat(context.Context, Path) (Reader, error)
// Ls returns the list of links in a directory
Ls(context.Context, Path) ([]*ipld.Link, error)
}
......@@ -139,25 +139,8 @@ func (api *UnixfsAPI) Get(ctx context.Context, p coreiface.Path) (files.File, er
return nil, err
}
return newUnixfsFile(ctx, api.node.DAG, nd, "", nil)
}
// Cat returns the data contained by an IPFS or IPNS object(s) at path `p`.
func (api *UnixfsAPI) Cat(ctx context.Context, p coreiface.Path) (coreiface.Reader, error) {
dget := api.node.DAG // TODO: use a session here once routing perf issues are resolved
dagnode, err := api.core().ResolveNode(ctx, p)
if err != nil {
return nil, err
}
r, err := uio.NewDagReader(ctx, dagnode, dget)
if err == uio.ErrIsDir {
return nil, coreiface.ErrIsDir
} else if err != nil {
return nil, err
}
return r, nil
ses := dag.NewReadOnlyDagService(dag.NewSession(ctx, api.node.DAG))
return newUnixfsFile(ctx, ses, nd, "", nil)
}
// Ls returns the contents of an IPFS or IPNS object(s) at path p, with the format:
......
......@@ -623,7 +623,7 @@ func TestAddHashOnly(t *testing.T) {
}
}
func TestCatEmptyFile(t *testing.T) {
func TestGetEmptyFile(t *testing.T) {
ctx := context.Background()
node, api, err := makeAPI(ctx)
if err != nil {
......@@ -640,7 +640,7 @@ func TestCatEmptyFile(t *testing.T) {
t.Fatal(err)
}
r, err := api.Unixfs().Cat(ctx, emptyFilePath)
r, err := api.Unixfs().Get(ctx, emptyFilePath)
if err != nil {
t.Fatal(err)
}
......@@ -655,7 +655,7 @@ func TestCatEmptyFile(t *testing.T) {
}
}
func TestCatDir(t *testing.T) {
func TestGetDir(t *testing.T) {
ctx := context.Background()
node, api, err := makeAPI(ctx)
if err != nil {
......@@ -677,13 +677,18 @@ func TestCatDir(t *testing.T) {
t.Fatalf("expected path %s, got: %s", emptyDir.Cid(), p.String())
}
_, err = api.Unixfs().Cat(ctx, coreiface.IpfsPath(emptyDir.Cid()))
if err != coreiface.ErrIsDir {
r, err := api.Unixfs().Get(ctx, coreiface.IpfsPath(emptyDir.Cid()))
if err != nil {
t.Error(err)
}
_, err = r.Read(make([]byte, 2))
if err != files.ErrNotReader {
t.Fatalf("expected ErrIsDir, got: %s", err)
}
}
func TestCatNonUnixfs(t *testing.T) {
func TestGetNonUnixfs(t *testing.T) {
ctx := context.Background()
node, api, err := makeAPI(ctx)
if err != nil {
......@@ -696,7 +701,7 @@ func TestCatNonUnixfs(t *testing.T) {
t.Error(err)
}
_, err = api.Unixfs().Cat(ctx, coreiface.IpfsPath(nd.Cid()))
_, err = api.Unixfs().Get(ctx, coreiface.IpfsPath(nd.Cid()))
if !strings.Contains(err.Error(), "proto: required field") {
t.Fatalf("expected protobuf error, got: %s", err)
}
......@@ -713,7 +718,7 @@ func TestCatOffline(t *testing.T) {
if err != nil {
t.Error(err)
}
_, err = api.Unixfs().Cat(ctx, p)
_, err = api.Unixfs().Get(ctx, p)
if err != coreiface.ErrOffline {
t.Fatalf("expected ErrOffline, got: %s", err)
}
......
......@@ -178,14 +178,12 @@ func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWr
return
}
dr, err := i.api.Unixfs().Cat(ctx, resolvedPath)
dir := false
dr, err := i.api.Unixfs().Get(ctx, resolvedPath)
dir := dr.IsDirectory()
switch err {
case nil:
// Cat() worked
defer dr.Close()
case coreiface.ErrIsDir:
dir = true
default:
webError(w, "ipfs cat "+escapedURLPath, err, http.StatusNotFound)
return
......@@ -270,7 +268,7 @@ func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWr
} else {
name = getFilename(urlPath)
}
i.serveFile(w, r, name, modtime, dr)
i.serveFile(w, r, name, modtime, dr.(io.ReadSeeker))
return
}
......@@ -297,7 +295,7 @@ func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWr
return
}
dr, err := i.api.Unixfs().Cat(ctx, coreiface.IpfsPath(ixnd.Cid()))
dr, err := i.api.Unixfs().Get(ctx, coreiface.IpfsPath(ixnd.Cid()))
if err != nil {
internalWebError(w, err)
return
......@@ -305,7 +303,7 @@ func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWr
defer dr.Close()
// write to request
http.ServeContent(w, r, "index.html", modtime, dr)
http.ServeContent(w, r, "index.html", modtime, dr.(io.ReadSeeker))
return
default:
internalWebError(w, err)
......
......@@ -175,7 +175,7 @@ func TestIpfsStressRead(t *testing.T) {
errs <- err
}
read, err := api.Unixfs().Cat(nd.Context(), item)
read, err := api.Unixfs().Get(nd.Context(), item)
if err != nil {
errs <- err
}
......
......@@ -147,7 +147,7 @@ func DirectAddCat(data []byte, conf testutil.LatencyConfig) error {
return err
}
readerCatted, err := catterApi.Unixfs().Cat(ctx, ap)
readerCatted, err := catterApi.Unixfs().Get(ctx, ap)
if err != nil {
return err
}
......
......@@ -94,7 +94,7 @@ func benchCat(b *testing.B, data []byte, conf testutil.LatencyConfig) error {
}
b.StartTimer()
readerCatted, err := catterApi.Unixfs().Cat(ctx, ap)
readerCatted, err := catterApi.Unixfs().Get(ctx, ap)
if err != nil {
return err
}
......
......@@ -126,7 +126,7 @@ func RunThreeLeggedCat(data []byte, conf testutil.LatencyConfig) error {
return err
}
readerCatted, err := catterApi.Unixfs().Cat(ctx, ap)
readerCatted, err := catterApi.Unixfs().Get(ctx, ap)
if err != nil {
return err
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论