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 | package http | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" |  | ||||||
| 	"net" |  | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"github.com/micro/go-micro/registry" | 	"github.com/micro/go-micro/registry" | ||||||
| 	"github.com/micro/go-micro/server" | 	"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 { | func serviceDef(opts server.Options) *registry.Service { | ||||||
| 	var advt, host string | 	var advt, host string | ||||||
| 	var port int | 	var port int | ||||||
| @@ -92,7 +28,7 @@ func serviceDef(opts server.Options) *registry.Service { | |||||||
| 		host = parts[0] | 		host = parts[0] | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	addr, err := extractAddress(host) | 	addr, err := addr.Extract(host) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		addr = host | 		addr = host | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user