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
}