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.

This commit is contained in:
ragnarok
2005-07-31 22:19:10 +00:00
committed by zzz
parent fbe42b7dce
commit 8120b0397c
5 changed files with 41 additions and 70 deletions

View File

@@ -24,11 +24,12 @@ package addressbook;
import java.util.Map; import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.net.URL;
import java.net.HttpURLConnection;
import java.io.File; import java.io.File;
import java.io.IOException; 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 * An address book for storing human readable names mapped to base64 i2p
* destinations. AddressBooks can be created from local and remote files, merged * 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 * where key is a human readable name, and value is a base64 i2p
* destination. * destination.
*/ */
public AddressBook(URL url) { public AddressBook(String url, String proxyHost, int proxyPort) {
this.location = url.getHost(); this.location = url;
try { 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) { } catch (IOException exp) {
this.addresses = new HashMap(); this.addresses = new HashMap();
} }
@@ -83,41 +89,17 @@ public class AddressBook {
* @param subscription * @param subscription
* A Subscription instance pointing at a remote address book. * 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(); this.location = subscription.getLocation();
try { try {
// EepGet get = new EepGet(I2PAppContext.getGlobalContext(), true, ) EepGet get = new EepGet(I2PAppContext.getGlobalContext(), true,
URL url = new URL(subscription.getLocation()); proxyHost, proxyPort, 2, "addressbook.tmp",
HttpURLConnection connection = (HttpURLConnection) url subscription.getLocation(), true, subscription.getEtag());
.openConnection(); get.fetch();
if (subscription.getEtag() != null) { this.addresses = ConfigParser.parse("addressbook.tmp");
connection.addRequestProperty("If-None-Match", subscription subscription.setEtag(get.getETag());
.getEtag()); new File("addressbook.tmp").delete();
}
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()));
} catch (IOException exp) { } catch (IOException exp) {
this.addresses = new HashMap(); this.addresses = new HashMap();
} }

View File

@@ -27,7 +27,6 @@ import java.util.List;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Iterator; import java.util.Iterator;
import java.io.*; import java.io.*;
import java.net.URL;
/** /**
* Utility class providing methods to parse and write files in config file * Utility class providing methods to parse and write files in config file
@@ -86,24 +85,6 @@ public class ConfigParser {
return result; 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 * Return a Map using the contents of the File file. See parseBufferedReader
* for details of the input format. * for details of the input format.

View File

@@ -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"); 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, 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); Log log = new Log(logFile);
Daemon.update(master, router, published, subscriptions, log); Daemon.update(master, router, published, subscriptions, log);
@@ -154,11 +155,6 @@ public class Daemon {
while (true) { while (true) {
settings = ConfigParser.parse(settingsFile, defaultSettings); 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")); long delay = Long.parseLong((String) settings.get("update_delay"));
if (delay < 1) { if (delay < 1) {
delay = 1; delay = 1;

View File

@@ -33,6 +33,8 @@ import java.util.List;
public class SubscriptionIterator implements Iterator { public class SubscriptionIterator implements Iterator {
private Iterator subIterator; private Iterator subIterator;
private String proxyHost;
private int proxyPort;
/** /**
* Construct a SubscriptionIterator using the Subscriprions in List subscriptions. * Construct a SubscriptionIterator using the Subscriprions in List subscriptions.
@@ -40,8 +42,10 @@ public class SubscriptionIterator implements Iterator {
* @param subscriptions * @param subscriptions
* List of Subscription objects that represent address books. * 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.subIterator = subscriptions.iterator();
this.proxyHost = proxyHost;
this.proxyPort = proxyPort;
} }
@@ -49,15 +53,15 @@ public class SubscriptionIterator implements Iterator {
* @see java.util.Iterator#hasNext() * @see java.util.Iterator#hasNext()
*/ */
public boolean hasNext() { public boolean hasNext() {
return subIterator.hasNext(); return this.subIterator.hasNext();
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see java.util.Iterator#next() * @see java.util.Iterator#next()
*/ */
public Object next() { public Object next() {
Subscription sub = (Subscription) subIterator.next(); Subscription sub = (Subscription) this.subIterator.next();
return new AddressBook(sub); return new AddressBook(sub, this.proxyHost, this.proxyPort);
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -42,6 +42,10 @@ public class SubscriptionList {
private File etagsFile; private File etagsFile;
private File lastModifiedFile; private File lastModifiedFile;
private String proxyHost;
private int proxyPort;
/** /**
* Construct a SubscriptionList using the urls from locationsFile and, if * 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". * GET. The file is in the format "url=leastmodified".
*/ */
public SubscriptionList(File locationsFile, File etagsFile, public SubscriptionList(File locationsFile, File etagsFile,
File lastModifiedFile, List defaultSubs) { File lastModifiedFile, List defaultSubs, String proxyHost,
int proxyPort) {
this.subscriptions = new LinkedList(); this.subscriptions = new LinkedList();
this.etagsFile = etagsFile; this.etagsFile = etagsFile;
this.lastModifiedFile = lastModifiedFile; this.lastModifiedFile = lastModifiedFile;
this.proxyHost = proxyHost;
this.proxyPort = proxyPort;
List locations; List locations;
Map etags; Map etags;
Map lastModified; Map lastModified;
@@ -80,7 +87,7 @@ public class SubscriptionList {
Iterator iter = locations.iterator(); Iterator iter = locations.iterator();
while (iter.hasNext()) { while (iter.hasNext()) {
location = (String) iter.next(); 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))); .get(location), (String) lastModified.get(location)));
} }
@@ -94,7 +101,8 @@ public class SubscriptionList {
* @return A SubscriptionIterator. * @return A SubscriptionIterator.
*/ */
public SubscriptionIterator iterator() { public SubscriptionIterator iterator() {
return new SubscriptionIterator(this.subscriptions); return new SubscriptionIterator(this.subscriptions, this.proxyHost,
this.proxyPort);
} }
/** /**