HTTP on top of libp2p
Package p2phttp
allows to serve HTTP endpoints and make HTTP requests through libp2p using Go's standard "http" and "net" stack.
Instead of the regular "host:port" addressing, p2phttp
uses a Peer ID and lets libp2p take care of the routing, thus taking advantage of features like multi-routes, NAT transversal and stream multiplexing over a single connection.
This package is a library that uses Go modules for dependency management.
Full documentation can be read at Godoc. The important bits follow.
A simple http.Server
on libp2p works as:
listener, _ := gostream.Listen(host1, p2phttp.DefaultP2PProtocol)
defer listener.Close()
go func() {
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hi!"))
})
server := &http.Server{}
server.Serve(listener)
}()
The listener is provided by https://github.com/libp2p/go-libp2p-gostream .
A client just needs to be initialized with a custom libp2p host-based transport to perform requests to such server:
tr := &http.Transport{}
tr.RegisterProtocol("libp2p", p2phttp.NewTransport(clientHost))
client := &http.Client{Transport: tr}
res, err := client.Get("libp2p://Qmaoi4isbcTbFfohQyn28EiYM5CDWQx9QRCjDh3CTeiY7P/hello")
PRs accepted.
MIT © Protocol Labs, Inc.