diff --git a/apps/i2ptunnel/java/build.xml b/apps/i2ptunnel/java/build.xml
index f50fadd3e..163de6696 100644
--- a/apps/i2ptunnel/java/build.xml
+++ b/apps/i2ptunnel/java/build.xml
@@ -141,6 +141,52 @@
splitindex="true"
windowtitle="I2PTunnel" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
index 938a1ebcc..4e8fdf6c9 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
@@ -365,7 +365,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
}
}
- private static String formatHeaders(Map> headers, StringBuilder command) {
+ protected static String formatHeaders(Map> headers, StringBuilder command) {
StringBuilder buf = new StringBuilder(command.length() + headers.size() * 64);
buf.append(command.toString().trim()).append("\r\n");
for (Iterator iter = headers.keySet().iterator(); iter.hasNext(); ) {
@@ -418,7 +418,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
}
}
- private static Map> readHeaders(InputStream in, StringBuilder command, String[] skipHeaders, I2PAppContext ctx) throws IOException {
+ protected static Map> readHeaders(InputStream in, StringBuilder command, String[] skipHeaders, I2PAppContext ctx) throws IOException {
HashMap> headers = new HashMap>();
StringBuilder buf = new StringBuilder(128);
diff --git a/apps/i2ptunnel/java/test/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java b/apps/i2ptunnel/java/test/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java
new file mode 100644
index 000000000..8cd7cf322
--- /dev/null
+++ b/apps/i2ptunnel/java/test/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java
@@ -0,0 +1,61 @@
+package net.i2p.i2ptunnel;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.util.Map;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class I2PTunnelHTTPServerTest extends TestCase {
+
+ public InputStream fillInputStream(String headers) throws IOException {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(baos));
+ bw.write(headers);
+ bw.flush();
+ byte[] bytes = baos.toByteArray();
+ return new ByteArrayInputStream(bytes);
+ }
+
+ public void testSimpleHeader() throws IOException {
+ String headerString = "GET /blah HTTP/1.1\r\n";
+ headerString += "BLAH: something\r\n";
+ headerString += "\r\n";
+ InputStream in = fillInputStream(headerString);
+ Map> headers = I2PTunnelHTTPServer.readHeaders(in, new StringBuilder(128), new String[0], null);
+ assertEquals(headers.size(), 1); //One header
+ }
+
+ public void testDuplicateHeader() throws IOException {
+ String headerString = "GET /something HTTP/1.1\r\n";
+ headerString += "someHeader: blabla bla bloooo\r\n";
+ headerString += "someHeader: oh my, duplication!\r\n";
+ headerString += "\r\n";
+ InputStream in = fillInputStream(headerString);
+ Map> headers = I2PTunnelHTTPServer.readHeaders(in, new StringBuilder(128), new String[0], null);
+ assertEquals(headers.size(), 1);
+ assertEquals(headers.get("someHeader").size(), 2);
+ }
+
+ public void testDuplicateHeadersFormat() throws IOException {
+ String headerString = "GET /something HTTP/1.1\r\n";
+ headerString += "abc: def\r\n";
+ headerString += "abc: blaaah\r\n";
+ headerString += "manamana: toe toe toedoedoe\r\n";
+ headerString += "\r\n";
+ InputStream in = fillInputStream(headerString);
+ StringBuilder builder = new StringBuilder(128);
+ Map> headers = I2PTunnelHTTPServer.readHeaders(in, builder, new String[0], null);
+ String result = I2PTunnelHTTPServer.formatHeaders(headers, builder);
+ int first = result.indexOf("abc");
+ assertTrue(first >= 0);
+ int second = result.indexOf("abc", first);
+ assertTrue(second >= 0);
+ }
+
+}