@cryptotaxi247 / kubo / commits / 34b1313d8

coreapi unixfs: remove Cat, use sessions

License: MIT Signed-off-by: Łukasz Magiera <magik6k@gmail.com>

Łukasz Magiera committed Oct 9, 2018 at 18:57 UTC 34b1313d829d8e8324e3181b4cf4a02c925414e7
9 files changed +53 -50
core/commands/cat.go
+29 -8
@@ -10,6 +10,7 @@ import (
10 "github.com/ipfs/go-ipfs/core/coreapi/interface"
11
12 cmds "gx/ipfs/QmRRovo1DE6i5cMjCbf19mQCSuszF6SKwdZNUMS7MtBnH1/go-ipfs-cmds"
13 + "gx/ipfs/QmZMWMvWMVKCbHetJ4RgndbuEF1io2UpUxwQwtNjtYPzSC/go-ipfs-files"
14 "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
15 )
16
@@ -123,6 +124,12 @@ var CatCmd = &cmds.Command{
124 },
125 }
126
127 +type catFile interface {
128 + files.SizeFile
129 +
130 + io.Seeker
131 +}
132 +
133 func cat(ctx context.Context, api iface.CoreAPI, paths []string, offset int64, max int64) ([]io.Reader, uint64, error) {
134 readers := make([]io.Reader, 0, len(paths))
135 length := uint64(0)
@@ -135,32 +142,46 @@ func cat(ctx context.Context, api iface.CoreAPI, paths []string, offset int64, m
142 return nil, 0, err
143 }
144
138 - read, err := api.Unixfs().Cat(ctx, fpath)
145 + f, err := api.Unixfs().Get(ctx, fpath)
146 + if err != nil {
147 + return nil, 0, err
148 + }
149 +
150 + file := f.(catFile)
151 +
152 + fsize, err := file.Size()
153 if err != nil {
154 return nil, 0, err
155 }
142 - if offset > int64(read.Size()) {
143 - offset = offset - int64(read.Size())
156 +
157 + if offset > fsize {
158 + offset = offset - fsize
159 continue
160 }
146 - count, err := read.Seek(offset, io.SeekStart)
161 +
162 + count, err := file.Seek(offset, io.SeekStart)
163 if err != nil {
164 return nil, 0, err
165 }
166 offset = 0
167
152 - size := uint64(read.Size() - uint64(count))
168 + fsize, err = file.Size()
169 + if err != nil {
170 + return nil, 0, err
171 + }
172 +
173 + size := uint64(fsize - count)
174 length += size
175 if max > 0 && length >= uint64(max) {
155 - var r io.Reader = read
176 + var r io.Reader = file
177 if overshoot := int64(length - uint64(max)); overshoot != 0 {
157 - r = io.LimitReader(read, int64(size)-overshoot)
178 + r = io.LimitReader(file, int64(size)-overshoot)
179 length = uint64(max)
180 }
181 readers = append(readers, r)
182 break
183 }
163 - readers = append(readers, read)
184 + readers = append(readers, file)
185 }
186 return readers, length, nil
187 }
core/coreapi/interface/unixfs.go
-4
@@ -31,10 +31,6 @@ type UnixfsAPI interface {
31 // to operations performed on the returned file
32 Get(context.Context, Path) (files.File, error)
33
34 - // Cat returns a reader for the file
35 - // TODO: Remove in favour of Get (if we use Get on a file we still have reader directly, so..)
36 - Cat(context.Context, Path) (Reader, error)
37 -
34 // Ls returns the list of links in a directory
35 Ls(context.Context, Path) ([]*ipld.Link, error)
36 }
core/coreapi/unixfs.go
+2 -19
@@ -139,25 +139,8 @@ func (api *UnixfsAPI) Get(ctx context.Context, p coreiface.Path) (files.File, er
139 return nil, err
140 }
141
142 - return newUnixfsFile(ctx, api.node.DAG, nd, "", nil)
143 -}
144 -
145 -// Cat returns the data contained by an IPFS or IPNS object(s) at path `p`.
146 -func (api *UnixfsAPI) Cat(ctx context.Context, p coreiface.Path) (coreiface.Reader, error) {
147 - dget := api.node.DAG // TODO: use a session here once routing perf issues are resolved
148 -
149 - dagnode, err := api.core().ResolveNode(ctx, p)
150 - if err != nil {
151 - return nil, err
152 - }
153 -
154 - r, err := uio.NewDagReader(ctx, dagnode, dget)
155 - if err == uio.ErrIsDir {
156 - return nil, coreiface.ErrIsDir
157 - } else if err != nil {
158 - return nil, err
159 - }
160 - return r, nil
142 + ses := dag.NewReadOnlyDagService(dag.NewSession(ctx, api.node.DAG))
143 + return newUnixfsFile(ctx, ses, nd, "", nil)
144 }
145
146 // Ls returns the contents of an IPFS or IPNS object(s) at path p, with the format:
core/coreapi/unixfs_test.go
+13 -8
@@ -623,7 +623,7 @@ func TestAddHashOnly(t *testing.T) {
623 }
624 }
625
626 -func TestCatEmptyFile(t *testing.T) {
626 +func TestGetEmptyFile(t *testing.T) {
627 ctx := context.Background()
628 node, api, err := makeAPI(ctx)
629 if err != nil {
@@ -640,7 +640,7 @@ func TestCatEmptyFile(t *testing.T) {
640 t.Fatal(err)
641 }
642
643 - r, err := api.Unixfs().Cat(ctx, emptyFilePath)
643 + r, err := api.Unixfs().Get(ctx, emptyFilePath)
644 if err != nil {
645 t.Fatal(err)
646 }
@@ -655,7 +655,7 @@ func TestCatEmptyFile(t *testing.T) {
655 }
656 }
657
658 -func TestCatDir(t *testing.T) {
658 +func TestGetDir(t *testing.T) {
659 ctx := context.Background()
660 node, api, err := makeAPI(ctx)
661 if err != nil {
@@ -677,13 +677,18 @@ func TestCatDir(t *testing.T) {
677 t.Fatalf("expected path %s, got: %s", emptyDir.Cid(), p.String())
678 }
679
680 - _, err = api.Unixfs().Cat(ctx, coreiface.IpfsPath(emptyDir.Cid()))
681 - if err != coreiface.ErrIsDir {
680 + r, err := api.Unixfs().Get(ctx, coreiface.IpfsPath(emptyDir.Cid()))
681 + if err != nil {
682 + t.Error(err)
683 + }
684 +
685 + _, err = r.Read(make([]byte, 2))
686 + if err != files.ErrNotReader {
687 t.Fatalf("expected ErrIsDir, got: %s", err)
688 }
689 }
690
686 -func TestCatNonUnixfs(t *testing.T) {
691 +func TestGetNonUnixfs(t *testing.T) {
692 ctx := context.Background()
693 node, api, err := makeAPI(ctx)
694 if err != nil {
@@ -696,7 +701,7 @@ func TestCatNonUnixfs(t *testing.T) {
701 t.Error(err)
702 }
703
699 - _, err = api.Unixfs().Cat(ctx, coreiface.IpfsPath(nd.Cid()))
704 + _, err = api.Unixfs().Get(ctx, coreiface.IpfsPath(nd.Cid()))
705 if !strings.Contains(err.Error(), "proto: required field") {
706 t.Fatalf("expected protobuf error, got: %s", err)
707 }
@@ -713,7 +718,7 @@ func TestCatOffline(t *testing.T) {
718 if err != nil {
719 t.Error(err)
720 }
716 - _, err = api.Unixfs().Cat(ctx, p)
721 + _, err = api.Unixfs().Get(ctx, p)
722 if err != coreiface.ErrOffline {
723 t.Fatalf("expected ErrOffline, got: %s", err)
724 }
core/corehttp/gateway_handler.go
+5 -7
@@ -178,14 +178,12 @@ func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWr
178 return
179 }
180
181 - dr, err := i.api.Unixfs().Cat(ctx, resolvedPath)
182 - dir := false
181 + dr, err := i.api.Unixfs().Get(ctx, resolvedPath)
182 + dir := dr.IsDirectory()
183 switch err {
184 case nil:
185 // Cat() worked
186 defer dr.Close()
187 - case coreiface.ErrIsDir:
188 - dir = true
187 default:
188 webError(w, "ipfs cat "+escapedURLPath, err, http.StatusNotFound)
189 return
@@ -270,7 +268,7 @@ func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWr
268 } else {
269 name = getFilename(urlPath)
270 }
273 - i.serveFile(w, r, name, modtime, dr)
271 + i.serveFile(w, r, name, modtime, dr.(io.ReadSeeker))
272 return
273 }
274
@@ -297,7 +295,7 @@ func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWr
295 return
296 }
297
300 - dr, err := i.api.Unixfs().Cat(ctx, coreiface.IpfsPath(ixnd.Cid()))
298 + dr, err := i.api.Unixfs().Get(ctx, coreiface.IpfsPath(ixnd.Cid()))
299 if err != nil {
300 internalWebError(w, err)
301 return
@@ -305,7 +303,7 @@ func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWr
303 defer dr.Close()
304
305 // write to request
308 - http.ServeContent(w, r, "index.html", modtime, dr)
306 + http.ServeContent(w, r, "index.html", modtime, dr.(io.ReadSeeker))
307 return
308 default:
309 internalWebError(w, err)
fuse/readonly/ipfs_test.go
+1 -1
@@ -175,7 +175,7 @@ func TestIpfsStressRead(t *testing.T) {
175 errs <- err
176 }
177
178 - read, err := api.Unixfs().Cat(nd.Context(), item)
178 + read, err := api.Unixfs().Get(nd.Context(), item)
179 if err != nil {
180 errs <- err
181 }
test/integration/addcat_test.go
+1 -1
@@ -147,7 +147,7 @@ func DirectAddCat(data []byte, conf testutil.LatencyConfig) error {
147 return err
148 }
149
150 - readerCatted, err := catterApi.Unixfs().Cat(ctx, ap)
150 + readerCatted, err := catterApi.Unixfs().Get(ctx, ap)
151 if err != nil {
152 return err
153 }
test/integration/bench_cat_test.go
+1 -1
@@ -94,7 +94,7 @@ func benchCat(b *testing.B, data []byte, conf testutil.LatencyConfig) error {
94 }
95
96 b.StartTimer()
97 - readerCatted, err := catterApi.Unixfs().Cat(ctx, ap)
97 + readerCatted, err := catterApi.Unixfs().Get(ctx, ap)
98 if err != nil {
99 return err
100 }
test/integration/three_legged_cat_test.go
+1 -1
@@ -126,7 +126,7 @@ func RunThreeLeggedCat(data []byte, conf testutil.LatencyConfig) error {
126 return err
127 }
128
129 - readerCatted, err := catterApi.Unixfs().Cat(ctx, ap)
129 + readerCatted, err := catterApi.Unixfs().Get(ctx, ap)
130 if err != nil {
131 return err
132 }