public static synchronized String checkOneLink(URL linkURL) {
		// System.out.printf("LinkChecker.checkLink(%s)%n", linkURL);
		try { 
			final String canonURLString = uc.canonicalize(linkURL.toString());
			if (cache.contains(canonURLString))
				return "(already checked)";
			cache.add(canonURLString);
			linkURL = new URL(canonURLString);

			// Open it; if the open fails we'll likely throw an exception
			URLConnection luf = linkURL.openConnection();
			String proto = linkURL.getProtocol();
			if (proto.equals("http") || proto.equals("https")) {
				HttpURLConnection huf = (HttpURLConnection)luf;
				int response = huf.getResponseCode();
				if (response == -1)
					return "Server error: bad HTTP response";
				if (Utilities.isRedirectCode(response)) {
					String newUrl = huf.getHeaderField("location"); // XXX??
					return "(redirect to " + newUrl + ")" + ' ' + checkOneLink(new URL(newUrl));
				}
				return huf.getResponseCode() + " " + huf.getResponseMessage();
			} else if (proto.equals("file")) {
				// Only useful on localhost
				return "(File; ignored)";
			} else
				return "(non-HTTP; ignored)";
		}
		catch (SocketException e) {
			return "DEAD: " + e.toString();
		}
		catch (IOException e) {
			return "DEAD";
		}
    }