You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
553 lines
23 KiB
553 lines
23 KiB
// URL.java
|
|
// (C) 2006 by Michael Peter Christen; mc@anomic.de, Frankfurt a. M., Germany
|
|
// first published 13.07.2006 on http://www.anomic.de
|
|
//
|
|
// $LastChangedDate: 2006-04-02 22:40:07 +0200 (So, 02 Apr 2006) $
|
|
// $LastChangedRevision: 1986 $
|
|
// $LastChangedBy: orbiter $
|
|
//
|
|
// LICENSE
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation; either version 2 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
package de.anomic.net;
|
|
|
|
// this class exsist to provide a system-wide normal form representation of urls,
|
|
// and to prevent that java.net.URL usage causes DNS queries which are used in java.net.
|
|
|
|
import java.io.File;
|
|
import java.net.MalformedURLException;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
public class URL {
|
|
|
|
private String protocol, host, userInfo, path, quest, ref;
|
|
private int port;
|
|
|
|
public URL(String url) throws MalformedURLException {
|
|
if (url == null) throw new MalformedURLException("url string is null");
|
|
parseURLString(url);
|
|
}
|
|
|
|
public void parseURLString(String url) throws MalformedURLException {
|
|
// identify protocol
|
|
assert (url != null);
|
|
url = url.trim();
|
|
int p = url.indexOf(':');
|
|
if (p < 0) throw new MalformedURLException("protocol is not given in '" + url + "'");
|
|
this.protocol = url.substring(0, p).toLowerCase().trim();
|
|
if (url.length() < p + 4) throw new MalformedURLException("URL not parseable: '" + url + "'");
|
|
if (url.substring(p + 1, p + 3).equals("//")) {
|
|
// identify host, userInfo and file for http and ftp protocol
|
|
int q = url.indexOf('/', p + 3);
|
|
int r;
|
|
if (q < 0) {
|
|
if ((r = url.indexOf('@', p + 3)) < 0) {
|
|
host = url.substring(p + 3);
|
|
userInfo = null;
|
|
} else {
|
|
host = url.substring(r + 1);
|
|
userInfo = url.substring(p + 3, r);
|
|
}
|
|
path = "/";
|
|
} else {
|
|
host = url.substring(p + 3, q);
|
|
if ((r = host.indexOf('@')) < 0) {
|
|
userInfo = null;
|
|
} else {
|
|
userInfo = host.substring(0, r);
|
|
host = host.substring(r + 1);
|
|
}
|
|
path = url.substring(q);
|
|
}
|
|
|
|
path = resolveBackpath(path);
|
|
identPort(url);
|
|
identRef();
|
|
identQuest();
|
|
escape();
|
|
} else {
|
|
// this is not a http or ftp url
|
|
if (protocol.equals("mailto")) {
|
|
// parse email url
|
|
int q = url.indexOf('@', p + 3);
|
|
if (q < 0) {
|
|
throw new MalformedURLException("wrong email address: " + url);
|
|
} else {
|
|
userInfo = url.substring(p + 1, q);
|
|
host = url.substring(q + 1);
|
|
path = null;
|
|
port = -1;
|
|
quest = null;
|
|
ref = null;
|
|
}
|
|
} else {
|
|
throw new MalformedURLException("unknown protocol: " + url);
|
|
}
|
|
}
|
|
}
|
|
|
|
public URL(File file) throws MalformedURLException {
|
|
this("file", "", -1, file.getAbsolutePath());
|
|
}
|
|
|
|
public URL(URL baseURL, String relPath) throws MalformedURLException {
|
|
if (baseURL == null) throw new MalformedURLException("base URL is null");
|
|
if (relPath == null) throw new MalformedURLException("relPath is null");
|
|
int p = relPath.indexOf(':');
|
|
String relprotocol = (p < 0) ? null : relPath.substring(0, p).toLowerCase();
|
|
if (relprotocol != null && "http.https.ftp.mailto".indexOf(relprotocol) >= 0) {
|
|
parseURLString(relPath);
|
|
} else if (relprotocol == null || relprotocol.equals("javascript")) {
|
|
this.protocol = baseURL.protocol;
|
|
this.host = baseURL.host;
|
|
this.port = baseURL.port;
|
|
this.userInfo = baseURL.userInfo;
|
|
if (relPath.toLowerCase().startsWith("javascript:")) {
|
|
this.path = baseURL.path;
|
|
} else if (relPath.startsWith("/")) {
|
|
this.path = relPath;
|
|
} else if (baseURL.path.endsWith("/")) {
|
|
if (relPath.startsWith("#") || relPath.startsWith("?")) {
|
|
throw new MalformedURLException("relative path malformed: " + relPath);
|
|
} else {
|
|
this.path = baseURL.path + relPath;
|
|
}
|
|
} else {
|
|
if (relPath.startsWith("#") || relPath.startsWith("?")) {
|
|
this.path = baseURL.path + relPath;
|
|
} else {
|
|
int q = baseURL.path.lastIndexOf('/');
|
|
if (q < 0) {
|
|
this.path = relPath;
|
|
} else {
|
|
this.path = baseURL.path.substring(0, q + 1) + relPath;
|
|
}
|
|
}
|
|
}
|
|
this.quest = baseURL.quest;
|
|
this.ref = baseURL.ref;
|
|
|
|
path = resolveBackpath(path);
|
|
identRef();
|
|
identQuest();
|
|
escape();
|
|
} else {
|
|
throw new MalformedURLException("unknown protocol: " + relprotocol);
|
|
}
|
|
}
|
|
|
|
public URL(String protocol, String host, int port, String path) throws MalformedURLException {
|
|
if (protocol == null) throw new MalformedURLException("protocol is null");
|
|
this.protocol = protocol;
|
|
this.host = host;
|
|
this.port = port;
|
|
this.path = path;
|
|
identRef();
|
|
identQuest();
|
|
escape();
|
|
}
|
|
|
|
// resolve '..'
|
|
String resolveBackpath(String path) /* throws MalformedURLException */ {
|
|
/* original version by [MC]
|
|
int p;
|
|
while ((p = path.indexOf("/..")) >= 0) {
|
|
String head = path.substring(0, p);
|
|
int q = head.lastIndexOf('/');
|
|
if (q < 0) throw new MalformedURLException("backpath cannot be resolved in path = " + path);
|
|
path = head.substring(0, q) + path.substring(p + 3);
|
|
}*/
|
|
|
|
/* by [MT] */
|
|
if (path.length() == 0 || path.charAt(0) != '/') { path = "/" + path; }
|
|
|
|
Pattern pathPattern = Pattern.compile("(/[^/]+(?<!/\\.{1,2})/)[.]{2}(?=/|$)|/\\.(?=/)|/(?=/)");
|
|
Matcher matcher = pathPattern.matcher(path);
|
|
while (matcher.find()) {
|
|
path = matcher.replaceAll("");
|
|
matcher.reset(path);
|
|
}
|
|
|
|
/* another version at http://www.yacy-forum.de/viewtopic.php?p=26871#26871 */
|
|
|
|
return path.equals("")?"/":path;
|
|
}
|
|
|
|
/**
|
|
* Escapes the following parts of the url, this object already contains:
|
|
* <ul>
|
|
* <li>path: see {@link: escape(String)}</li>
|
|
* <li>ref: same as above</li>
|
|
* <li>quest: same as above without the ampersand ("&") and the equals symbol</li>
|
|
* </ul>
|
|
*/
|
|
private void escape() {
|
|
if (path != null && path.indexOf('%') == -1) escapePath();
|
|
if (quest != null && quest.indexOf('%') == -1) escapeQuest();
|
|
if (ref != null && ref.indexOf('%') == -1) escapeRef();
|
|
}
|
|
|
|
private void escapePath() {
|
|
String[] pathp = path.split("/", -1);
|
|
String ptmp = "";
|
|
for (int i = 0; i < pathp.length; i++) {
|
|
ptmp += "/" + escape(pathp[i]);
|
|
}
|
|
path = ptmp.substring((ptmp.length() > 0) ? 1 : 0);
|
|
}
|
|
|
|
private void escapeRef() {
|
|
ref = escape(ref);
|
|
}
|
|
|
|
private void escapeQuest() {
|
|
String[] questp = quest.split("&", -1);
|
|
String qtmp = "";
|
|
for (int i = 0; i < questp.length; i++) {
|
|
if (questp[i].indexOf('=') != -1) {
|
|
qtmp += "&" + escape(questp[i].substring(0, questp[i].indexOf('=')));
|
|
qtmp += "=" + escape(questp[i].substring(questp[i].indexOf('=') + 1));
|
|
} else {
|
|
qtmp += "&" + escape(questp[i]);
|
|
}
|
|
}
|
|
quest = qtmp.substring((qtmp.length() > 0) ? 1 : 0);
|
|
}
|
|
|
|
final static String[] hex = {
|
|
"%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
|
|
"%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f",
|
|
"%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
|
|
"%18", "%19", "%1a", "%1b", "%1c", "%1d", "%1e", "%1f",
|
|
"%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27",
|
|
"%28", "%29", "%2a", "%2b", "%2c", "%2d", "%2e", "%2f",
|
|
"%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37",
|
|
"%38", "%39", "%3a", "%3b", "%3c", "%3d", "%3e", "%3f",
|
|
"%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47",
|
|
"%48", "%49", "%4a", "%4b", "%4c", "%4d", "%4e", "%4f",
|
|
"%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57",
|
|
"%58", "%59", "%5a", "%5b", "%5c", "%5d", "%5e", "%5f",
|
|
"%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67",
|
|
"%68", "%69", "%6a", "%6b", "%6c", "%6d", "%6e", "%6f",
|
|
"%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77",
|
|
"%78", "%79", "%7a", "%7b", "%7c", "%7d", "%7e", "%7f",
|
|
"%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
|
|
"%88", "%89", "%8a", "%8b", "%8c", "%8d", "%8e", "%8f",
|
|
"%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
|
|
"%98", "%99", "%9a", "%9b", "%9c", "%9d", "%9e", "%9f",
|
|
"%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
|
|
"%a8", "%a9", "%aa", "%ab", "%ac", "%ad", "%ae", "%af",
|
|
"%b0", "%b1", "%b2", "%b3", "%b4", "%b5", "%b6", "%b7",
|
|
"%b8", "%b9", "%ba", "%bb", "%bc", "%bd", "%be", "%bf",
|
|
"%c0", "%c1", "%c2", "%c3", "%c4", "%c5", "%c6", "%c7",
|
|
"%c8", "%c9", "%ca", "%cb", "%cc", "%cd", "%ce", "%cf",
|
|
"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
|
|
"%d8", "%d9", "%da", "%db", "%dc", "%dd", "%de", "%df",
|
|
"%e0", "%e1", "%e2", "%e3", "%e4", "%e5", "%e6", "%e7",
|
|
"%e8", "%e9", "%ea", "%eb", "%ec", "%ed", "%ee", "%ef",
|
|
"%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
|
|
"%f8", "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff"
|
|
};
|
|
|
|
/**
|
|
* Encode a string to the "x-www-form-urlencoded" form, enhanced
|
|
* with the UTF-8-in-URL proposal. This is what happens:
|
|
*
|
|
* <ul>
|
|
* <li>The ASCII characters 'a' through 'z', 'A' through 'Z',
|
|
* and '0' through '9' remain the same.
|
|
*
|
|
* <li>The unreserved characters - _ . ! ~ * ' ( ) remain the same.
|
|
*
|
|
* <li>All other ASCII characters are converted into the
|
|
* 3-character string "%xy", where xy is
|
|
* the two-digit hexadecimal representation of the character
|
|
* code
|
|
*
|
|
* <li>All non-ASCII characters are encoded in two steps: first
|
|
* to a sequence of 2 or 3 bytes, using the UTF-8 algorithm;
|
|
* secondly each of these bytes is encoded as "%xx".
|
|
* </ul>
|
|
*
|
|
* @param s The string to be encoded
|
|
* @return The encoded string
|
|
*/
|
|
// from: http://www.w3.org/International/URLUTF8Encoder.java
|
|
public static String escape(String s)
|
|
{
|
|
StringBuffer sbuf = new StringBuffer();
|
|
int len = s.length();
|
|
for (int i = 0; i < len; i++) {
|
|
int ch = s.charAt(i);
|
|
if ('A' <= ch && ch <= 'Z') { // 'A'..'Z'
|
|
sbuf.append((char)ch);
|
|
} else if ('a' <= ch && ch <= 'z') { // 'a'..'z'
|
|
sbuf.append((char)ch);
|
|
} else if ('0' <= ch && ch <= '9') { // '0'..'9'
|
|
sbuf.append((char)ch);
|
|
} else if (ch == ' ') { // space
|
|
sbuf.append("%20");
|
|
} else if (ch == '-' || ch == '_' // unreserved
|
|
|| ch == '.' || ch == '!'
|
|
|| ch == '~' || ch == '*'
|
|
|| ch == '\'' || ch == '('
|
|
|| ch == ')') {
|
|
sbuf.append((char)ch);
|
|
} else if (ch <= 0x007f) { // other ASCII
|
|
sbuf.append(hex[ch]);
|
|
} else if (ch <= 0x07FF) { // non-ASCII <= 0x7FF
|
|
sbuf.append(hex[0xc0 | (ch >> 6)]);
|
|
sbuf.append(hex[0x80 | (ch & 0x3F)]);
|
|
} else { // 0x7FF < ch <= 0xFFFF
|
|
sbuf.append(hex[0xe0 | (ch >> 12)]);
|
|
sbuf.append(hex[0x80 | ((ch >> 6) & 0x3F)]);
|
|
sbuf.append(hex[0x80 | (ch & 0x3F)]);
|
|
}
|
|
}
|
|
return sbuf.toString();
|
|
}
|
|
|
|
// from: http://www.w3.org/International/unescape.java
|
|
public static String unescape(String s) {
|
|
StringBuffer sbuf = new StringBuffer();
|
|
int l = s.length();
|
|
int ch = -1;
|
|
int b, sumb = 0;
|
|
for (int i = 0, more = -1; i < l; i++) {
|
|
/* Get next byte b from URL segment s */
|
|
switch (ch = s.charAt(i)) {
|
|
case '%':
|
|
ch = s.charAt(++i) ;
|
|
int hb = (Character.isDigit ((char) ch) ? ch - '0' : 10 + Character.toLowerCase((char) ch) - 'a') & 0xF;
|
|
ch = s.charAt(++i) ;
|
|
int lb = (Character.isDigit ((char) ch) ? ch - '0' : 10 + Character.toLowerCase ((char) ch) - 'a') & 0xF;
|
|
b = (hb << 4) | lb;
|
|
break;
|
|
case '+':
|
|
b = ' ';
|
|
break;
|
|
default:
|
|
b = ch;
|
|
}
|
|
/* Decode byte b as UTF-8, sumb collects incomplete chars */
|
|
if ((b & 0xc0) == 0x80) { // 10xxxxxx (continuation byte)
|
|
sumb = (sumb << 6) | (b & 0x3f) ; // Add 6 bits to sumb
|
|
if (--more == 0) sbuf.append((char) sumb) ; // Add char to sbuf
|
|
} else if ((b & 0x80) == 0x00) { // 0xxxxxxx (yields 7 bits)
|
|
sbuf.append((char) b) ; // Store in sbuf
|
|
} else if ((b & 0xe0) == 0xc0) { // 110xxxxx (yields 5 bits)
|
|
sumb = b & 0x1f;
|
|
more = 1; // Expect 1 more byte
|
|
} else if ((b & 0xf0) == 0xe0) { // 1110xxxx (yields 4 bits)
|
|
sumb = b & 0x0f;
|
|
more = 2; // Expect 2 more bytes
|
|
} else if ((b & 0xf8) == 0xf0) { // 11110xxx (yields 3 bits)
|
|
sumb = b & 0x07;
|
|
more = 3; // Expect 3 more bytes
|
|
} else if ((b & 0xfc) == 0xf8) { // 111110xx (yields 2 bits)
|
|
sumb = b & 0x03;
|
|
more = 4; // Expect 4 more bytes
|
|
} else /*if ((b & 0xfe) == 0xfc)*/ { // 1111110x (yields 1 bit)
|
|
sumb = b & 0x01;
|
|
more = 5; // Expect 5 more bytes
|
|
}
|
|
/* We don't test if the UTF-8 encoding is well-formed */
|
|
}
|
|
return sbuf.toString();
|
|
}
|
|
|
|
private void identPort(String inputURL) throws MalformedURLException {
|
|
// identify ref in file
|
|
int r = this.host.indexOf(':');
|
|
if (r < 0) {
|
|
this.port = -1;
|
|
} else {
|
|
try {
|
|
String portStr = this.host.substring(r + 1);
|
|
if (portStr.trim().length() > 0) this.port = Integer.parseInt(portStr);
|
|
else this.port = -1;
|
|
this.host = this.host.substring(0, r);
|
|
} catch (NumberFormatException e) {
|
|
throw new MalformedURLException("wrong port in host fragment '" + this.host + "' of input url '" + inputURL + "'");
|
|
}
|
|
}
|
|
}
|
|
|
|
private void identRef() {
|
|
// identify ref in file
|
|
int r = path.indexOf('#');
|
|
if (r < 0) {
|
|
this.ref = null;
|
|
} else {
|
|
this.ref = path.substring(r + 1);
|
|
this.path = path.substring(0, r);
|
|
}
|
|
}
|
|
|
|
private void identQuest() {
|
|
// identify quest in file
|
|
int r = path.indexOf('?');
|
|
if (r < 0) {
|
|
this.quest = null;
|
|
} else {
|
|
this.quest = path.substring(r + 1);
|
|
this.path = path.substring(0, r);
|
|
}
|
|
}
|
|
|
|
public String getFile() {
|
|
return getFile(true);
|
|
}
|
|
|
|
public String getFile(boolean includeReference) {
|
|
// this is the path plus quest plus ref
|
|
if (quest != null) return ((includeReference) && (ref != null)) ? path + "?" + quest + "#" + ref : path + "?" + quest;
|
|
return ((includeReference) && (ref != null)) ? path + "#" + ref : path;
|
|
}
|
|
|
|
public String getPath() {
|
|
return path;
|
|
}
|
|
|
|
public String getAuthority() {
|
|
return ((port >= 0) && (host != null)) ? host + ":" + port : ((host != null) ? host : "");
|
|
}
|
|
|
|
public String getHost() {
|
|
return host;
|
|
}
|
|
|
|
public int getPort() {
|
|
return port;
|
|
}
|
|
|
|
public String getProtocol() {
|
|
return protocol;
|
|
}
|
|
|
|
public String getRef() {
|
|
return ref;
|
|
}
|
|
|
|
public String getUserInfo() {
|
|
return userInfo;
|
|
}
|
|
|
|
public String getQuery() {
|
|
return quest;
|
|
}
|
|
|
|
public String toNormalform() {
|
|
return toString(false);
|
|
}
|
|
|
|
public String toString() {
|
|
return toString(true);
|
|
}
|
|
|
|
public String toString(boolean includeReference) {
|
|
// generates a normal form of the URL
|
|
boolean defaultPort = false;
|
|
if (this.protocol.equals("mailto")) {
|
|
return this.protocol + ":" + this.userInfo + "@" + this.host;
|
|
} else if (this.protocol.equals("http")) {
|
|
if (this.port < 0 || this.port == 80) { defaultPort = true; }
|
|
} else if (this.protocol.equals("ftp")) {
|
|
if (this.port < 0 || this.port == 21) { defaultPort = true; }
|
|
} else if (this.protocol.equals("https")) {
|
|
if (this.port < 0 || this.port == 443) { defaultPort = true; }
|
|
}
|
|
String path = resolveBackpath(this.getFile(includeReference));
|
|
|
|
if (defaultPort) {
|
|
return this.protocol + "://" +
|
|
((this.userInfo != null) ? (this.userInfo + "@") : ("")) +
|
|
this.getHost().toLowerCase() + path;
|
|
}
|
|
return this.protocol + "://" +
|
|
((this.userInfo != null) ? (this.userInfo + "@") : ("")) +
|
|
this.getHost().toLowerCase() + ((defaultPort) ? ("") : (":" + this.port)) + path;
|
|
}
|
|
|
|
public boolean equals(URL other) {
|
|
return (((this.protocol == other.protocol) || (this.protocol.equals(other.protocol))) &&
|
|
((this.host == other.host ) || (this.host.equals(other.host))) &&
|
|
((this.userInfo == other.userInfo) || (this.userInfo.equals(other.userInfo))) &&
|
|
((this.path == other.path ) || (this.path.equals(other.path))) &&
|
|
((this.quest == other.quest ) || (this.quest.equals(other.quest))) &&
|
|
((this.ref == other.ref ) || (this.ref.equals(other.ref))) &&
|
|
((this.port == other.port )));
|
|
}
|
|
|
|
public int hashCode() {
|
|
return this.toString().hashCode();
|
|
}
|
|
|
|
public int compareTo(Object h) {
|
|
assert (h instanceof URL);
|
|
return this.toString().compareTo(((URL) h).toString());
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
String[][] test = new String[][]{
|
|
new String[]{null, "http://www.anomic.de/home/test?x=1#home"},
|
|
new String[]{null, "http://www.anomic.de/home/test?x=1"},
|
|
new String[]{null, "http://www.anomic.de/home/test#home"},
|
|
new String[]{null, "ftp://ftp.anomic.de/home/test#home"},
|
|
new String[]{null, "http://www.anomic.de/home/../abc/"},
|
|
new String[]{null, "mailto:abcdefg@nomailnomail.com"},
|
|
new String[]{"http://www.anomic.de/home", "test"},
|
|
new String[]{"http://www.anomic.de/home", "test/"},
|
|
new String[]{"http://www.anomic.de/home/", "test"},
|
|
new String[]{"http://www.anomic.de/home/", "test/"},
|
|
new String[]{"http://www.anomic.de/home/index.html", "test.htm"},
|
|
new String[]{"http://www.anomic.de/home/index.html", "http://www.yacy.net/test"},
|
|
new String[]{"http://www.anomic.de/home/index.html", "ftp://ftp.yacy.net/test"},
|
|
new String[]{"http://www.anomic.de/home/index.html", "../test"},
|
|
new String[]{"http://www.anomic.de/home/index.html", "mailto:abcdefg@nomailnomail.com"},
|
|
new String[]{null, "news:de.test"},
|
|
new String[]{"http://www.anomic.de/home", "news:de.test"},
|
|
new String[]{"http://www.anomic.de/home", "ftp://ftp.anomic.de/src"},
|
|
new String[]{null, "ftp://ftp.delegate.org/"},
|
|
new String[]{"http://www.anomic.de/home", "ftp://ftp.delegate.org/"},
|
|
new String[]{"http://www.anomic.de","mailto:yacy@weltherrschaft.org"},
|
|
new String[]{"http://www.anomic.de","javascipt:temp"}
|
|
};
|
|
String environment, url;
|
|
de.anomic.net.URL aURL = null;
|
|
java.net.URL jURL = null;
|
|
for (int i = 0; i < test.length; i++) {
|
|
environment = test[i][0];
|
|
url = test[i][1];
|
|
if (environment == null) {
|
|
try {aURL = new de.anomic.net.URL(url);} catch (MalformedURLException e) {aURL = null;}
|
|
try {jURL = new java.net.URL(url);} catch (MalformedURLException e) {jURL = null;}
|
|
} else {
|
|
try {aURL = new de.anomic.net.URL(new de.anomic.net.URL(environment), url);} catch (MalformedURLException e) {aURL = null;}
|
|
try {jURL = new java.net.URL(new java.net.URL(environment), url);} catch (MalformedURLException e) {jURL = null;}
|
|
}
|
|
if (((aURL == null) && (jURL != null)) ||
|
|
((aURL != null) && (jURL == null)) ||
|
|
((aURL != null) && (jURL != null) && (!(jURL.toString().equals(aURL.toString()))))) {
|
|
System.out.println("Difference for environment=" + environment + ", url=" + url + ":");
|
|
System.out.println((jURL == null) ? "jURL rejected input" : "jURL=" + jURL.toString());
|
|
System.out.println((aURL == null) ? "aURL rejected input" : "aURL=" + aURL.toString());
|
|
}
|
|
}
|
|
}
|
|
}
|