mirror of
https://github.com/waku-org/go-multiaddr.git
synced 2025-02-23 11:38:20 +00:00
clean up parser registry
This commit is contained in:
parent
347065ffd7
commit
1263064416
246
convert.go
246
convert.go
@ -4,7 +4,6 @@ import (
|
||||
"fmt"
|
||||
"net"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
ma "github.com/jbenet/go-multiaddr"
|
||||
utp "github.com/jbenet/go-multiaddr-net/utp"
|
||||
@ -12,144 +11,6 @@ import (
|
||||
|
||||
var errIncorrectNetAddr = fmt.Errorf("incorrect network addr conversion")
|
||||
|
||||
type AddrParser func(a net.Addr) (ma.Multiaddr, error)
|
||||
type MaddrParser func(ma ma.Multiaddr) (net.Addr, error)
|
||||
|
||||
var maddrParsers map[string]MaddrParser
|
||||
var addrParsers map[string]AddrParser
|
||||
var addrParsersLock sync.Mutex
|
||||
|
||||
func init() {
|
||||
addrParsers = make(map[string]AddrParser)
|
||||
maddrParsers = make(map[string]MaddrParser)
|
||||
|
||||
registerDefaultAddrParsers()
|
||||
registerDefaultMaddrParsers()
|
||||
}
|
||||
|
||||
func registerDefaultAddrParsers() {
|
||||
funcs := map[string]AddrParser{
|
||||
"tcp": ParseTcpNetAddr,
|
||||
"udp": ParseUdpNetAddr,
|
||||
"utp": ParseUtpNetAddr,
|
||||
"ip": ParseIpNetAddr,
|
||||
}
|
||||
|
||||
for k, v := range funcs {
|
||||
addrParsers[k] = v
|
||||
addrParsers[k+"4"] = v
|
||||
addrParsers[k+"6"] = v
|
||||
}
|
||||
|
||||
addrParsers["ip+net"] = ParseIpPlusNetAddr
|
||||
}
|
||||
|
||||
func RegisterAddressType(netname, maname string, ap AddrParser, mp MaddrParser) {
|
||||
addrParsersLock.Lock()
|
||||
defer addrParsersLock.Unlock()
|
||||
addrParsers[netname] = ap
|
||||
maddrParsers[maname] = mp
|
||||
}
|
||||
|
||||
func ParseTcpNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
ac, ok := a.(*net.TCPAddr)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get IP Addr
|
||||
ipm, err := FromIP(ac.IP)
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get TCP Addr
|
||||
tcpm, err := ma.NewMultiaddr(fmt.Sprintf("/tcp/%d", ac.Port))
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Encapsulate
|
||||
return ipm.Encapsulate(tcpm), nil
|
||||
}
|
||||
|
||||
func ParseUdpNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
ac, ok := a.(*net.UDPAddr)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get IP Addr
|
||||
ipm, err := FromIP(ac.IP)
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get UDP Addr
|
||||
udpm, err := ma.NewMultiaddr(fmt.Sprintf("/udp/%d", ac.Port))
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Encapsulate
|
||||
return ipm.Encapsulate(udpm), nil
|
||||
}
|
||||
|
||||
func ParseUtpNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
acc, ok := a.(*utp.Addr)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get UDP Addr
|
||||
ac, ok := acc.Child().(*net.UDPAddr)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get IP Addr
|
||||
ipm, err := FromIP(ac.IP)
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get UDP Addr
|
||||
utpm, err := ma.NewMultiaddr(fmt.Sprintf("/udp/%d/utp", ac.Port))
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Encapsulate
|
||||
return ipm.Encapsulate(utpm), nil
|
||||
}
|
||||
|
||||
func ParseIpNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
ac, ok := a.(*net.IPAddr)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
return FromIP(ac.IP)
|
||||
}
|
||||
|
||||
func ParseIpPlusNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
ac, ok := a.(*net.IPNet)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
return FromIP(ac.IP)
|
||||
}
|
||||
|
||||
func getAddrParser(net string) (AddrParser, error) {
|
||||
addrParsersLock.Lock()
|
||||
defer addrParsersLock.Unlock()
|
||||
|
||||
parser, ok := addrParsers[net]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("unknown network %v", net)
|
||||
}
|
||||
return parser, nil
|
||||
}
|
||||
|
||||
// FromNetAddr converts a net.Addr type to a Multiaddr.
|
||||
func FromNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
if a == nil {
|
||||
@ -163,17 +24,6 @@ func FromNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
return p(a)
|
||||
}
|
||||
|
||||
func getMaddrParser(name string) (MaddrParser, error) {
|
||||
addrParsersLock.Lock()
|
||||
defer addrParsersLock.Unlock()
|
||||
p, ok := maddrParsers[name]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("network not supported: %s", name)
|
||||
}
|
||||
|
||||
return p, nil
|
||||
}
|
||||
|
||||
// ToNetAddr converts a Multiaddr to a net.Addr
|
||||
// Must be ThinWaist. acceptable protocol stacks are:
|
||||
// /ip{4,6}/{tcp, udp}
|
||||
@ -189,13 +39,7 @@ func ToNetAddr(maddr ma.Multiaddr) (net.Addr, error) {
|
||||
return p(maddr)
|
||||
}
|
||||
|
||||
func registerDefaultMaddrParsers() {
|
||||
for _, net := range []string{"tcp", "udp", "utp", "ip", "ip4", "ip6"} {
|
||||
maddrParsers[net] = parseBasicNetAddr
|
||||
}
|
||||
}
|
||||
|
||||
func parseBasicNetAddr(maddr ma.Multiaddr) (net.Addr, error) {
|
||||
func parseBasicNetMaddr(maddr ma.Multiaddr) (net.Addr, error) {
|
||||
network, host, err := DialArgs(maddr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -256,3 +100,91 @@ func DialArgs(m ma.Multiaddr) (string, string, error) {
|
||||
}
|
||||
return network, host, nil
|
||||
}
|
||||
|
||||
func parseTcpNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
ac, ok := a.(*net.TCPAddr)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get IP Addr
|
||||
ipm, err := FromIP(ac.IP)
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get TCP Addr
|
||||
tcpm, err := ma.NewMultiaddr(fmt.Sprintf("/tcp/%d", ac.Port))
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Encapsulate
|
||||
return ipm.Encapsulate(tcpm), nil
|
||||
}
|
||||
|
||||
func parseUdpNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
ac, ok := a.(*net.UDPAddr)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get IP Addr
|
||||
ipm, err := FromIP(ac.IP)
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get UDP Addr
|
||||
udpm, err := ma.NewMultiaddr(fmt.Sprintf("/udp/%d", ac.Port))
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Encapsulate
|
||||
return ipm.Encapsulate(udpm), nil
|
||||
}
|
||||
|
||||
func parseUtpNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
acc, ok := a.(*utp.Addr)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get UDP Addr
|
||||
ac, ok := acc.Child().(*net.UDPAddr)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get IP Addr
|
||||
ipm, err := FromIP(ac.IP)
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Get UDP Addr
|
||||
utpm, err := ma.NewMultiaddr(fmt.Sprintf("/udp/%d/utp", ac.Port))
|
||||
if err != nil {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
|
||||
// Encapsulate
|
||||
return ipm.Encapsulate(utpm), nil
|
||||
}
|
||||
|
||||
func parseIpNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
ac, ok := a.(*net.IPAddr)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
return FromIP(ac.IP)
|
||||
}
|
||||
|
||||
func parseIpPlusNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||
ac, ok := a.(*net.IPNet)
|
||||
if !ok {
|
||||
return nil, errIncorrectNetAddr
|
||||
}
|
||||
return FromIP(ac.IP)
|
||||
}
|
||||
|
68
registry.go
Normal file
68
registry.go
Normal file
@ -0,0 +1,68 @@
|
||||
package manet
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"sync"
|
||||
|
||||
ma "github.com/jbenet/go-multiaddr"
|
||||
)
|
||||
|
||||
type AddrParser func(a net.Addr) (ma.Multiaddr, error)
|
||||
type MaddrParser func(ma ma.Multiaddr) (net.Addr, error)
|
||||
|
||||
var maddrParsers map[string]MaddrParser
|
||||
var addrParsers map[string]AddrParser
|
||||
var addrParsersLock sync.Mutex
|
||||
|
||||
func RegisterAddressType(netname, maname string, ap AddrParser, mp MaddrParser) {
|
||||
addrParsersLock.Lock()
|
||||
defer addrParsersLock.Unlock()
|
||||
addrParsers[netname] = ap
|
||||
maddrParsers[maname] = mp
|
||||
}
|
||||
|
||||
func init() {
|
||||
addrParsers = make(map[string]AddrParser)
|
||||
maddrParsers = make(map[string]MaddrParser)
|
||||
|
||||
funcs := map[string]AddrParser{
|
||||
"tcp": parseTcpNetAddr,
|
||||
"udp": parseUdpNetAddr,
|
||||
"utp": parseUtpNetAddr,
|
||||
}
|
||||
|
||||
for k, v := range funcs {
|
||||
RegisterAddressType(k, k, v, parseBasicNetMaddr)
|
||||
RegisterAddressType(k+"4", k, v, parseBasicNetMaddr)
|
||||
RegisterAddressType(k+"6", k, v, parseBasicNetMaddr)
|
||||
}
|
||||
|
||||
for _, i := range []string{"ip", "ip4", "ip6"} {
|
||||
RegisterAddressType(i, i, parseIpNetAddr, parseBasicNetMaddr)
|
||||
}
|
||||
|
||||
addrParsers["ip+net"] = parseIpPlusNetAddr
|
||||
}
|
||||
|
||||
func getAddrParser(net string) (AddrParser, error) {
|
||||
addrParsersLock.Lock()
|
||||
defer addrParsersLock.Unlock()
|
||||
|
||||
parser, ok := addrParsers[net]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("unknown network %v", net)
|
||||
}
|
||||
return parser, nil
|
||||
}
|
||||
|
||||
func getMaddrParser(name string) (MaddrParser, error) {
|
||||
addrParsersLock.Lock()
|
||||
defer addrParsersLock.Unlock()
|
||||
p, ok := maddrParsers[name]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("network not supported: %s", name)
|
||||
}
|
||||
|
||||
return p, nil
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user