mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-28 00:39:31 +08:00
feat(api): allow multiple API/Gateway addresses
License: MIT Signed-off-by: Overbool <overbool.xu@gmail.com>
This commit is contained in:
@ -412,22 +412,32 @@ func serveHTTPApi(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, error
|
|||||||
return nil, fmt.Errorf("serveHTTPApi: GetConfig() failed: %s", err)
|
return nil, fmt.Errorf("serveHTTPApi: GetConfig() failed: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
apiAddrs := make([]string, 0, 2)
|
||||||
apiAddr, _ := req.Options[commands.ApiOption].(string)
|
apiAddr, _ := req.Options[commands.ApiOption].(string)
|
||||||
if apiAddr == "" {
|
if apiAddr == "" {
|
||||||
apiAddr = cfg.Addresses.API[0]
|
apiAddrs = cfg.Addresses.API
|
||||||
}
|
} else {
|
||||||
apiMaddr, err := ma.NewMultiaddr(apiAddr)
|
apiAddrs = append(apiAddrs, apiAddr)
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("serveHTTPApi: invalid API address: %q (err: %s)", apiAddr, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
apiLis, err := manet.Listen(apiMaddr)
|
listeners := make([]manet.Listener, 0, len(apiAddrs))
|
||||||
if err != nil {
|
for _, addr := range apiAddrs {
|
||||||
return nil, fmt.Errorf("serveHTTPApi: manet.Listen(%s) failed: %s", apiMaddr, err)
|
apiMaddr, err := ma.NewMultiaddr(addr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("serveHTTPApi: invalid API address: %q (err: %s)", apiAddr, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
apiLis, err := manet.Listen(apiMaddr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("serveHTTPApi: manet.Listen(%s) failed: %s", apiMaddr, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// we might have listened to /tcp/0 - lets see what we are listing on
|
||||||
|
apiMaddr = apiLis.Multiaddr()
|
||||||
|
fmt.Printf("API server listening on %s\n", apiMaddr)
|
||||||
|
|
||||||
|
listeners = append(listeners, apiLis)
|
||||||
}
|
}
|
||||||
// we might have listened to /tcp/0 - lets see what we are listing on
|
|
||||||
apiMaddr = apiLis.Multiaddr()
|
|
||||||
fmt.Printf("API server listening on %s\n", apiMaddr)
|
|
||||||
|
|
||||||
// by default, we don't let you load arbitrary ipfs objects through the api,
|
// by default, we don't let you load arbitrary ipfs objects through the api,
|
||||||
// because this would open up the api to scripting vulnerabilities.
|
// because this would open up the api to scripting vulnerabilities.
|
||||||
@ -462,15 +472,25 @@ func serveHTTPApi(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, error
|
|||||||
return nil, fmt.Errorf("serveHTTPApi: ConstructNode() failed: %s", err)
|
return nil, fmt.Errorf("serveHTTPApi: ConstructNode() failed: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := node.Repo.SetAPIAddr(apiMaddr); err != nil {
|
if err := node.Repo.SetAPIAddr(listeners[0].Multiaddr()); err != nil {
|
||||||
return nil, fmt.Errorf("serveHTTPApi: SetAPIAddr() failed: %s", err)
|
return nil, fmt.Errorf("serveHTTPApi: SetAPIAddr() failed: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
errc := make(chan error)
|
errc := make(chan error)
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
for _, apiLis := range listeners {
|
||||||
|
wg.Add(1)
|
||||||
|
go func(lis manet.Listener) {
|
||||||
|
defer wg.Done()
|
||||||
|
errc <- corehttp.Serve(node, manet.NetListener(lis), opts...)
|
||||||
|
}(apiLis)
|
||||||
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
errc <- corehttp.Serve(node, manet.NetListener(apiLis), opts...)
|
wg.Wait()
|
||||||
close(errc)
|
close(errc)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
return errc, nil
|
return errc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -512,27 +532,33 @@ func serveHTTPGateway(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, e
|
|||||||
return nil, fmt.Errorf("serveHTTPGateway: GetConfig() failed: %s", err)
|
return nil, fmt.Errorf("serveHTTPGateway: GetConfig() failed: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
gatewayMaddr, err := ma.NewMultiaddr(cfg.Addresses.Gateway[0])
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("serveHTTPGateway: invalid gateway address: %q (err: %s)", cfg.Addresses.Gateway, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
writable, writableOptionFound := req.Options[writableKwd].(bool)
|
writable, writableOptionFound := req.Options[writableKwd].(bool)
|
||||||
if !writableOptionFound {
|
if !writableOptionFound {
|
||||||
writable = cfg.Gateway.Writable
|
writable = cfg.Gateway.Writable
|
||||||
}
|
}
|
||||||
|
|
||||||
gwLis, err := manet.Listen(gatewayMaddr)
|
gatewayAddrs := cfg.Addresses.Gateway
|
||||||
if err != nil {
|
listeners := make([]manet.Listener, 0, len(gatewayAddrs))
|
||||||
return nil, fmt.Errorf("serveHTTPGateway: manet.Listen(%s) failed: %s", gatewayMaddr, err)
|
for _, addr := range gatewayAddrs {
|
||||||
}
|
gatewayMaddr, err := ma.NewMultiaddr(addr)
|
||||||
// we might have listened to /tcp/0 - lets see what we are listing on
|
if err != nil {
|
||||||
gatewayMaddr = gwLis.Multiaddr()
|
return nil, fmt.Errorf("serveHTTPGateway: invalid gateway address: %q (err: %s)", addr, err)
|
||||||
|
}
|
||||||
|
|
||||||
if writable {
|
gwLis, err := manet.Listen(gatewayMaddr)
|
||||||
fmt.Printf("Gateway (writable) server listening on %s\n", gatewayMaddr)
|
if err != nil {
|
||||||
} else {
|
return nil, fmt.Errorf("serveHTTPGateway: manet.Listen(%s) failed: %s", gatewayMaddr, err)
|
||||||
fmt.Printf("Gateway (readonly) server listening on %s\n", gatewayMaddr)
|
}
|
||||||
|
// we might have listened to /tcp/0 - lets see what we are listing on
|
||||||
|
gatewayMaddr = gwLis.Multiaddr()
|
||||||
|
|
||||||
|
if writable {
|
||||||
|
fmt.Printf("Gateway (writable) server listening on %s\n", gatewayMaddr)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("Gateway (readonly) server listening on %s\n", gatewayMaddr)
|
||||||
|
}
|
||||||
|
|
||||||
|
listeners = append(listeners, gwLis)
|
||||||
}
|
}
|
||||||
|
|
||||||
var opts = []corehttp.ServeOption{
|
var opts = []corehttp.ServeOption{
|
||||||
@ -554,10 +580,20 @@ func serveHTTPGateway(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, e
|
|||||||
}
|
}
|
||||||
|
|
||||||
errc := make(chan error)
|
errc := make(chan error)
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
for _, lis := range listeners {
|
||||||
|
wg.Add(1)
|
||||||
|
go func(lis manet.Listener) {
|
||||||
|
defer wg.Done()
|
||||||
|
errc <- corehttp.Serve(node, manet.NetListener(lis), opts...)
|
||||||
|
}(lis)
|
||||||
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
errc <- corehttp.Serve(node, manet.NetListener(gwLis), opts...)
|
wg.Wait()
|
||||||
close(errc)
|
close(errc)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
return errc, nil
|
return errc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user