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();