move duplicated extractAddress func to micro/misc/lib/addr
This commit is contained in:
		
							
								
								
									
										70
									
								
								extractor.go
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								extractor.go
									
									
									
									
									
								
							| @@ -1,79 +1,15 @@ | ||||
| package http | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/micro/go-micro/registry" | ||||
| 	"github.com/micro/go-micro/server" | ||||
|  | ||||
| 	"github.com/micro/misc/lib/addr" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	privateBlocks []*net.IPNet | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	for _, b := range []string{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"} { | ||||
| 		if _, block, err := net.ParseCIDR(b); err == nil { | ||||
| 			privateBlocks = append(privateBlocks, block) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func extractAddress(addr string) (string, error) { | ||||
| 	if len(addr) > 0 && (addr != "0.0.0.0" && addr != "[::]") { | ||||
| 		return addr, nil | ||||
| 	} | ||||
|  | ||||
| 	addrs, err := net.InterfaceAddrs() | ||||
| 	if err != nil { | ||||
| 		return "", fmt.Errorf("Failed to get interface addresses! Err: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	var ipAddr []byte | ||||
|  | ||||
| 	for _, rawAddr := range addrs { | ||||
| 		var ip net.IP | ||||
| 		switch addr := rawAddr.(type) { | ||||
| 		case *net.IPAddr: | ||||
| 			ip = addr.IP | ||||
| 		case *net.IPNet: | ||||
| 			ip = addr.IP | ||||
| 		default: | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		if ip.To4() == nil { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		if !isPrivateIP(ip.String()) { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		ipAddr = ip | ||||
| 		break | ||||
| 	} | ||||
|  | ||||
| 	if ipAddr == nil { | ||||
| 		return "", fmt.Errorf("No private IP address found, and explicit IP not provided") | ||||
| 	} | ||||
|  | ||||
| 	return net.IP(ipAddr).String(), nil | ||||
| } | ||||
|  | ||||
| func isPrivateIP(ipAddr string) bool { | ||||
| 	ip := net.ParseIP(ipAddr) | ||||
| 	for _, priv := range privateBlocks { | ||||
| 		if priv.Contains(ip) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func serviceDef(opts server.Options) *registry.Service { | ||||
| 	var advt, host string | ||||
| 	var port int | ||||
| @@ -92,7 +28,7 @@ func serviceDef(opts server.Options) *registry.Service { | ||||
| 		host = parts[0] | ||||
| 	} | ||||
|  | ||||
| 	addr, err := extractAddress(host) | ||||
| 	addr, err := addr.Extract(host) | ||||
| 	if err != nil { | ||||
| 		addr = host | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user