mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-23 03:17:43 +08:00
improve efficiency of multilayered indirect blocks clean up tests panic cleanup clean up logic, improve readability add final root node to the dagservice upon creation importer: simplified dag generation test: updated hashes using latest code @whyrusleeping this is why the sharness tests were failing: the hashes are added manually to make sure our generation doesn't change. cleanup after CR fix merkledag tests fix small block generation (no subblocks!)
100 lines
2.6 KiB
Go
100 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
|
|
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
|
|
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"
|
|
chunk "github.com/jbenet/go-ipfs/importer/chunk"
|
|
dag "github.com/jbenet/go-ipfs/merkledag"
|
|
"github.com/jbenet/go-ipfs/routing"
|
|
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)
|
|
}
|
|
|
|
// ipfsHandler is a HTTP handler that serves IPFS objects (accessible by default at /ipfs/<path>)
|
|
// (it serves requests like GET /ipfs/QmVRzPKPzNtSrEzBFm2UZfxmPAgnaLke4DMcerbsGGSaFe/link)
|
|
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.BuildDagFromReader(
|
|
r, i.node.DAG, i.node.Pinning.GetManual(), chunk.DefaultSplitter)
|
|
}
|
|
|
|
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 {
|
|
if err == routing.ErrNotFound {
|
|
w.WriteHeader(http.StatusNotFound)
|
|
} else if err == context.DeadlineExceeded {
|
|
w.WriteHeader(http.StatusRequestTimeout)
|
|
} else {
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
}
|
|
|
|
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()))
|
|
}
|