package org.properssl.sslcertx.mariadb.jdbc; public class HostAddress { public String host; public int port; /** * parse - parse server addresses from the URL fragment * @param spec - list of endpoints in one of the forms * 1 - host1,....,hostN:port (missing port default to MySQL default 3306 * 2 - host:port,...,host:port * @return parsed endpoints */ public static HostAddress[] parse(String spec) { String[] tokens = spec.split(","); HostAddress[] arr = new HostAddress[tokens.length]; for (int i=0; i < tokens.length; i++) { arr[i] = parseSingleHostAddress(tokens[i]); } int defaultPort = arr[arr.length-1].port; if (defaultPort == 0) { defaultPort = 3306; } for (int i = 0; i < arr.length; i++) { if (arr[i].port == 0) { arr[i].port = defaultPort; } } return arr; } static HostAddress parseSingleHostAddress(String s) { HostAddress result = new HostAddress(); if (s.startsWith("[")) { /* IPv6 addresses in URLs are enclosed in square brackets */ int ind = s.indexOf(']'); result.host = s.substring(1,ind); if (ind != (s.length() -1) && s.charAt(ind + 1) == ':') { result.port = Integer.parseInt(s.substring(ind+2)); } } else if (s.contains(":")) { /* Parse host:port */ String[] hostPort = s.split(":"); result.host = hostPort[0]; result.port = Integer.parseInt(hostPort[1]); } else { /* Just host name is given */ result.host = s; } return result; } public static String toString(HostAddress[] addrs) { String s=""; for(int i=0; i < addrs.length; i++) { boolean isIPv6 = addrs[i].host != null && addrs[i].host.contains(":"); String host = (isIPv6)?("[" + addrs[i].host + "]"):addrs[i].host; s += host + ":" + addrs[i].port; if (i < addrs.length -1) s += ","; } return s; } }