X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2FCache.java;h=d97a58a66a13a67751ea94f876e9c36c4f1b6a27;hp=b290756d1bdcb632d22cc66caa7e812cfa26bd9e;hb=13285ff8473a4092bddeed74c953f358ba1671d6;hpb=595dfa7a6a1dc8041b3a5a4fe7ee2fae89029a69 diff --git a/src/be/nikiroo/fanfix/Cache.java b/src/be/nikiroo/fanfix/Cache.java index b290756..d97a58a 100644 --- a/src/be/nikiroo/fanfix/Cache.java +++ b/src/be/nikiroo/fanfix/Cache.java @@ -6,6 +6,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStreamWriter; import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; @@ -15,6 +16,7 @@ import java.net.HttpURLConnection; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; +import java.net.URLEncoder; import java.util.Date; import java.util.Map; import java.util.zip.GZIPInputStream; @@ -84,6 +86,13 @@ public class Cache { CookieHandler.setDefault(cookies); } + /** + * Clear all the cookies currently in the jar. + */ + public void clearCookies() { + cookies.getCookieStore().removeAll(); + } + /** * Open a resource (will load it from the cache if possible, or save it into * the cache after downloading if not). @@ -150,6 +159,112 @@ public class Cache { } } + /** + * Open the given {@link URL} without using the cache, but still using and + * updating the cookies. + * + * @param url + * the {@link URL} to open + * @param support + * the {@link BasicSupport} used for the cookies + * + * @return the {@link InputStream} of the opened page + * + * @throws IOException + * in case of I/O error + */ + public InputStream openNoCache(URL url, BasicSupport support) + throws IOException { + return openNoCache(url, support, url, null); + } + + /** + * Open the given {@link URL} without using the cache, but still using and + * updating the cookies. + * + * @param url + * the {@link URL} to open + * @param support + * the {@link BasicSupport} used for the cookies + * @param postParams + * the POST parameters + * + * @return the {@link InputStream} of the opened page + * + * @throws IOException + * in case of I/O error + */ + public InputStream openNoCache(URL url, BasicSupport support, + Map postParams) throws IOException { + return openNoCache(url, support, url, postParams); + } + + /** + * Open the given {@link URL} without using the cache, but still using and + * updating the cookies. + * + * @param url + * the {@link URL} to open + * @param support + * the {@link BasicSupport} used for the cookies + * @param originalUrl + * the original {@link URL} before any redirection occurs + * @param postParams + * the POST parameters + * + * @return the {@link InputStream} of the opened page + * + * @throws IOException + * in case of I/O error + */ + private InputStream openNoCache(URL url, BasicSupport support, + final URL originalUrl, Map postParams) + throws IOException { + + URLConnection conn = openConnectionWithCookies(url, support); + if (postParams != null && conn instanceof HttpURLConnection) { + StringBuilder postData = new StringBuilder(); + for (Map.Entry param : postParams.entrySet()) { + if (postData.length() != 0) + postData.append('&'); + postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); + postData.append('='); + postData.append(URLEncoder.encode( + String.valueOf(param.getValue()), "UTF-8")); + } + + conn.setDoOutput(true); + ((HttpURLConnection) conn).setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", + "application/x-www-form-urlencoded"); + conn.setRequestProperty("charset", "utf-8"); + + OutputStreamWriter writer = new OutputStreamWriter( + conn.getOutputStream()); + + writer.write(postData.toString()); + writer.flush(); + writer.close(); + } + + conn.connect(); + + // Check if redirect + if (conn instanceof HttpURLConnection + && ((HttpURLConnection) conn).getResponseCode() / 100 == 3) { + String newUrl = conn.getHeaderField("Location"); + return openNoCache(new URL(newUrl), support, originalUrl, + postParams); + } + + InputStream in = conn.getInputStream(); + if ("gzip".equals(conn.getContentEncoding())) { + in = new GZIPInputStream(in); + } + + return in; + } + /** * Refresh the resource into cache if needed. * @@ -295,33 +410,7 @@ public class Cache { */ private void save(URL url, BasicSupport support, URL originalUrl) throws IOException { - URLConnection conn = url.openConnection(); - - conn.setRequestProperty("User-Agent", UA); - conn.setRequestProperty("Cookie", generateCookies(support)); - conn.setRequestProperty("Accept-Encoding", "gzip"); - if (support != null && support.getCurrentReferer() != null) { - conn.setRequestProperty("Referer", support.getCurrentReferer() - .toString()); - conn.setRequestProperty("Host", support.getCurrentReferer() - .getHost()); - } - - conn.connect(); - - // Check if redirect - if (conn instanceof HttpURLConnection - && ((HttpURLConnection) conn).getResponseCode() / 100 == 3) { - String newUrl = conn.getHeaderField("Location"); - save(new URL(newUrl), support, originalUrl); - return; - } - - InputStream in = conn.getInputStream(); - if ("gzip".equals(conn.getContentEncoding())) { - in = new GZIPInputStream(in); - } - + InputStream in = openNoCache(url, support, originalUrl, null); try { File cached = getCached(originalUrl); BufferedOutputStream out = new BufferedOutputStream( @@ -340,6 +429,37 @@ public class Cache { } } + /** + * Open a connection on the given {@link URL}, and manage the cookies that + * come with it. + * + * @param url + * the {@link URL} to open + * @param support + * the {@link BasicSupport} to use for cookie generation + * + * @return the connection + * + * @throws IOException + * in case of I/O error + */ + private URLConnection openConnectionWithCookies(URL url, + BasicSupport support) throws IOException { + URLConnection conn = url.openConnection(); + + conn.setRequestProperty("User-Agent", UA); + conn.setRequestProperty("Cookie", generateCookies(support)); + conn.setRequestProperty("Accept-Encoding", "gzip"); + if (support != null && support.getCurrentReferer() != null) { + conn.setRequestProperty("Referer", support.getCurrentReferer() + .toString()); + conn.setRequestProperty("Host", support.getCurrentReferer() + .getHost()); + } + + return conn; + } + /** * Check if the {@link File} is too old according to * {@link Cache#tooOldChanging}. @@ -409,14 +529,18 @@ public class Cache { } if (support != null) { - for (Map.Entry set : support.getCookies() - .entrySet()) { - if (builder.length() > 0) { - builder.append(';'); + try { + for (Map.Entry set : support.getCookies() + .entrySet()) { + if (builder.length() > 0) { + builder.append(';'); + } + builder.append(set.getKey()); + builder.append('='); + builder.append(set.getValue()); } - builder.append(set.getKey()); - builder.append('='); - builder.append(set.getValue()); + } catch (IOException e) { + Instance.syserr(e); } }