diff --git a/guacamole-common/pom.xml b/guacamole-common/pom.xml
index 514f9140b..051c2c88b 100644
--- a/guacamole-common/pom.xml
+++ b/guacamole-common/pom.xml
@@ -43,6 +43,13 @@
1.6.1
+
+
+ org.apache.commons
+ commons-lang3
+ 3.0.1
+
+
diff --git a/guacamole-common/src/main/java/net/sourceforge/guacamole/io/ReaderGuacamoleReader.java b/guacamole-common/src/main/java/net/sourceforge/guacamole/io/ReaderGuacamoleReader.java
index 96997ac61..a7df9bd22 100644
--- a/guacamole-common/src/main/java/net/sourceforge/guacamole/io/ReaderGuacamoleReader.java
+++ b/guacamole-common/src/main/java/net/sourceforge/guacamole/io/ReaderGuacamoleReader.java
@@ -21,9 +21,13 @@ package net.sourceforge.guacamole.io;
import java.io.IOException;
import java.io.Reader;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
import net.sourceforge.guacamole.GuacamoleException;
import net.sourceforge.guacamole.protocol.GuacamoleInstruction;
import net.sourceforge.guacamole.protocol.GuacamoleInstruction.Operation;
+import org.apache.commons.lang3.ArrayUtils;
/**
* A GuacamoleReader which wraps a standard Java Reader, using that Reader as
@@ -127,54 +131,59 @@ public class ReaderGuacamoleReader implements GuacamoleReader {
// If EOF, return EOF
if (instructionBuffer == null)
return null;
+
+ // Build list of elements
+ LinkedList elements = new LinkedList();
+ while (instructionStart < instructionBuffer.length) {
- // Locate end-of-opcode and end-of-instruction
- int opcodeEnd = -1;
- int instructionEnd = -1;
+ // Find end of length
+ int lengthEnd = ArrayUtils.indexOf(instructionBuffer, '.', instructionStart);
- for (int i=instructionStart; i opcodeEnd)
- args = new String(instructionBuffer, opcodeEnd+1, instructionEnd - opcodeEnd - 1).split(",");
- else
- args = new String[0];
-
+ // Pull opcode off elements list
+ String opcode = elements.removeFirst();
+
// Create instruction
GuacamoleInstruction instruction = new GuacamoleInstruction(
Operation.fromOpcode(opcode),
- args
+ elements.toArray(new String[elements.size()])
);
- // Advance instructionBuffer
- instructionStart = instructionEnd + 1;
+ // Detect end of buffer
if (instructionStart >= instructionBuffer.length)
instructionBuffer = null;
+ // Return parsed instruction
return instruction;
}
diff --git a/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java b/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java
index 3e7a34433..d74cd82ee 100644
--- a/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java
+++ b/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java
@@ -221,7 +221,7 @@ public abstract class GuacamoleTunnelServlet extends HttpServlet {
tunnel.close();
// End-of-instructions marker
- out.write(';');
+ out.write("0.;");
out.flush();
response.flushBuffer();