private Socket getNewSocket() throws SocketException, IOException {
    if (IMMEDIATELY_DOWNED_HOSTS.contains(this.hostname)) {

      sleepMillisForProperty(this.props, "connectTimeout");

      throw new SocketTimeoutException();
    }

    String hostnameToConnectTo = MAPPED_HOSTS.get(this.hostname);

    if (hostnameToConnectTo == null) {
      hostnameToConnectTo = this.hostname;
    }

    if (NonRegisteringDriver.isHostPropertiesList(hostnameToConnectTo)) {
      Properties hostSpecificProps = NonRegisteringDriver.expandHostKeyValues(hostnameToConnectTo);

      String protocol = hostSpecificProps.getProperty(NonRegisteringDriver.PROTOCOL_PROPERTY_KEY);

      if ("unix".equalsIgnoreCase(protocol)) {
        SocketFactory factory;
        try {
          factory =
              (SocketFactory)
                  Class.forName("org.newsclub.net.mysql.AFUNIXDatabaseSocketFactory").newInstance();
        } catch (InstantiationException e) {
          throw new SocketException(e.getMessage());
        } catch (IllegalAccessException e) {
          throw new SocketException(e.getMessage());
        } catch (ClassNotFoundException e) {
          throw new SocketException(e.getMessage());
        }

        String path = hostSpecificProps.getProperty(NonRegisteringDriver.PATH_PROPERTY_KEY);

        if (path != null) {
          hostSpecificProps.setProperty("junixsocket.file", path);
        }

        return new HangingSocket(
            factory.connect(hostnameToConnectTo, this.portNumber, hostSpecificProps),
            this.props,
            this.hostname);
      }
    }

    return new HangingSocket(
        super.connect(hostnameToConnectTo, this.portNumber, this.props), this.props, this.hostname);
  }