From 289a6351058e3e1fed1c5453d5b98df60bac1b63 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 30 Jan 2024 17:01:11 +0100 Subject: [PATCH] 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. --- api/ipfsproxy/ipfsproxy.go | 42 +++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/api/ipfsproxy/ipfsproxy.go b/api/ipfsproxy/ipfsproxy.go index 02b1ebaa..ea3f994c 100644 --- a/api/ipfsproxy/ipfsproxy.go +++ b/api/ipfsproxy/ipfsproxy.go @@ -24,6 +24,7 @@ import ( "github.com/ipfs-cluster/ipfs-cluster/adder/adderutils" "github.com/ipfs-cluster/ipfs-cluster/api" "github.com/ipfs-cluster/ipfs-cluster/rpcutil" + "github.com/tv42/httpunix" handlers "github.com/gorilla/handlers" mux "github.com/gorilla/mux" @@ -33,7 +34,6 @@ import ( logging "github.com/ipfs/go-log/v2" rpc "github.com/libp2p/go-libp2p-gorpc" peer "github.com/libp2p/go-libp2p/core/peer" - madns "github.com/multiformats/go-multiaddr-dns" manet "github.com/multiformats/go-multiaddr/net" "go.opencensus.io/plugin/ochttp" @@ -58,13 +58,16 @@ type Server struct { ctx context.Context cancel func() - config *Config - nodeScheme string - nodeAddr string + config *Config + nodeScheme string + nodeAddr string + nodeNetwork string rpcClient *rpc.Client rpcReady chan struct{} + transport http.RoundTripper // to the proxied kubo RPC API + listeners []net.Listener // proxy listener server *http.Server // proxy server reverseProxy *httputil.ReverseProxy // allows to talk to IPFS @@ -111,24 +114,23 @@ func New(cfg *Config) (*Server, error) { return nil, err } - nodeMAddr := 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) + nodeNetwork, nodeAddr, err := manet.DialArgs(cfg.NodeAddr) if err != nil { 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 for _, addr := range cfg.ListenAddr { 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 reverseProxy := httputil.NewSingleHostReverseProxy(proxyURL) - reverseProxy.Transport = http.DefaultTransport + reverseProxy.Transport = transport ctx, cancel := context.WithCancel(context.Background()) proxy := &Server{ ctx: ctx, config: cfg, cancel: cancel, nodeAddr: nodeHTTPAddr, + nodeNetwork: nodeNetwork, nodeScheme: nodeScheme, + transport: transport, rpcReady: make(chan struct{}, 1), listeners: listeners, server: s,