rest/libp2p-http: address lanzafame's review

License: MIT
Signed-off-by: Hector Sanjuan <code@hector.link>
This commit is contained in:
Hector Sanjuan 2018-03-20 19:35:42 +01:00
parent 23d2db15e7
commit 09f4c9fce3
9 changed files with 52 additions and 44 deletions

View File

@ -87,6 +87,10 @@ func NewClient(cfg *Config) (*Client, error) {
config: cfg,
}
if client.config.Timeout == 0 {
client.config.Timeout = DefaultTimeout
}
err := client.setupHTTPClient()
if err != nil {
return nil, err
@ -107,10 +111,6 @@ func NewClient(cfg *Config) (*Client, error) {
}
func (c *Client) setupHTTPClient() error {
if c.config.Timeout == 0 {
c.config.Timeout = DefaultTimeout
}
var err error
switch {
@ -136,7 +136,11 @@ func (c *Client) setupHTTPClient() error {
func (c *Client) setupHostname() error {
// When no host/port/multiaddress defined, we set the default
if c.config.APIAddr == nil && c.config.Host == "" && c.config.Port == "" {
c.config.APIAddr, _ = ma.NewMultiaddr(DefaultAPIAddr)
var err error
c.config.APIAddr, err = ma.NewMultiaddr(DefaultAPIAddr)
if err != nil {
return err
}
}
// PeerAddr takes precedence over APIAddr. APIAddr takes precedence
@ -150,6 +154,9 @@ func (c *Client) setupHostname() error {
resolveCtx, cancel := context.WithTimeout(c.ctx, c.config.Timeout)
defer cancel()
resolved, err := madns.Resolve(resolveCtx, c.config.APIAddr)
if err != nil {
return err
}
c.config.APIAddr = resolved[0]
_, c.hostname, err = manet.DialArgs(c.config.APIAddr)
if err != nil {

View File

@ -1,6 +1,7 @@
package client
import (
"context"
"crypto/tls"
"errors"
"net"
@ -14,6 +15,7 @@ import (
ipnet "github.com/libp2p/go-libp2p-interface-pnet"
peerstore "github.com/libp2p/go-libp2p-peerstore"
pnet "github.com/libp2p/go-libp2p-pnet"
madns "github.com/multiformats/go-multiaddr-dns"
)
// This is essentially a http.DefaultTransport. We should not mess
@ -63,8 +65,14 @@ func (c *Client) enableLibp2p() error {
return err
}
// This should resolve addr too.
h.Peerstore().AddAddr(pid, addr, peerstore.PermanentAddrTTL)
ctx, cancel := context.WithTimeout(c.ctx, c.config.Timeout)
defer cancel()
resolvedAddrs, err := madns.Resolve(ctx, addr)
if err != nil {
return err
}
h.Peerstore().AddAddrs(pid, resolvedAddrs, peerstore.PermanentAddrTTL)
c.transport.RegisterProtocol("libp2p", p2phttp.NewTransport(h))
c.net = "libp2p"
c.p2p = h

View File

@ -122,27 +122,18 @@ func (cfg *Config) Default() error {
// Validate makes sure that all fields in this Config have
// working values, at least in appearance.
func (cfg *Config) Validate() error {
if cfg.ReadTimeout < 0 {
switch {
case cfg.ReadTimeout < 0:
return errors.New("restapi.read_timeout is invalid")
}
if cfg.ReadHeaderTimeout < 0 {
case cfg.ReadHeaderTimeout < 0:
return errors.New("restapi.read_header_timeout is invalid")
}
if cfg.WriteTimeout < 0 {
case cfg.WriteTimeout < 0:
return errors.New("restapi.write_timeout is invalid")
}
if cfg.IdleTimeout < 0 {
case cfg.IdleTimeout < 0:
return errors.New("restapi.idle_timeout invalid")
}
if cfg.BasicAuthCreds != nil && len(cfg.BasicAuthCreds) == 0 {
case cfg.BasicAuthCreds != nil && len(cfg.BasicAuthCreds) == 0:
return errors.New("restapi.basic_auth_creds should be null or have at least one entry")
}
if (cfg.pathSSLCertFile != "" || cfg.pathSSLKeyFile != "") && cfg.TLS == nil {
case (cfg.pathSSLCertFile != "" || cfg.pathSSLKeyFile != "") && cfg.TLS == nil:
return errors.New("missing TLS configuration")
}
@ -299,14 +290,16 @@ func (cfg *Config) ToJSON() (raw []byte, err error) {
}
}()
jcfg := &jsonConfig{}
jcfg.HTTPListenMultiaddress = cfg.HTTPListenAddr.String()
jcfg.SSLCertFile = cfg.pathSSLCertFile
jcfg.SSLKeyFile = cfg.pathSSLKeyFile
jcfg.ReadTimeout = cfg.ReadTimeout.String()
jcfg.ReadHeaderTimeout = cfg.ReadHeaderTimeout.String()
jcfg.WriteTimeout = cfg.WriteTimeout.String()
jcfg.IdleTimeout = cfg.IdleTimeout.String()
jcfg := &jsonConfig{
HTTPListenMultiaddress: cfg.HTTPListenAddr.String(),
SSLCertFile: cfg.pathSSLCertFile,
SSLKeyFile: cfg.pathSSLKeyFile,
ReadTimeout: cfg.ReadTimeout.String(),
ReadHeaderTimeout: cfg.ReadHeaderTimeout.String(),
WriteTimeout: cfg.WriteTimeout.String(),
IdleTimeout: cfg.IdleTimeout.String(),
BasicAuthCreds: cfg.BasicAuthCreds,
}
if cfg.ID != "" {
jcfg.ID = peer.IDB58Encode(cfg.ID)
@ -322,8 +315,6 @@ func (cfg *Config) ToJSON() (raw []byte, err error) {
jcfg.Libp2pListenMultiaddress = cfg.Libp2pListenAddr.String()
}
jcfg.BasicAuthCreds = cfg.BasicAuthCreds
raw, err = config.DefaultJSONMarshal(jcfg)
return
}

View File

@ -54,13 +54,14 @@ func Libp2pMultiaddrSplit(addr ma.Multiaddr) (peer.ID, ma.Multiaddr, error) {
return peerID, decapAddr, nil
}
// Libp2pMultiaddrJoin takes a LibP2P multiaddress and a peer ID and
// encapsulates a new /ipfs/<peerID> address.
func Libp2pMultiaddrJoin(addr ma.Multiaddr, p peer.ID) ma.Multiaddr {
// MustLibp2pMultiaddrJoin takes a LibP2P multiaddress and a peer ID and
// encapsulates a new /ipfs/<peerID> address. It will panic if the given
// peer ID is bad.
func MustLibp2pMultiaddrJoin(addr ma.Multiaddr, p peer.ID) ma.Multiaddr {
pidAddr, err := ma.NewMultiaddr("/ipfs/" + peer.IDB58Encode(p))
// let this break badly
if err != nil {
panic("called Libp2pMultiaddrJoin with bad peer!")
panic("called MustLibp2pMultiaddrJoin with bad peer!")
}
return addr.Encapsulate(pidAddr)
}

View File

@ -580,7 +580,7 @@ func (c *Cluster) ID() api.ID {
}
for k := range addrsSet {
addr, _ := ma.NewMultiaddr(k)
addrs = append(addrs, api.Libp2pMultiaddrJoin(addr, c.id))
addrs = append(addrs, api.MustLibp2pMultiaddrJoin(addr, c.id))
}
peers := []peer.ID{}
@ -771,7 +771,7 @@ func (c *Cluster) Join(addr ma.Multiaddr) error {
"Cluster",
"PeerAdd",
api.MultiaddrToSerial(
api.Libp2pMultiaddrJoin(c.config.ListenAddr, c.id)),
api.MustLibp2pMultiaddrJoin(c.config.ListenAddr, c.id)),
&myID)
if err != nil {
logger.Error(err)

View File

@ -93,7 +93,7 @@ type DurationOpt struct {
Name string
}
// ParseDurations takes a time.Duration src and saves it to the given dst. into the given
// ParseDurations takes a time.Duration src and saves it to the given dst.
func ParseDurations(component string, args ...*DurationOpt) error {
for _, arg := range args {
t, err := time.ParseDuration(arg.Duration)

View File

@ -48,7 +48,8 @@ responses in a user-readable format. The location of the IPFS
Cluster server is assumed to be %s, but can be
configured with the --host option. To use the secure libp2p-http
API endpoint, use "--host" with the full cluster libp2p listener
address (including the "/ipfs/<peerID>" part), and --secret.
address (including the "/ipfs/<peerID>" part), and --secret (the
32-byte cluster secret as it appears in the cluster configuration).
For feedback, bug reports or any additional information, visit
https://github.com/ipfs/ipfs-cluster.

View File

@ -389,6 +389,6 @@ func (rpcapi *RPCAPI) RemoteMultiaddrForPeer(ctx context.Context, in peer.ID, ou
if len(conns) == 0 {
return errors.New("no connections to: " + in.Pretty())
}
*out = api.MultiaddrToSerial(api.Libp2pMultiaddrJoin(conns[0].RemoteMultiaddr(), in))
*out = api.MultiaddrToSerial(api.MustLibp2pMultiaddrJoin(conns[0].RemoteMultiaddr(), in))
return nil
}

View File

@ -105,9 +105,9 @@ func PeersFromMultiaddrs(addrs []ma.Multiaddr) []peer.ID {
func getRemoteMultiaddr(h host.Host, pid peer.ID, addr ma.Multiaddr) ma.Multiaddr {
conns := h.Network().ConnsToPeer(pid)
if len(conns) > 0 {
return api.Libp2pMultiaddrJoin(conns[0].RemoteMultiaddr(), pid)
return api.MustLibp2pMultiaddrJoin(conns[0].RemoteMultiaddr(), pid)
}
return api.Libp2pMultiaddrJoin(addr, pid)
return api.MustLibp2pMultiaddrJoin(addr, pid)
}
func pinInfoSliceToSerial(pi []api.PinInfo) []api.PinInfoSerial {