提交 f940db58 作者: James Stanley 提交者: Steven Allen

Fix the PUT-existing bug in writable gateway API

See on https://discuss.ipfs.io/t/writeable-http-gateways/210

Previously, a PUT to a filename that already exists would return the hash
of the newly-inserted file instead of the hash of the new tree. This is not
useful, and it makes much more sense for the API to be consistent.

Furthermore, anybody who knows about the bug is already DELETE-ing the filename
before PUT-ing the new content, so the fix doesn't trample over that behaviour
either.

With this fix, every conceivable usage of the API is either unaffected or
improved.

It could do with a unit test.

License: MIT
Signed-off-by: 's avatarJames Stanley <james@incoherency.co.uk>
上级 062f47ef
...@@ -421,74 +421,39 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) { ...@@ -421,74 +421,39 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
newPath = path.Join(rsegs[2:]) newPath = path.Join(rsegs[2:])
} }
var newcid cid.Cid c, err := cid.Decode(rsegs[1])
rnode, err := core.Resolve(ctx, i.node.Namesys, i.node.Resolver, rootPath) if err != nil {
switch ev := err.(type) { webError(w, "putHandler: bad input path", err, http.StatusBadRequest)
case resolver.ErrNoLink: return
// ev.Node < node where resolve failed }
// ev.Name < new link
// but we need to patch from the root
c, err := cid.Decode(rsegs[1])
if err != nil {
webError(w, "putHandler: bad input path", err, http.StatusBadRequest)
return
}
rnode, err := i.node.DAG.Get(ctx, c)
if err != nil {
webError(w, "putHandler: Could not create DAG from request", err, http.StatusInternalServerError)
return
}
pbnd, ok := rnode.(*dag.ProtoNode)
if !ok {
webError(w, "Cannot read non protobuf nodes through gateway", dag.ErrNotProtobuf, http.StatusBadRequest)
return
}
e := dagutils.NewDagEditor(pbnd, i.node.DAG)
err = e.InsertNodeAtPath(ctx, newPath, newnode, ft.EmptyDirNode)
if err != nil {
webError(w, "putHandler: InsertNodeAtPath failed", err, http.StatusInternalServerError)
return
}
nnode, err := e.Finalize(ctx, i.node.DAG)
if err != nil {
webError(w, "putHandler: could not get node", err, http.StatusInternalServerError)
return
}
newcid = nnode.Cid()
case nil: rnode, err := i.node.DAG.Get(ctx, c)
pbnd, ok := rnode.(*dag.ProtoNode) if err != nil {
if !ok { webError(w, "putHandler: Could not create DAG from request", err, http.StatusInternalServerError)
webError(w, "Cannot read non protobuf nodes through gateway", dag.ErrNotProtobuf, http.StatusBadRequest) return
return }
}
pbnewnode, ok := newnode.(*dag.ProtoNode) pbnd, ok := rnode.(*dag.ProtoNode)
if !ok { if !ok {
webError(w, "Cannot read non protobuf nodes through gateway", dag.ErrNotProtobuf, http.StatusBadRequest) webError(w, "Cannot read non protobuf nodes through gateway", dag.ErrNotProtobuf, http.StatusBadRequest)
return return
} }
// object set-data case e := dagutils.NewDagEditor(pbnd, i.node.DAG)
pbnd.SetData(pbnewnode.Data()) err = e.InsertNodeAtPath(ctx, newPath, newnode, ft.EmptyDirNode)
if err != nil {
webError(w, "putHandler: InsertNodeAtPath failed", err, http.StatusInternalServerError)
return
}
newcid = pbnd.Cid() nnode, err := e.Finalize(ctx, i.node.DAG)
err = i.node.DAG.Add(ctx, pbnd) if err != nil {
if err != nil { webError(w, "putHandler: could not get node", err, http.StatusInternalServerError)
nnk := newnode.Cid()
webError(w, fmt.Sprintf("putHandler: Could not add newnode(%q) to root(%q)", nnk.String(), newcid.String()), err, http.StatusInternalServerError)
return
}
default:
webError(w, "could not resolve root DAG", ev, http.StatusInternalServerError)
return return
} }
newcid := nnode.Cid()
i.addUserHeaders(w) // ok, _now_ write user's headers. i.addUserHeaders(w) // ok, _now_ write user's headers.
w.Header().Set("IPFS-Hash", newcid.String()) w.Header().Set("IPFS-Hash", newcid.String())
http.Redirect(w, r, gopath.Join(ipfsPathPrefix, newcid.String(), newPath), http.StatusCreated) http.Redirect(w, r, gopath.Join(ipfsPathPrefix, newcid.String(), newPath), http.StatusCreated)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论