osbase/socksproxy: implement hostname addresses

This is required by quite a few clients, like Chrome. Implement it for
better usability of our userspace network while debugging.

Change-Id: I5db16d3702800b79f88d11c132ce8f7469839ec4
Reviewed-on: https://review.monogon.dev/c/monogon/+/3842
Tested-by: Jenkins CI
Reviewed-by: Leopold Schabel <leo@monogon.tech>
diff --git a/metropolis/test/nanoswitch/socks.go b/metropolis/test/nanoswitch/socks.go
index 4ba1d0a..15e0f81 100644
--- a/metropolis/test/nanoswitch/socks.go
+++ b/metropolis/test/nanoswitch/socks.go
@@ -23,16 +23,29 @@
 
 func (s *socksHandler) Connect(ctx context.Context, req *socksproxy.ConnectRequest) *socksproxy.ConnectResponse {
 	logger := supervisor.Logger(ctx)
-	target := net.JoinHostPort(req.Address.String(), fmt.Sprintf("%d", req.Port))
-
-	if len(req.Address) != 4 {
-		logger.Warningf("Connect %s: wrong address type", target)
-		return &socksproxy.ConnectResponse{
-			Error: socksproxy.ReplyAddressTypeNotSupported,
+	var target string
+	var addr net.IP
+	if req.Hostname == "" {
+		target = net.JoinHostPort(req.Address.String(), fmt.Sprintf("%d", req.Port))
+		if req.Address.To4() == nil {
+			logger.Warningf("Connect %s: wrong address type", target)
+			return &socksproxy.ConnectResponse{
+				Error: socksproxy.ReplyAddressTypeNotSupported,
+			}
 		}
+		addr = req.Address
+	} else {
+		target = net.JoinHostPort(req.Hostname, fmt.Sprintf("%d", req.Port))
+		ip, err := net.ResolveIPAddr("ip", req.Hostname)
+		if err != nil {
+			logger.Warningf("Connect %s: while resolving hostname: %v", target, err)
+			return &socksproxy.ConnectResponse{
+				Error: socksproxy.ReplyAddressTypeNotSupported,
+			}
+		}
+		addr = ip.IP
 	}
 
-	addr := req.Address
 	switchCIDR := net.IPNet{
 		IP:   switchIP.Mask(switchSubnetMask),
 		Mask: switchSubnetMask,