package be.nikiroo.utils;
-import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
private CookieManager cookies;
private TraceHandler tracer = new TraceHandler();
private Cache cache;
+ private boolean offline;
/**
* Create a new {@link Downloader}.
* the User-Agent to use to download the resources -- note that
* some websites require one, some actively blacklist real UAs
* like the one from wget, some whitelist a couple of browsers
- * only (!)
+ * only (!) -- can be NULL
*/
public Downloader(String UA) {
this(UA, null);
* the User-Agent to use to download the resources -- note that
* some websites require one, some actively blacklist real UAs
* like the one from wget, some whitelist a couple of browsers
- * only (!)
+ * only (!) -- can be NULL
* @param cache
* the {@link Cache} to use for all access (can be NULL)
*/
setCache(cache);
}
+
+ /**
+ * This {@link Downloader} is forbidden to try and connect to the network.
+ * <p>
+ * If TRUE, it will only check the cache if any.
+ * <p>
+ * Default is FALSE.
+ *
+ * @return TRUE if offline
+ */
+ public boolean isOffline() {
+ return offline;
+ }
+
+ /**
+ * This {@link Downloader} is forbidden to try and connect to the network.
+ * <p>
+ * If TRUE, it will only check the cache if any.
+ * <p>
+ * Default is FALSE.
+ *
+ * @param offline TRUE for offline, FALSE for online
+ */
+ public void setOffline(boolean offline) {
+ this.offline = offline;
+ }
/**
* The traces handler for this {@link Cache}.
* @return the {@link InputStream} of the opened page
*
* @throws IOException
- * in case of I/O error
+ * in case of I/O error (including offline mode + not in cache)
*/
public InputStream open(URL url, URL currentReferer,
Map<String, String> cookiesValues, Map<String, String> postParams,
* @return the {@link InputStream} of the opened page
*
* @throws IOException
- * in case of I/O error
+ * in case of I/O error (including offline mode + not in cache)
*/
public InputStream open(URL url, URL currentReferer,
Map<String, String> cookiesValues, Map<String, String> postParams,
* @return the {@link InputStream} of the opened page
*
* @throws IOException
- * in case of I/O error
+ * in case of I/O error (including offline mode + not in cache)
*/
public InputStream open(URL url, final URL originalUrl, URL currentReferer,
Map<String, String> cookiesValues, Map<String, String> postParams,
}
}
+ String protocol = originalUrl == null ? null : originalUrl
+ .getProtocol();
+ if (isOffline() && !"file".equalsIgnoreCase(protocol)) {
+ tracer.error("Downloader OFFLINE, cannot proceed to URL: " + url);
+ throw new IOException("Downloader is currently OFFLINE, cannot download: " + url);
+ }
+
tracer.trace("Download: " + url);
URLConnection conn = openConnectionWithCookies(url, currentReferer,
}
if (cache != null) {
- String size = conn.getContentLengthLong() < 0 ? "unknown size"
- : StringUtils.formatNumber(conn.getContentLengthLong())
+ String size = conn.getContentLength() < 0 ? "unknown size"
+ : StringUtils.formatNumber(conn.getContentLength())
+ "bytes";
tracer.trace("Save to cache (" + size + "): " + originalUrl);
try {
}
}
+ if (in == null) {
+ throw new IOException(
+ "Cannot retrieve the file after storing it in the cache (??)");
+ }
+
return in;
} catch (IOException e) {
throw new IOException(String.format(
conn.setRequestProperty("Cookie", cookies);
}
- conn.setRequestProperty("User-Agent", UA);
+ if (UA != null) {
+ conn.setRequestProperty("User-Agent", UA);
+ }
conn.setRequestProperty("Accept-Encoding", "gzip");
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("Charset", "utf-8");