package im.actor.runtime.mtproto; import com.google.j2objc.annotations.ObjectiveCName; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; public class ConnectionEndpointArray extends ArrayList<ConnectionEndpoint> { @NotNull @ObjectiveCName("addEndpoint:") public ConnectionEndpointArray addEndpoint(@NotNull String url) throws UnknownSchemeException { // Manual buggy parsing for GWT // TODO: Correct URL parsing String scheme = url.substring(0, url.indexOf(":")).toLowerCase(); String host = url.substring(url.indexOf("://") + "://".length()); String knownIp = null; if (host.endsWith("/")) { host = host.substring(0, host.length() - 1); } int port = -1; if (host.contains(":")) { String[] parts = host.split(":"); host = parts[0]; port = Integer.parseInt(parts[1]); } if (host.contains("@")) { String[] parts = host.split("@"); host = parts[0]; knownIp = parts[1]; } if (scheme.equals("ssl") || scheme.equals("tls")) { if (port <= 0) { port = 443; } add(new ConnectionEndpoint(host, port, knownIp, ConnectionEndpoint.TYPE_TCP_TLS)); } else if (scheme.equals("tcp")) { if (port <= 0) { port = 80; } add(new ConnectionEndpoint(host, port, knownIp, ConnectionEndpoint.TYPE_TCP)); } else if (scheme.equals("ws")) { if (port <= 0) { port = 80; } add(new ConnectionEndpoint(host, port, knownIp, ConnectionEndpoint.TYPE_WS)); } else if (scheme.equals("wss")) { if (port <= 0) { port = 443; } add(new ConnectionEndpoint(host, port, knownIp, ConnectionEndpoint.TYPE_WS_TLS)); } else { throw new UnknownSchemeException("Unknown scheme type: " + scheme); } return this; } public class UnknownSchemeException extends Exception { public UnknownSchemeException(String message) { super(message); } } }