Skip to content

Commit 6c31225

Browse files
committed
refactor resolved to allow transparent resolution of unixfs sharded paths
License: MIT Signed-off-by: Jeromy <[email protected]>
1 parent 259aeb4 commit 6c31225

22 files changed

+162
-48
lines changed

core/builder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ func setupNode(ctx context.Context, n *IpfsNode, cfg *BuildCfg) error {
179179
// this is kinda sketchy and could cause data loss
180180
n.Pinning = pin.NewPinner(n.Repo.Datastore(), n.DAG)
181181
}
182-
n.Resolver = &path.Resolver{DAG: n.DAG}
182+
n.Resolver = path.NewBasicResolver(n.DAG)
183183

184184
err = n.loadFilesRoot()
185185
if err != nil {

core/commands/files/files.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
mfs "github.com/ipfs/go-ipfs/mfs"
1616
path "github.com/ipfs/go-ipfs/path"
1717
ft "github.com/ipfs/go-ipfs/unixfs"
18+
uio "github.com/ipfs/go-ipfs/unixfs/io"
1819

1920
logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log"
2021
context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context"
@@ -259,7 +260,12 @@ func getNodeFromPath(ctx context.Context, node *core.IpfsNode, p string) (*dag.N
259260
return nil, err
260261
}
261262

262-
return core.Resolve(ctx, node, np)
263+
resolver := &path.Resolver{
264+
DAG: node.DAG,
265+
ResolveOnce: uio.ResolveUnixfsOnce,
266+
}
267+
268+
return core.Resolve(ctx, node.Namesys, resolver, np)
263269
default:
264270
fsn, err := mfs.Lookup(node.FilesRoot, p)
265271
if err != nil {

core/commands/get.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ may also specify the level of compression by specifying '-l=<1-9>'.
6363
}
6464
p := path.Path(req.Arguments()[0])
6565
ctx := req.Context()
66-
dn, err := core.Resolve(ctx, node, p)
66+
dn, err := core.Resolve(ctx, node.Namesys, node.Resolver, p)
6767
if err != nil {
6868
res.SetError(err, cmds.ErrNormal)
6969
return

core/commands/ls.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
merkledag "github.com/ipfs/go-ipfs/merkledag"
1313
path "github.com/ipfs/go-ipfs/path"
1414
unixfs "github.com/ipfs/go-ipfs/unixfs"
15+
uio "github.com/ipfs/go-ipfs/unixfs/io"
1516
unixfspb "github.com/ipfs/go-ipfs/unixfs/pb"
1617
)
1718

@@ -71,7 +72,18 @@ format:
7172

7273
var dagnodes []*merkledag.Node
7374
for _, fpath := range paths {
74-
dagnode, err := core.Resolve(req.Context(), node, path.Path(fpath))
75+
p, err := path.ParsePath(fpath)
76+
if err != nil {
77+
res.SetError(err, cmds.ErrNormal)
78+
return
79+
}
80+
81+
r := &path.Resolver{
82+
DAG: node.DAG,
83+
ResolveOnce: uio.ResolveUnixfsOnce,
84+
}
85+
86+
dagnode, err := core.Resolve(req.Context(), node.Namesys, r, p)
7587
if err != nil {
7688
res.SetError(err, cmds.ErrNormal)
7789
return

core/commands/object/diff.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,13 @@ Example:
7373

7474
ctx := req.Context()
7575

76-
obj_a, err := core.Resolve(ctx, node, pa)
76+
obj_a, err := core.Resolve(ctx, node.Namesys, node.Resolver, pa)
7777
if err != nil {
7878
res.SetError(err, cmds.ErrNormal)
7979
return
8080
}
8181

82-
obj_b, err := core.Resolve(ctx, node, pb)
82+
obj_b, err := core.Resolve(ctx, node.Namesys, node.Resolver, pb)
8383
if err != nil {
8484
res.SetError(err, cmds.ErrNormal)
8585
return

core/commands/object/object.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ is the raw data of the object.
8888
}
8989

9090
fpath := path.Path(req.Arguments()[0])
91-
node, err := core.Resolve(req.Context(), n, fpath)
91+
node, err := core.Resolve(req.Context(), n.Namesys, n.Resolver, fpath)
9292
if err != nil {
9393
res.SetError(err, cmds.ErrNormal)
9494
return
@@ -127,7 +127,7 @@ multihash.
127127
}
128128

129129
fpath := path.Path(req.Arguments()[0])
130-
node, err := core.Resolve(req.Context(), n, fpath)
130+
node, err := core.Resolve(req.Context(), n.Namesys, n.Resolver, fpath)
131131
if err != nil {
132132
res.SetError(err, cmds.ErrNormal)
133133
return
@@ -190,7 +190,7 @@ This command outputs data in the following encodings:
190190

191191
fpath := path.Path(req.Arguments()[0])
192192

193-
object, err := core.Resolve(req.Context(), n, fpath)
193+
object, err := core.Resolve(req.Context(), n.Namesys, n.Resolver, fpath)
194194
if err != nil {
195195
res.SetError(err, cmds.ErrNormal)
196196
return
@@ -257,7 +257,7 @@ var ObjectStatCmd = &cmds.Command{
257257

258258
fpath := path.Path(req.Arguments()[0])
259259

260-
object, err := core.Resolve(req.Context(), n, fpath)
260+
object, err := core.Resolve(req.Context(), n.Namesys, n.Resolver, fpath)
261261
if err != nil {
262262
res.SetError(err, cmds.ErrNormal)
263263
return

core/commands/object/patch.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ the limit will not be respected by the network.
7373
return
7474
}
7575

76-
rootnd, err := core.Resolve(req.Context(), nd, root)
76+
rootnd, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, root)
7777
if err != nil {
7878
res.SetError(err, cmds.ErrNormal)
7979
return
@@ -135,7 +135,7 @@ Example:
135135
return
136136
}
137137

138-
root, err := core.Resolve(req.Context(), nd, rp)
138+
root, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, rp)
139139
if err != nil {
140140
res.SetError(err, cmds.ErrNormal)
141141
return
@@ -193,7 +193,7 @@ Removes a link by the given name from root.
193193
return
194194
}
195195

196-
root, err := core.Resolve(req.Context(), nd, rootp)
196+
root, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, rootp)
197197
if err != nil {
198198
res.SetError(err, cmds.ErrNormal)
199199
return
@@ -266,7 +266,7 @@ to a file containing 'bar', and returns the hash of the new object.
266266
return
267267
}
268268

269-
root, err := core.Resolve(req.Context(), nd, rootp)
269+
root, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, rootp)
270270
if err != nil {
271271
res.SetError(err, cmds.ErrNormal)
272272
return
@@ -292,7 +292,7 @@ to a file containing 'bar', and returns the hash of the new object.
292292

293293
e := dagutils.NewDagEditor(root, nd.DAG)
294294

295-
childnd, err := core.Resolve(req.Context(), nd, childp)
295+
childnd, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, childp)
296296
if err != nil {
297297
res.SetError(err, cmds.ErrNormal)
298298
return

core/commands/pin.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,13 @@ func pinLsKeys(args []string, typeStr string, ctx context.Context, n *core.IpfsN
270270

271271
keys := make(map[string]RefKeyObject)
272272

273-
for _, p := range args {
274-
dagNode, err := core.Resolve(ctx, n, path.Path(p))
273+
for _, sp := range args {
274+
p, err := path.ParsePath(sp)
275+
if err != nil {
276+
return nil, err
277+
}
278+
279+
dagNode, err := core.Resolve(ctx, n.Namesys, n.Resolver, p)
275280
if err != nil {
276281
return nil, err
277282
}

core/commands/publish.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func publish(ctx context.Context, n *core.IpfsNode, k crypto.PrivKey, ref path.P
135135

136136
if opts.verifyExists {
137137
// verify the path exists
138-
_, err := core.Resolve(ctx, n, ref)
138+
_, err := core.Resolve(ctx, n.Namesys, n.Resolver, ref)
139139
if err != nil {
140140
return nil, err
141141
}

core/commands/refs.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,13 @@ var refsMarshallerMap = cmds.MarshalerMap{
196196

197197
func objectsForPaths(ctx context.Context, n *core.IpfsNode, paths []string) ([]*dag.Node, error) {
198198
objects := make([]*dag.Node, len(paths))
199-
for i, p := range paths {
200-
o, err := core.Resolve(ctx, n, path.Path(p))
199+
for i, sp := range paths {
200+
p, err := path.ParsePath(sp)
201+
if err != nil {
202+
return nil, err
203+
}
204+
205+
o, err := core.Resolve(ctx, n.Namesys, n.Resolver, p)
201206
if err != nil {
202207
return nil, err
203208
}

core/commands/resolve.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ Resolve the value of an IPFS DAG path:
9999
return
100100
}
101101

102-
node, err := core.Resolve(req.Context(), n, p)
102+
node, err := core.Resolve(req.Context(), n.Namesys, n.Resolver, p)
103103
if err != nil {
104104
res.SetError(err, cmds.ErrNormal)
105105
return

core/commands/tar.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ var tarCatCmd = &cmds.Command{
9898
return
9999
}
100100

101-
root, err := core.Resolve(req.Context(), nd, p)
101+
root, err := core.Resolve(req.Context(), nd.Namesys, nd.Resolver, p)
102102
if err != nil {
103103
res.SetError(err, cmds.ErrNormal)
104104
return

core/commands/unixfs/ls.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
merkledag "github.com/ipfs/go-ipfs/merkledag"
1313
path "github.com/ipfs/go-ipfs/path"
1414
unixfs "github.com/ipfs/go-ipfs/unixfs"
15+
uio "github.com/ipfs/go-ipfs/unixfs/io"
1516
unixfspb "github.com/ipfs/go-ipfs/unixfs/pb"
1617
)
1718

@@ -81,7 +82,13 @@ Example:
8182

8283
for _, fpath := range paths {
8384
ctx := req.Context()
84-
merkleNode, err := core.Resolve(ctx, node, path.Path(fpath))
85+
86+
resolver := &path.Resolver{
87+
DAG: node.DAG,
88+
ResolveOnce: uio.ResolveUnixfsOnce,
89+
}
90+
91+
merkleNode, err := core.Resolve(ctx, node.Namesys, resolver, path.Path(fpath))
8592
if err != nil {
8693
res.SetError(err, cmds.ErrNormal)
8794
return

core/corehttp/gateway_handler.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,13 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
153153
ipnsHostname = true
154154
}
155155

156-
nd, err := core.Resolve(ctx, i.node, path.Path(urlPath))
156+
p, err := path.ParsePath(urlPath)
157+
if err != nil {
158+
webError(w, "Invalid Path Error", err, http.StatusBadRequest)
159+
return
160+
}
161+
162+
nd, err := core.Resolve(ctx, i.node.Namesys, i.node.Resolver, p)
157163
// If node is in offline mode the error code and message should be different
158164
if err == core.ErrNoNamesys && !i.node.OnlineMode() {
159165
w.WriteHeader(http.StatusServiceUnavailable)
@@ -234,8 +240,14 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
234240
return
235241
}
236242

243+
p, err := path.ParsePath(urlPath + "/index.html")
244+
if err != nil {
245+
internalWebError(w, err)
246+
return
247+
}
248+
237249
// return index page instead.
238-
nd, err := core.Resolve(ctx, i.node, path.Path(urlPath+"/index.html"))
250+
nd, err := core.Resolve(ctx, i.node.Namesys, i.node.Resolver, p)
239251
if err != nil {
240252
internalWebError(w, err)
241253
return
@@ -359,7 +371,7 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
359371
}
360372

361373
var newkey key.Key
362-
rnode, err := core.Resolve(ctx, i.node, rootPath)
374+
rnode, err := core.Resolve(ctx, i.node.Namesys, i.node.Resolver, rootPath)
363375
switch ev := err.(type) {
364376
case path.ErrNoLink:
365377
// ev.Node < node where resolve failed
@@ -417,7 +429,13 @@ func (i *gatewayHandler) deleteHandler(w http.ResponseWriter, r *http.Request) {
417429
ctx, cancel := context.WithCancel(i.node.Context())
418430
defer cancel()
419431

420-
ipfsNode, err := core.Resolve(ctx, i.node, path.Path(urlPath))
432+
p, err := path.ParsePath(urlPath)
433+
if err != nil {
434+
webError(w, "Invalid path", err, http.StatusBadRequest)
435+
return
436+
}
437+
438+
ipfsNode, err := core.Resolve(ctx, i.node.Namesys, i.node.Resolver, p)
421439
if err != nil {
422440
// FIXME HTTP error code
423441
webError(w, "Could not resolve name", err, http.StatusInternalServerError)

core/corerepo/pinning.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,12 @@ import (
2727
func Pin(n *core.IpfsNode, ctx context.Context, paths []string, recursive bool) ([]key.Key, error) {
2828
dagnodes := make([]*merkledag.Node, 0)
2929
for _, fpath := range paths {
30-
dagnode, err := core.Resolve(ctx, n, path.Path(fpath))
30+
p, err := path.ParsePath(fpath)
31+
if err != nil {
32+
return nil, err
33+
}
34+
35+
dagnode, err := core.Resolve(ctx, n.Namesys, n.Resolver, p)
3136
if err != nil {
3237
return nil, fmt.Errorf("pin: %s", err)
3338
}

core/coreunix/cat.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
)
99

1010
func Cat(ctx context.Context, n *core.IpfsNode, pstr string) (*uio.DagReader, error) {
11-
dagNode, err := core.Resolve(ctx, n, path.Path(pstr))
11+
dagNode, err := core.Resolve(ctx, n.Namesys, n.Resolver, path.Path(pstr))
1212
if err != nil {
1313
return nil, err
1414
}

core/pathresolver.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
key "github.com/ipfs/go-ipfs/blocks/key"
1010
merkledag "github.com/ipfs/go-ipfs/merkledag"
11+
namesys "github.com/ipfs/go-ipfs/namesys"
1112
path "github.com/ipfs/go-ipfs/path"
1213
)
1314

@@ -19,12 +20,12 @@ var ErrNoNamesys = errors.New(
1920
// Resolve resolves the given path by parsing out protocol-specific
2021
// entries (e.g. /ipns/<node-key>) and then going through the /ipfs/
2122
// entries and returning the final merkledag node.
22-
func Resolve(ctx context.Context, n *IpfsNode, p path.Path) (*merkledag.Node, error) {
23+
func Resolve(ctx context.Context, nsys namesys.NameSystem, r *path.Resolver, p path.Path) (*merkledag.Node, error) {
2324
if strings.HasPrefix(p.String(), "/ipns/") {
2425
// resolve ipns paths
2526

2627
// TODO(cryptix): we sould be able to query the local cache for the path
27-
if n.Namesys == nil {
28+
if nsys == nil {
2829
return nil, ErrNoNamesys
2930
}
3031

@@ -40,7 +41,7 @@ func Resolve(ctx context.Context, n *IpfsNode, p path.Path) (*merkledag.Node, er
4041
return nil, err
4142
}
4243

43-
respath, err := n.Namesys.Resolve(ctx, resolvable.String())
44+
respath, err := nsys.Resolve(ctx, resolvable.String())
4445
if err != nil {
4546
return nil, err
4647
}
@@ -53,7 +54,7 @@ func Resolve(ctx context.Context, n *IpfsNode, p path.Path) (*merkledag.Node, er
5354
}
5455

5556
// ok, we have an ipfs path now (or what we'll treat as one)
56-
return n.Resolver.ResolvePath(ctx, p)
57+
return r.ResolvePath(ctx, p)
5758
}
5859

5960
// ResolveToKey resolves a path to a key.
@@ -76,7 +77,7 @@ func ResolveToKey(ctx context.Context, n *IpfsNode, p path.Path) (key.Key, error
7677
if err != nil {
7778
return key.Key(""), err
7879
}
79-
dagnode, err := Resolve(ctx, n, head)
80+
dagnode, err := Resolve(ctx, n.Namesys, n.Resolver, head)
8081
if err != nil {
8182
return key.Key(""), err
8283
}

core/pathresolver_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@ func TestResolveNoComponents(t *testing.T) {
1414
t.Fatal("Should have constructed a mock node", err)
1515
}
1616

17-
_, err = core.Resolve(n.Context(), n, path.Path("/ipns/"))
17+
_, err = core.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/ipns/"))
1818
if err != path.ErrNoComponents {
1919
t.Fatal("Should error with no components (/ipns/).", err)
2020
}
2121

22-
_, err = core.Resolve(n.Context(), n, path.Path("/ipfs/"))
22+
_, err = core.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/ipfs/"))
2323
if err != path.ErrNoComponents {
2424
t.Fatal("Should error with no components (/ipfs/).", err)
2525
}
2626

27-
_, err = core.Resolve(n.Context(), n, path.Path("/../.."))
27+
_, err = core.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/../.."))
2828
if err != path.ErrBadPath {
2929
t.Fatal("Should error with invalid path.", err)
3030
}

0 commit comments

Comments
 (0)