diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java index abc13194900df4f299c6ef7ff832cc7cb564c324..5198e23c1e05057b928f0ab75117d2e30237f31a 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java @@ -123,13 +123,17 @@ class HTTPResponseOutputStream extends FilterOutputStream { } else { for (int j = lastEnd+1; j < i; j++) { if (_headerBuffer.getData()[j] == ':') { - String key = new String(_headerBuffer.getData(), lastEnd+1, j-(lastEnd+1)); - String val = new String(_headerBuffer.getData(), j+2, i-(j+2)); + int keyLen = j-(lastEnd+1); + int valLen = i-(j+2); + if ( (keyLen <= 0) || (valLen <= 0) ) + throw new IOException("Invalid header @ " + j); + String key = new String(_headerBuffer.getData(), lastEnd+1, keyLen); + String val = new String(_headerBuffer.getData(), j+2, valLen); - if ("Connection".equals(key)) { + if ("Connection".equalsIgnoreCase(key)) { out.write("Connection: close\n".getBytes()); connectionSent = true; - } else if ("Proxy-Connection".equals(key)) { + } else if ("Proxy-Connection".equalsIgnoreCase(key)) { out.write("Proxy-Connection: close\n".getBytes()); proxyConnectionSent = true; } else { @@ -185,6 +189,17 @@ class HTTPResponseOutputStream extends FilterOutputStream { String invalid2 = "HTTP/1.1 200 OK"; String invalid3 = "HTTP 200 OK\r\n"; String invalid4 = "HTTP 200 OK\r"; + String invalid5 = "HTTP/1.1 200 OK\r\n" + + "I am broken, and I smell\r\n" + + "\r\n"; + String invalid6 = "HTTP/1.1 200 OK\r\n" + + ":I am broken, and I smell\r\n" + + "\r\n"; + String invalid7 = "HTTP/1.1 200 OK\n" + + "I am broken, and I smell:\n" + + ":asdf\n" + + ":\n" + + "\n"; String large = "HTTP/1.1 200 OK\n" + "Last-modified: Tue, 25 Nov 2003 12:05:38 GMT\n" + "Expires: Tue, 25 Nov 2003 12:05:38 GMT\n" + @@ -192,20 +207,23 @@ class HTTPResponseOutputStream extends FilterOutputStream { "\n" + "hi ho, this is the body"; /* */ - test("Simple", simple); - test("Filtered", filtered); - test("Filtered windows", winfilter); - test("Minimal", minimal); - test("Windows", winmin); - test("Large", large); - test("Invalid (short headers)", invalid1); - test("Invalid (no headers)", invalid2); - test("Invalid (windows with short headers)", invalid3); - test("Invalid (windows no headers)", invalid4); + test("Simple", simple, true); + test("Filtered", filtered, true); + test("Filtered windows", winfilter, true); + test("Minimal", minimal, true); + test("Windows", winmin, true); + test("Large", large, true); + test("Invalid (short headers)", invalid1, true); + test("Invalid (no headers)", invalid2, true); + test("Invalid (windows with short headers)", invalid3, true); + test("Invalid (windows no headers)", invalid4, true); + test("Invalid (bad headers)", invalid5, true); + test("Invalid (bad headers2)", invalid6, false); + test("Invalid (bad headers3)", invalid7, false); /* */ } - private static void test(String name, String orig) { + private static void test(String name, String orig, boolean shouldPass) { System.out.println("====Testing: " + name + "\n" + orig + "\n------------"); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); @@ -215,7 +233,10 @@ class HTTPResponseOutputStream extends FilterOutputStream { String received = new String(baos.toByteArray()); System.out.println(received); } catch (Exception e) { - e.printStackTrace(); + if (shouldPass) + e.printStackTrace(); + else + System.out.println("Properly fails with " + e.getMessage()); } } } \ No newline at end of file diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java index 6f74176ae8e4e264a8491052adf1e3056190876c..2d22b54bcd42ca4035f96c2aed1e01eb01cc3f0b 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java @@ -194,9 +194,10 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix(requestId) + "Line=[" + line + "]"); - if (line.startsWith("Connection: ") || - line.startsWith("Keep-Alive: ") || - line.startsWith("Proxy-Connection: ")) + String lowercaseLine = line.toLowerCase(); + if (lowercaseLine.startsWith("connection: ") || + lowercaseLine.startsWith("keep-alive: ") || + lowercaseLine.startsWith("proxy-connection: ")) continue; if (method == null) { // first line (GET /base64/realaddr) @@ -335,29 +336,29 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable } } else { - if (line.startsWith("Host: ") && !usingWWWProxy) { + if (lowercaseLine.startsWith("host: ") && !usingWWWProxy) { line = "Host: " + host; if (_log.shouldLog(Log.INFO)) _log.info(getPrefix(requestId) + "Setting host = " + host); - } else if (line.startsWith("User-Agent: ")) { + } else if (lowercaseLine.startsWith("user-agent: ")) { // always stripped, added back at the end line = null; continue; - } else if (line.startsWith("Accept")) { + } else if (lowercaseLine.startsWith("accept")) { // strip the accept-blah headers, as they vary dramatically from // browser to browser line = null; continue; - } else if (line.startsWith("Referer: ")) { + } else if (lowercaseLine.startsWith("referer: ")) { // Shouldn't we be more specific, like accepting in-site referers ? //line = "Referer: i2p"; line = null; continue; // completely strip the line - } else if (line.startsWith("Via: ")) { + } else if (lowercaseLine.startsWith("via: ")) { //line = "Via: i2p"; line = null; continue; // completely strip the line - } else if (line.startsWith("From: ")) { + } else if (lowercaseLine.startsWith("from: ")) { //line = "From: i2p"; line = null; continue; // completely strip the line diff --git a/history.txt b/history.txt index d60b90408e8fa11f5e2145f37fd50cb5322c3262..94a385ec46d469959536d245d40589515cd8c7b2 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,8 @@ -$Id: history.txt,v 1.170 2005/03/17 00:29:55 jrandom Exp $ +$Id: history.txt,v 1.171 2005/03/17 17:14:31 jrandom Exp $ + +2005-03-18 jrandom + * Eepproxy Fix for corrupted HTTP headers (thanks nickster!) + * Fixed case sensitivity issues on the HTTP headers (thanks duck!) 2005-03-17 jrandom * Update the old speed calculator and associated profile data points to diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 5106f0782f57d739a7de3de88c9d5712419e6c7e..785810ec30d5342dc5c2aaadd4893e4cea9076b5 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.164 $ $Date: 2005/03/17 00:29:55 $"; + public final static String ID = "$Revision: 1.165 $ $Date: 2005/03/17 17:12:53 $"; public final static String VERSION = "0.5.0.2"; - public final static long BUILD = 5; + public final static long BUILD = 6; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION); System.out.println("Router ID: " + RouterVersion.ID);