public URI crawl(URI currentLocation, final String needle) throws URISyntaxException, MalformedURLException,
			InterruptedException, ExecutionException {
		String urlContents = downloadContents(currentLocation);
		visitedUrls.add(currentLocation);

		if (urlContents.contains(needle)) {
			return currentLocation;
		} else {
			for (String link : getAllLinks(urlContents)) {
				final URI asUri = normalizeLink(currentLocation, link);
				if (!visitedUrls.contains(asUri) && isInsideDomain(currentLocation, asUri)) {
					URI result = crawl(asUri, needle);
					if (result != null) {
						return result;
					}
				}
			}
		}
		return null;
	}