From 8120b0397cae5006331f666b95d30e2f55f98050 Mon Sep 17 00:00:00 2001 From: ragnarok Date: Sun, 31 Jul 2005 22:19:10 +0000 Subject: [PATCH] Move addressbook off URL and on to EepGet. Should no longer leak dns lookups, but now only supports conditional GET with HTTP 1.1. If that's a big problem, it can be fixed in future. --- .../java/src/addressbook/AddressBook.java | 58 +++++++------------ .../java/src/addressbook/ConfigParser.java | 19 ------ .../java/src/addressbook/Daemon.java | 8 +-- .../src/addressbook/SubscriptionIterator.java | 12 ++-- .../src/addressbook/SubscriptionList.java | 14 ++++- 5 files changed, 41 insertions(+), 70 deletions(-) diff --git a/apps/addressbook/java/src/addressbook/AddressBook.java b/apps/addressbook/java/src/addressbook/AddressBook.java index 93d76ebab..37e05499a 100644 --- a/apps/addressbook/java/src/addressbook/AddressBook.java +++ b/apps/addressbook/java/src/addressbook/AddressBook.java @@ -24,11 +24,12 @@ package addressbook; import java.util.Map; import java.util.HashMap; import java.util.Iterator; -import java.net.URL; -import java.net.HttpURLConnection; import java.io.File; import java.io.IOException; +import net.i2p.I2PAppContext; +import net.i2p.util.EepGet; + /** * An address book for storing human readable names mapped to base64 i2p * destinations. AddressBooks can be created from local and remote files, merged @@ -65,11 +66,16 @@ public class AddressBook { * where key is a human readable name, and value is a base64 i2p * destination. */ - public AddressBook(URL url) { - this.location = url.getHost(); + public AddressBook(String url, String proxyHost, int proxyPort) { + this.location = url; try { - this.addresses = ConfigParser.parse(url); + EepGet get = new EepGet(I2PAppContext.getGlobalContext(), true, + proxyHost, proxyPort, 2, "addressbook.tmp", url, true, + null); + get.fetch(); + this.addresses = ConfigParser.parse("addressbook.tmp"); + new File("addressbook.tmp").delete(); } catch (IOException exp) { this.addresses = new HashMap(); } @@ -83,41 +89,17 @@ public class AddressBook { * @param subscription * A Subscription instance pointing at a remote address book. */ - public AddressBook(Subscription subscription) { + public AddressBook(Subscription subscription, String proxyHost, int proxyPort) { this.location = subscription.getLocation(); - try { -// EepGet get = new EepGet(I2PAppContext.getGlobalContext(), true, ) - URL url = new URL(subscription.getLocation()); - HttpURLConnection connection = (HttpURLConnection) url - .openConnection(); - if (subscription.getEtag() != null) { - connection.addRequestProperty("If-None-Match", subscription - .getEtag()); - } - if (subscription.getLastModified() != null) { - connection.addRequestProperty("If-Modified-Since", subscription - .getLastModified()); - } - connection.connect(); - if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) { - connection.disconnect(); - this.addresses = new HashMap(); - return; - } - if (connection.getHeaderField("ETag") != null) { - subscription.setEtag(connection.getHeaderField("ETag")); - } - if (connection.getHeaderField("Last-Modified") != null) { - subscription.setLastModified(connection - .getHeaderField("Last-Modified")); - } - } catch (IOException exp) { - } - - try { - this.addresses = ConfigParser.parse(new URL(subscription - .getLocation())); + try { + EepGet get = new EepGet(I2PAppContext.getGlobalContext(), true, + proxyHost, proxyPort, 2, "addressbook.tmp", + subscription.getLocation(), true, subscription.getEtag()); + get.fetch(); + this.addresses = ConfigParser.parse("addressbook.tmp"); + subscription.setEtag(get.getETag()); + new File("addressbook.tmp").delete(); } catch (IOException exp) { this.addresses = new HashMap(); } diff --git a/apps/addressbook/java/src/addressbook/ConfigParser.java b/apps/addressbook/java/src/addressbook/ConfigParser.java index c86dea5a9..084f435d9 100644 --- a/apps/addressbook/java/src/addressbook/ConfigParser.java +++ b/apps/addressbook/java/src/addressbook/ConfigParser.java @@ -27,7 +27,6 @@ import java.util.List; import java.util.LinkedList; import java.util.Iterator; import java.io.*; -import java.net.URL; /** * Utility class providing methods to parse and write files in config file @@ -86,24 +85,6 @@ public class ConfigParser { return result; } - /** - * Return a Map using the contents of the file at url. See - * parseBufferedReader for details of the input format. - * - * @param url - * A url pointing to a file to parse. - * @return A Map containing the key, value pairs from url. - * @throws IOException - * if url cannot be read. - */ - public static Map parse(URL url) throws IOException { - InputStream urlStream; - urlStream = url.openConnection().getInputStream(); - BufferedReader input = new BufferedReader(new InputStreamReader( - urlStream)); - return ConfigParser.parse(input); - } - /** * Return a Map using the contents of the File file. See parseBufferedReader * for details of the input format. diff --git a/apps/addressbook/java/src/addressbook/Daemon.java b/apps/addressbook/java/src/addressbook/Daemon.java index 6f7df9f69..72757a569 100644 --- a/apps/addressbook/java/src/addressbook/Daemon.java +++ b/apps/addressbook/java/src/addressbook/Daemon.java @@ -101,7 +101,8 @@ public class Daemon { defaultSubs.add("http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/hosts.txt"); SubscriptionList subscriptions = new SubscriptionList(subscriptionFile, - etagsFile, lastModifiedFile, defaultSubs); + etagsFile, lastModifiedFile, defaultSubs, (String) settings + .get("proxy_host"), Integer.parseInt((String) settings.get("proxy_port"))); Log log = new Log(logFile); Daemon.update(master, router, published, subscriptions, log); @@ -154,11 +155,6 @@ public class Daemon { while (true) { settings = ConfigParser.parse(settingsFile, defaultSettings); - System.setProperty("proxySet", "true"); - System.setProperty("http.proxyHost", (String) settings - .get("proxy_host")); - System.setProperty("http.proxyPort", (String) settings - .get("proxy_port")); long delay = Long.parseLong((String) settings.get("update_delay")); if (delay < 1) { delay = 1; diff --git a/apps/addressbook/java/src/addressbook/SubscriptionIterator.java b/apps/addressbook/java/src/addressbook/SubscriptionIterator.java index fecbb5c32..6ad3c4e3d 100644 --- a/apps/addressbook/java/src/addressbook/SubscriptionIterator.java +++ b/apps/addressbook/java/src/addressbook/SubscriptionIterator.java @@ -33,6 +33,8 @@ import java.util.List; public class SubscriptionIterator implements Iterator { private Iterator subIterator; + private String proxyHost; + private int proxyPort; /** * Construct a SubscriptionIterator using the Subscriprions in List subscriptions. @@ -40,8 +42,10 @@ public class SubscriptionIterator implements Iterator { * @param subscriptions * List of Subscription objects that represent address books. */ - public SubscriptionIterator(List subscriptions) { + public SubscriptionIterator(List subscriptions, String proxyHost, int proxyPort) { this.subIterator = subscriptions.iterator(); + this.proxyHost = proxyHost; + this.proxyPort = proxyPort; } @@ -49,15 +53,15 @@ public class SubscriptionIterator implements Iterator { * @see java.util.Iterator#hasNext() */ public boolean hasNext() { - return subIterator.hasNext(); + return this.subIterator.hasNext(); } /* (non-Javadoc) * @see java.util.Iterator#next() */ public Object next() { - Subscription sub = (Subscription) subIterator.next(); - return new AddressBook(sub); + Subscription sub = (Subscription) this.subIterator.next(); + return new AddressBook(sub, this.proxyHost, this.proxyPort); } /* (non-Javadoc) diff --git a/apps/addressbook/java/src/addressbook/SubscriptionList.java b/apps/addressbook/java/src/addressbook/SubscriptionList.java index a58c96428..12036c54a 100644 --- a/apps/addressbook/java/src/addressbook/SubscriptionList.java +++ b/apps/addressbook/java/src/addressbook/SubscriptionList.java @@ -42,6 +42,10 @@ public class SubscriptionList { private File etagsFile; private File lastModifiedFile; + + private String proxyHost; + + private int proxyPort; /** * Construct a SubscriptionList using the urls from locationsFile and, if @@ -58,10 +62,13 @@ public class SubscriptionList { * GET. The file is in the format "url=leastmodified". */ public SubscriptionList(File locationsFile, File etagsFile, - File lastModifiedFile, List defaultSubs) { + File lastModifiedFile, List defaultSubs, String proxyHost, + int proxyPort) { this.subscriptions = new LinkedList(); this.etagsFile = etagsFile; this.lastModifiedFile = lastModifiedFile; + this.proxyHost = proxyHost; + this.proxyPort = proxyPort; List locations; Map etags; Map lastModified; @@ -80,7 +87,7 @@ public class SubscriptionList { Iterator iter = locations.iterator(); while (iter.hasNext()) { location = (String) iter.next(); - subscriptions.add(new Subscription(location, (String) etags + this.subscriptions.add(new Subscription(location, (String) etags .get(location), (String) lastModified.get(location))); } @@ -94,7 +101,8 @@ public class SubscriptionList { * @return A SubscriptionIterator. */ public SubscriptionIterator iterator() { - return new SubscriptionIterator(this.subscriptions); + return new SubscriptionIterator(this.subscriptions, this.proxyHost, + this.proxyPort); } /**