diff --git a/spring-integration-ip-extensions/src/main/java/org/springframework/integration/x/ip/websocket/WebSocketSerializer.java b/spring-integration-ip-extensions/src/main/java/org/springframework/integration/x/ip/websocket/WebSocketSerializer.java index a3cfecd..19dc918 100644 --- a/spring-integration-ip-extensions/src/main/java/org/springframework/integration/x/ip/websocket/WebSocketSerializer.java +++ b/spring-integration-ip-extensions/src/main/java/org/springframework/integration/x/ip/websocket/WebSocketSerializer.java @@ -53,6 +53,12 @@ public class WebSocketSerializer extends AbstractHttpSwitchingDeserializer imple private boolean validateUtf8; + private volatile Boolean streamChecked; + + private volatile boolean nio; + + private volatile DirectFieldAccessor streamAccessor; + public void setServer(boolean server) { this.server = server; } @@ -164,6 +170,11 @@ public class WebSocketSerializer extends AbstractHttpSwitchingDeserializer imple @Override public DataFrame deserialize(InputStream inputStream) throws IOException { + if (this.streamChecked == null) { + this.nio = inputStream.getClass().getName().endsWith("TcpNioConnection$ChannelInputStream"); + this.streamAccessor = new DirectFieldAccessor(inputStream); + this.streamChecked = Boolean.TRUE; + } DataFrame frame = null; BasicState state = this.getState(inputStream); if (state != null) { @@ -205,9 +216,11 @@ public class WebSocketSerializer extends AbstractHttpSwitchingDeserializer imple int maskInx = 0; int rsv = 0; while (!done ) { - bite = inputStream.read() & 0xff; + bite = inputStream.read(); // logger.debug("Read:" + Integer.toHexString(bite)); - bite = checkclosed(bite, inputStream); + if (this.nio) { + bite = checkclosed(bite, inputStream); + } if (bite < 0 && n == 0) { throw new SoftEndOfStreamException("Stream closed between payloads"); } @@ -426,25 +439,26 @@ public class WebSocketSerializer extends AbstractHttpSwitchingDeserializer imple * TODO: workaround for INT-2936 */ private int checkclosed(int bite, InputStream inputStream) { - int theBite = bite; - if (theBite == 0xff) { // possibly a closed stream - String streamClass = inputStream.getClass().getName(); - if (streamClass.endsWith("TcpNioConnection$ChannelInputStream")) { - DirectFieldAccessor dfa = new DirectFieldAccessor(inputStream); - try { - if ((Boolean) dfa.getPropertyValue("isClosed") && - inputStream.available() == 0) { - theBite = -1; - } + if (bite < 0) { // possibly a closed stream + try { + if ((Boolean) streamAccessor.getPropertyValue("isClosed") && + inputStream.available() == 0) { + return -1; } - catch (Exception e) { - if (logger.isDebugEnabled()) { - logger.debug("Failed to check closed", e); - } + else { + return bite & 0xff; } } + catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Failed to check closed", e); + } + return bite; + } + } + else { + return bite; } - return theBite; } private boolean validateUtf8IfNecessary(byte[] buffer, int offset, String data) { diff --git a/spring-integration-ip-extensions/src/test/resources/log4j.xml b/spring-integration-ip-extensions/src/test/resources/log4j.xml index 66d909f..3ac2c28 100644 --- a/spring-integration-ip-extensions/src/test/resources/log4j.xml +++ b/spring-integration-ip-extensions/src/test/resources/log4j.xml @@ -19,6 +19,14 @@ + + + + + + + +