From 897e0f869f9ec6300a5615a061cdee26402bd654 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Sat, 8 Nov 2014 21:09:29 -0800 Subject: [PATCH] cmds/ipfs2: Added '/ipfs' HTTP handling --- cmd/ipfs2/daemon.go | 7 +++- cmd/ipfs2/ipfsHandler.go | 86 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 cmd/ipfs2/ipfsHandler.go diff --git a/cmd/ipfs2/daemon.go b/cmd/ipfs2/daemon.go index da3603cad..50d605e7c 100644 --- a/cmd/ipfs2/daemon.go +++ b/cmd/ipfs2/daemon.go @@ -50,8 +50,11 @@ func daemonFunc(res cmds.Response, req cmds.Request) { return } - handler := cmdsHttp.NewHandler(*ctx, commands.Root) - http.Handle(cmdsHttp.ApiPath+"/", handler) + cmdHandler := cmdsHttp.NewHandler(*ctx, commands.Root) + http.Handle(cmdsHttp.ApiPath+"/", cmdHandler) + + ifpsHandler := &ipfsHandler{node} + http.Handle("/ipfs/", ifpsHandler) fmt.Printf("API server listening on '%s'\n", host) diff --git a/cmd/ipfs2/ipfsHandler.go b/cmd/ipfs2/ipfsHandler.go new file mode 100644 index 000000000..46336026b --- /dev/null +++ b/cmd/ipfs2/ipfsHandler.go @@ -0,0 +1,86 @@ +package main + +import ( + "io" + "net/http" + + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + + core "github.com/jbenet/go-ipfs/core" + "github.com/jbenet/go-ipfs/importer" + dag "github.com/jbenet/go-ipfs/merkledag" + uio "github.com/jbenet/go-ipfs/unixfs/io" + u "github.com/jbenet/go-ipfs/util" +) + +type ipfs interface { + ResolvePath(string) (*dag.Node, error) + NewDagFromReader(io.Reader) (*dag.Node, error) + AddNodeToDAG(nd *dag.Node) (u.Key, error) + NewDagReader(nd *dag.Node) (io.Reader, error) +} + +type ipfsHandler struct { + node *core.IpfsNode +} + +func (i *ipfsHandler) ResolvePath(path string) (*dag.Node, error) { + return i.node.Resolver.ResolvePath(path) +} + +func (i *ipfsHandler) NewDagFromReader(r io.Reader) (*dag.Node, error) { + return importer.NewDagFromReader(r) +} + +func (i *ipfsHandler) AddNodeToDAG(nd *dag.Node) (u.Key, error) { + return i.node.DAG.Add(nd) +} + +func (i *ipfsHandler) NewDagReader(nd *dag.Node) (io.Reader, error) { + return uio.NewDagReader(nd, i.node.DAG) +} + +func (i *ipfsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + path := r.URL.Path[5:] + + nd, err := i.ResolvePath(path) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + log.Error(err) + w.Write([]byte(err.Error())) + return + } + + dr, err := i.NewDagReader(nd) + if err != nil { + // TODO: return json object containing the tree data if it's a directory (err == ErrIsDir) + w.WriteHeader(http.StatusInternalServerError) + log.Error(err) + w.Write([]byte(err.Error())) + return + } + + io.Copy(w, dr) +} + +func (i *ipfsHandler) postHandler(w http.ResponseWriter, r *http.Request) { + nd, err := i.NewDagFromReader(r.Body) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + log.Error(err) + w.Write([]byte(err.Error())) + return + } + + k, err := i.AddNodeToDAG(nd) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + log.Error(err) + w.Write([]byte(err.Error())) + return + } + + //TODO: return json representation of list instead + w.WriteHeader(http.StatusCreated) + w.Write([]byte(mh.Multihash(k).B58String())) +}