diff --git a/src/main/java/com/github/nkzawa/engineio/client/Socket.java b/src/main/java/com/github/nkzawa/engineio/client/Socket.java index e8689bb..3e04002 100644 --- a/src/main/java/com/github/nkzawa/engineio/client/Socket.java +++ b/src/main/java/com/github/nkzawa/engineio/client/Socket.java @@ -16,7 +16,6 @@ import java.util.*; import java.util.concurrent.*; import java.util.logging.Logger; - public abstract class Socket extends Emitter { private static final Logger logger = Logger.getLogger("engine.io-client:socket"); @@ -520,9 +519,9 @@ public abstract class Socket extends Emitter { opts.secure = "https".equals(uri.getScheme()) || "wss".equals(uri.getScheme()); opts.port = uri.getPort(); - String query = uri.getQuery(); + String query = uri.getRawQuery(); if (query != null) { - opts.query = uri.getQuery(); + opts.query = query; } return opts; diff --git a/src/main/java/com/github/nkzawa/engineio/client/Util.java b/src/main/java/com/github/nkzawa/engineio/client/Util.java index da036c0..581f290 100644 --- a/src/main/java/com/github/nkzawa/engineio/client/Util.java +++ b/src/main/java/com/github/nkzawa/engineio/client/Util.java @@ -15,12 +15,8 @@ public class Util { StringBuilder str = new StringBuilder(); for (Map.Entry entry : obj.entrySet()) { if (str.length() > 0) str.append("&"); - try { - str.append(URLEncoder.encode(entry.getKey(), "UTF-8")).append("=") - .append(URLEncoder.encode(entry.getValue(), "UTF-8")); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } + str.append(encodeURIComponent(entry.getKey())).append("=") + .append(encodeURIComponent(entry.getValue())); } return str.toString(); } @@ -30,14 +26,31 @@ public class Util { String[] pairs = qs.split("&"); for (String _pair : pairs) { String[] pair = _pair.split("="); - try { - qry.put(URLDecoder.decode(pair[0], "UTF-8"), - pair.length > 0 ? URLDecoder.decode(pair[1], "UTF-8") : ""); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - + qry.put(decodeURIComponent(pair[0]), + pair.length > 0 ? decodeURIComponent(pair[1]) : ""); } return qry; } + + public static String encodeURIComponent(String str) { + try { + return URLEncoder.encode(str, "UTF-8") + .replace("+", "%20") + .replace("%21", "!") + .replace("%27", "'") + .replace("%28", "(") + .replace("%29", ")") + .replace("%7E", "~"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + public static String decodeURIComponent(String str) { + try { + return URLDecoder.decode(str, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/test/java/com/github/nkzawa/engineio/client/SocketTest.java b/src/test/java/com/github/nkzawa/engineio/client/SocketTest.java index 6a5365d..8bf9919 100644 --- a/src/test/java/com/github/nkzawa/engineio/client/SocketTest.java +++ b/src/test/java/com/github/nkzawa/engineio/client/SocketTest.java @@ -18,6 +18,7 @@ import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) public class SocketTest { + final static int TIMEOUT = 3000; final static int PORT = 3000; private Process serverProcess; @@ -79,7 +80,7 @@ public class SocketTest { serverService.awaitTermination(3000, TimeUnit.MILLISECONDS); } - @Test + @Test(timeout = TIMEOUT) public void openAndClose() throws URISyntaxException, InterruptedException { final BlockingQueue events = new LinkedBlockingQueue(); @@ -106,7 +107,7 @@ public class SocketTest { assertThat(events.take(), is("onclose")); } - @Test + @Test(timeout = TIMEOUT) public void messages() throws URISyntaxException, InterruptedException { final BlockingQueue events = new LinkedBlockingQueue(); diff --git a/src/test/java/com/github/nkzawa/engineio/client/UtilTest.java b/src/test/java/com/github/nkzawa/engineio/client/UtilTest.java new file mode 100644 index 0000000..68156a3 --- /dev/null +++ b/src/test/java/com/github/nkzawa/engineio/client/UtilTest.java @@ -0,0 +1,50 @@ +package com.github.nkzawa.engineio.client; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +@RunWith(JUnit4.class) +public class UtilTest { + + @Test + public void qs() { + Map obj; + + obj = new HashMap() {{ + put("a", "b"); + }}; + assertThat(Util.qs(obj), is("a=b")); + + obj = new LinkedHashMap() {{ + put("a", "b"); + put("c", "d"); + }}; + assertThat(Util.qs(obj), is("a=b&c=d")); + + obj = new LinkedHashMap() {{ + put("a", "b"); + put("c", "tobi rocks"); + }}; + assertThat(Util.qs(obj), is("a=b&c=tobi%20rocks")); + } + + @Test + public void encodeURIComponent() { + assertThat(Util.encodeURIComponent(" ~'()! "), is("%20~'()!%20")); + assertThat(Util.encodeURIComponent("+:;"), is("%2B%3A%3B")); + } + + @Test + public void decodeURIComponent() { + assertThat(Util.decodeURIComponent("%20%7E%27%28%29%21%20"), is(" ~'()! ")); + assertThat(Util.decodeURIComponent("%2B%3A%3B"), is("+:;")); + } +}