diff --git a/wsclient/src/main/java/org/hpccsystems/ws/client/utils/Connection.java b/wsclient/src/main/java/org/hpccsystems/ws/client/utils/Connection.java
index a28da183d..fb19ac4d1 100644
--- a/wsclient/src/main/java/org/hpccsystems/ws/client/utils/Connection.java
+++ b/wsclient/src/main/java/org/hpccsystems/ws/client/utils/Connection.java
@@ -12,6 +12,8 @@
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -205,6 +207,9 @@ public int hashCode()
private StringBuffer baseUrl;
private StringBuffer uriAndParams;
+ // Note: this pattern is very basic and is only meant to extract hostnames from URLs
+ private final static Pattern URL_HOSTNAME_PATTERN = Pattern.compile("((https?|ftp|file):\\/\\/)?(([\\da-z\\.-_]+)\\.([a-z\\.]{2,6}))(:\\d{2,6})?.*");
+
/** Constant CONNECT_TIMEOUT_PARAM="connecttimeoutmillis"
*/
final static public String CONNECT_TIMEOUT_PARAM = "connecttimeoutmillis";
/** Constant READ_TIMEOUT_PARAM="readtimeoutmillis"
*/
@@ -287,7 +292,27 @@ public static boolean isSslProtocol(String protocol)
*/
public Connection(String connectionstring) throws MalformedURLException
{
- URL theurl = new URL(connectionstring);
+ URL theurl = null;
+ try
+ {
+ theurl = new URL(connectionstring);
+ }
+ catch (MalformedURLException e)
+ {
+ Matcher matcher = URL_HOSTNAME_PATTERN.matcher(connectionstring);
+ if (matcher.matches())
+ {
+ String hostName = matcher.group(3);
+ if (hostName.contains("_"))
+ {
+ throw new MalformedURLException("Invalid URL: Hostname contains invalid underscores: '" + connectionstring + "': " + e.getMessage());
+ }
+ }
+ else
+ {
+ throw e;
+ }
+ }
setProtocol(theurl.getProtocol());