From 8e7f05190db698a4d9ffe7b92286b878cce1807d Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Wed, 6 May 2015 10:22:41 -0700 Subject: [PATCH] 466618 - Partial WebSocket Text delivery does not like incomplete UTF8 sequences + Adding implementation of Utf8PartialBuilder to JSR356 Endpoints --- .../jsr356/messages/TextPartialMessage.java | 7 +++++-- .../jsr356/messages/TextPartialOnMessage.java | 16 ++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialMessage.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialMessage.java index 21d06b5d2e5..97689198abf 100644 --- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialMessage.java +++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialMessage.java @@ -24,8 +24,8 @@ import java.nio.ByteBuffer; import javax.websocket.MessageHandler; import javax.websocket.MessageHandler.Partial; -import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.websocket.common.message.MessageAppender; +import org.eclipse.jetty.websocket.common.util.Utf8PartialBuilder; import org.eclipse.jetty.websocket.jsr356.MessageHandlerWrapper; /** @@ -36,19 +36,22 @@ public class TextPartialMessage implements MessageAppender @SuppressWarnings("unused") private final MessageHandlerWrapper msgWrapper; private final MessageHandler.Partial partialHandler; + private final Utf8PartialBuilder utf8Partial; @SuppressWarnings("unchecked") public TextPartialMessage(MessageHandlerWrapper wrapper) { this.msgWrapper = wrapper; this.partialHandler = (Partial)wrapper.getHandler(); + this.utf8Partial = new Utf8PartialBuilder(); } @Override public void appendFrame(ByteBuffer payload, boolean isLast) throws IOException { + String partialText = utf8Partial.toPartialString(payload); // No decoders for Partial messages per JSR-356 (PFD1 spec) - partialHandler.onMessage(BufferUtil.toUTF8String(payload.slice()),isLast); + partialHandler.onMessage(partialText,isLast); } @Override diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialOnMessage.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialOnMessage.java index 4b996fe200b..24fd0bbdebf 100644 --- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialOnMessage.java +++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialOnMessage.java @@ -23,8 +23,8 @@ import java.nio.ByteBuffer; import javax.websocket.OnMessage; -import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.websocket.common.message.MessageAppender; +import org.eclipse.jetty.websocket.common.util.Utf8PartialBuilder; import org.eclipse.jetty.websocket.jsr356.endpoints.JsrAnnotatedEventDriver; /** @@ -33,12 +33,14 @@ import org.eclipse.jetty.websocket.jsr356.endpoints.JsrAnnotatedEventDriver; public class TextPartialOnMessage implements MessageAppender { private final JsrAnnotatedEventDriver driver; + private final Utf8PartialBuilder utf8Partial; private boolean finished; public TextPartialOnMessage(JsrAnnotatedEventDriver driver) { this.driver = driver; this.finished = false; + this.utf8Partial = new Utf8PartialBuilder(); } @Override @@ -48,15 +50,9 @@ public class TextPartialOnMessage implements MessageAppender { throw new IOException("Cannot append to finished buffer"); } - if (payload == null) - { - driver.onPartialTextMessage("",isLast); - } - else - { - String text = BufferUtil.toUTF8String(payload); - driver.onPartialTextMessage(text,isLast); - } + + String text = utf8Partial.toPartialString(payload); + driver.onPartialTextMessage(text,isLast); } @Override