forked from I2P_Developers/i2p.i2p
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:
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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.
|
||||||
|
@@ -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;
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user