ipfsproxy: do not pre-resolve dns addrs / support api over unix sockets
These two changes were made to the ipfshttp connector already. First, node_multiaddress should not be pre-resolved, only using the first result of the resolution. Second, we should support node_multiaddresses that are pointing to unix sockets, as the kubo daemon can listen to requests that way and it is better than tcp for local requests.
This commit is contained in:
parent
61644365e0
commit
289a635105
|
@ -24,6 +24,7 @@ import (
|
||||||
"github.com/ipfs-cluster/ipfs-cluster/adder/adderutils"
|
"github.com/ipfs-cluster/ipfs-cluster/adder/adderutils"
|
||||||
"github.com/ipfs-cluster/ipfs-cluster/api"
|
"github.com/ipfs-cluster/ipfs-cluster/api"
|
||||||
"github.com/ipfs-cluster/ipfs-cluster/rpcutil"
|
"github.com/ipfs-cluster/ipfs-cluster/rpcutil"
|
||||||
|
"github.com/tv42/httpunix"
|
||||||
|
|
||||||
handlers "github.com/gorilla/handlers"
|
handlers "github.com/gorilla/handlers"
|
||||||
mux "github.com/gorilla/mux"
|
mux "github.com/gorilla/mux"
|
||||||
|
@ -33,7 +34,6 @@ import (
|
||||||
logging "github.com/ipfs/go-log/v2"
|
logging "github.com/ipfs/go-log/v2"
|
||||||
rpc "github.com/libp2p/go-libp2p-gorpc"
|
rpc "github.com/libp2p/go-libp2p-gorpc"
|
||||||
peer "github.com/libp2p/go-libp2p/core/peer"
|
peer "github.com/libp2p/go-libp2p/core/peer"
|
||||||
madns "github.com/multiformats/go-multiaddr-dns"
|
|
||||||
manet "github.com/multiformats/go-multiaddr/net"
|
manet "github.com/multiformats/go-multiaddr/net"
|
||||||
|
|
||||||
"go.opencensus.io/plugin/ochttp"
|
"go.opencensus.io/plugin/ochttp"
|
||||||
|
@ -58,13 +58,16 @@ type Server struct {
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
cancel func()
|
cancel func()
|
||||||
|
|
||||||
config *Config
|
config *Config
|
||||||
nodeScheme string
|
nodeScheme string
|
||||||
nodeAddr string
|
nodeAddr string
|
||||||
|
nodeNetwork string
|
||||||
|
|
||||||
rpcClient *rpc.Client
|
rpcClient *rpc.Client
|
||||||
rpcReady chan struct{}
|
rpcReady chan struct{}
|
||||||
|
|
||||||
|
transport http.RoundTripper // to the proxied kubo RPC API
|
||||||
|
|
||||||
listeners []net.Listener // proxy listener
|
listeners []net.Listener // proxy listener
|
||||||
server *http.Server // proxy server
|
server *http.Server // proxy server
|
||||||
reverseProxy *httputil.ReverseProxy // allows to talk to IPFS
|
reverseProxy *httputil.ReverseProxy // allows to talk to IPFS
|
||||||
|
@ -111,24 +114,23 @@ func New(cfg *Config) (*Server, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeMAddr := cfg.NodeAddr
|
nodeNetwork, nodeAddr, err := manet.DialArgs(cfg.NodeAddr)
|
||||||
// dns multiaddresses need to be resolved first
|
|
||||||
if madns.Matches(nodeMAddr) {
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), DNSTimeout)
|
|
||||||
defer cancel()
|
|
||||||
resolvedAddrs, err := madns.Resolve(ctx, cfg.NodeAddr)
|
|
||||||
if err != nil {
|
|
||||||
logger.Error(err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
nodeMAddr = resolvedAddrs[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
_, nodeAddr, err := manet.DialArgs(nodeMAddr)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
transport := http.DefaultTransport
|
||||||
|
|
||||||
|
if nodeNetwork == "unix" {
|
||||||
|
unixTransport := &httpunix.Transport{
|
||||||
|
DialTimeout: time.Second,
|
||||||
|
}
|
||||||
|
unixTransport.RegisterLocation("ipfs", nodeAddr)
|
||||||
|
t := &http.Transport{}
|
||||||
|
t.RegisterProtocol(httpunix.Scheme, unixTransport)
|
||||||
|
transport = t
|
||||||
|
}
|
||||||
|
|
||||||
var listeners []net.Listener
|
var listeners []net.Listener
|
||||||
for _, addr := range cfg.ListenAddr {
|
for _, addr := range cfg.ListenAddr {
|
||||||
proxyNet, proxyAddr, err := manet.DialArgs(addr)
|
proxyNet, proxyAddr, err := manet.DialArgs(addr)
|
||||||
|
@ -195,14 +197,16 @@ func New(cfg *Config) (*Server, error) {
|
||||||
s.SetKeepAlivesEnabled(true) // A reminder that this can be changed
|
s.SetKeepAlivesEnabled(true) // A reminder that this can be changed
|
||||||
|
|
||||||
reverseProxy := httputil.NewSingleHostReverseProxy(proxyURL)
|
reverseProxy := httputil.NewSingleHostReverseProxy(proxyURL)
|
||||||
reverseProxy.Transport = http.DefaultTransport
|
reverseProxy.Transport = transport
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
proxy := &Server{
|
proxy := &Server{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
config: cfg,
|
config: cfg,
|
||||||
cancel: cancel,
|
cancel: cancel,
|
||||||
nodeAddr: nodeHTTPAddr,
|
nodeAddr: nodeHTTPAddr,
|
||||||
|
nodeNetwork: nodeNetwork,
|
||||||
nodeScheme: nodeScheme,
|
nodeScheme: nodeScheme,
|
||||||
|
transport: transport,
|
||||||
rpcReady: make(chan struct{}, 1),
|
rpcReady: make(chan struct{}, 1),
|
||||||
listeners: listeners,
|
listeners: listeners,
|
||||||
server: s,
|
server: s,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user