X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=cadi%2Fclient%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Faaf%2Fcadi%2Flocator%2FDNSLocator.java;h=53782b3469db499e8e6931e85adb1a2d609a4c0d;hb=3ca1b28f07f5a46fbeca439677a98245e50b69ea;hp=1fc4b83e976d9694b8363d575d286209a10028ea;hpb=4b5a7d721d994a49057e9bfb403c7bff1b376660;p=aaf%2Fauthz.git diff --git a/cadi/client/src/main/java/org/onap/aaf/cadi/locator/DNSLocator.java b/cadi/client/src/main/java/org/onap/aaf/cadi/locator/DNSLocator.java index 1fc4b83e..53782b34 100644 --- a/cadi/client/src/main/java/org/onap/aaf/cadi/locator/DNSLocator.java +++ b/cadi/client/src/main/java/org/onap/aaf/cadi/locator/DNSLocator.java @@ -7,9 +7,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -23,30 +23,41 @@ package org.onap.aaf.cadi.locator; import java.io.IOException; import java.net.InetAddress; +//import java.net.InetAddress; import java.net.URI; import java.net.URISyntaxException; +import java.net.UnknownHostException; import org.onap.aaf.cadi.Access; -import org.onap.aaf.cadi.Locator; -import org.onap.aaf.cadi.LocatorException; import org.onap.aaf.cadi.Access.Level; +import org.onap.aaf.cadi.LocatorException; -public class DNSLocator implements Locator { +public class DNSLocator implements SizedLocator { private static enum Status {UNTRIED, OK, INVALID, SLOW}; private static final int CHECK_TIME = 3000; - + private String host, protocol; private Access access; private Host[] hosts; private int startPort, endPort; private String suffix; - + // Added for JUnit Purposes. Force correct responses in odd situations on tests + private final DNSLookup dnsLookup; + + private int size = 1; // initial, until refreshed. + public DNSLocator(Access access, String protocol, String host, String range) { + this(access, protocol, host, range, DNSLookup.dflt); + } + + public DNSLocator(Access access, String protocol, String host, String range, DNSLookup dnsLookup) { this.host = host; this.protocol = protocol; this.access = access; + this.dnsLookup = dnsLookup; + int dash = range.indexOf('-'); - if(dash<0) { + if (dash<0) { startPort = endPort = Integer.parseInt(range); } else { startPort = Integer.parseInt(range.substring(0,dash)); @@ -56,24 +67,33 @@ public class DNSLocator implements Locator { } public DNSLocator(Access access, String aaf_locate) throws LocatorException { + this(access, aaf_locate, DNSLookup.dflt); + } + + public DNSLocator(Access access, String aaf_locate, DNSLookup dnsLookup) throws LocatorException { this.access = access; - if(aaf_locate==null) { + this.dnsLookup = dnsLookup; + if (aaf_locate==null) { throw new LocatorException("Null passed into DNSLocator constructor"); } - int start, port; - if(aaf_locate.startsWith("https:")) { - protocol = "https:"; - start = 9; // https:// - port = 443; - } else if(aaf_locate.startsWith("http:")) { - protocol = "http:"; - start = 8; // http:// - port = 80; + int start, defPort; + if (aaf_locate.startsWith("https://")) { + protocol = "https"; + start = 8; // https:// + defPort = 443; + } else if (aaf_locate.startsWith("http://")) { + protocol = "http"; + start = 7; // http:// + defPort = 80; } else { throw new LocatorException("DNSLocator accepts only https or http protocols. (requested URL " + aaf_locate + ')'); } - - parsePorts(aaf_locate.substring(start), port); + host = parseHostAndPorts(aaf_locate, start, defPort); + refresh(); + } + + public static DNSLocator create(Access access, String url) throws LocatorException { + return new DNSLocator(access, url); } @Override @@ -83,8 +103,8 @@ public class DNSLocator implements Locator { @Override public boolean hasItems() { - for(Host h : hosts) { - if(h.status==Status.OK) { + for (Host h : hosts) { + if (h.status==Status.OK) { return true; } } @@ -100,7 +120,7 @@ public class DNSLocator implements Locator { @Override public Item best() throws LocatorException { // not a good "best" - for(int i=0;i { break; case UNTRIED: try { - if(hosts[i].ia.isReachable(CHECK_TIME)) { + if (hosts[i].ia.isReachable(CHECK_TIME)) { hosts[i].status = Status.OK; return new DLItem(i); } @@ -133,7 +153,7 @@ public class DNSLocator implements Locator { @Override public Item next(Item item) throws LocatorException { DLItem di = (DLItem)item; - if(++di.cnt { @Override public boolean refresh() { try { - InetAddress[] ias = InetAddress.getAllByName(host); + InetAddress[] ias = dnsLookup.getAllByName(host); Host[] temp = new Host[ias.length * (1 + endPort - startPort)]; int cnt = -1; - for(int j=startPort; j<=endPort; ++j) { - for(int i=0;i 0) { + int colon = aaf_locate.indexOf(':',_start); + if (colon > 0) { + host = aaf_locate.substring(_start,colon); start = colon + 1; int left = aaf_locate.indexOf('[', start); - if(left > 0) { + if (left > 0) { int right = aaf_locate.indexOf(']', left + 1); if (right < 0) { throw new LocatorException("Missing closing bracket in DNSLocator constructor. (requested URL " + aaf_locate + ')'); @@ -176,41 +198,71 @@ public class DNSLocator implements Locator { if (dash == (right - 1) || dash == (left + 1)) { throw new LocatorException("Missing ports in brackets in DNSLocator constructor. (requested URL " + aaf_locate + ')'); } - if(dash < 0) { + if (dash < 0) { startPort = endPort = Integer.parseInt(aaf_locate.substring(left + 1, right)); } else { startPort = Integer.parseInt(aaf_locate.substring(left + 1, dash)); endPort = Integer.parseInt(aaf_locate.substring(dash + 1, right)); } - + slash = aaf_locate.indexOf('/', start); + if(slash>=0) { + suffix = aaf_locate.substring(slash); + } + } else { slash = aaf_locate.indexOf('/', start); if (slash == start) { throw new LocatorException("Missing port before '/' in DNSLocator constructor. (requested URL " + aaf_locate + ')'); } - if(slash < 0) { + if (slash < 0) { startPort = endPort = Integer.parseInt(aaf_locate.substring(start)); } else { startPort = endPort = Integer.parseInt(aaf_locate.substring(start, slash)); + suffix = aaf_locate.substring(slash); } } } else { + slash = aaf_locate.indexOf('/', _start); + host = slash<_start?aaf_locate.substring(_start):aaf_locate.substring(_start,slash); startPort = endPort = defaultPort; - } - } + } + return host; + } + + /** + * + * Some ISPs return InetEntries for bogus entries, making JUnit Testing difficult. + * We add this interface to force validly empty responses. + * We don't use Lambda at this point, so we can continue to support JKD 1.7 + * a while longer. + * + */ + public interface DNSLookup { + InetAddress[] getAllByName(String host) throws UnknownHostException; + public static final DNSLookup dflt = new DNSLookup() { + public InetAddress[] getAllByName(String host) throws UnknownHostException { + return InetAddress.getAllByName(host); + } + }; + } + private class Host { private URI uri; private InetAddress ia; private Status status; - + public Host(InetAddress inetAddress, int port, String suffix) throws URISyntaxException { ia = inetAddress; - uri = new URI(protocol,null,inetAddress.getHostAddress(),port,suffix,null,null); + uri = new URI(protocol,null,inetAddress.getCanonicalHostName(),port,suffix,null,null); status = Status.UNTRIED; } + + public String toString() { + return uri.toString() + " - " + status.name(); + } } - + private class DLItem implements Item { public DLItem(int i) { cnt = i; @@ -218,6 +270,10 @@ public class DNSLocator implements Locator { private int cnt; } - + public void destroy() {} + + public int size() { + return size; + } }