summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rw-r--r--java/src/Ice/src/main/java/Ice/ConnectionI.java13
-rw-r--r--java/src/Ice/src/main/java/IceInternal/WSTransceiver.java52
2 files changed, 47 insertions, 18 deletions
diff --git a/java/src/Ice/src/main/java/Ice/ConnectionI.java b/java/src/Ice/src/main/java/Ice/ConnectionI.java
index 9e465d33e2f..ae274cbc1a6 100644
--- a/java/src/Ice/src/main/java/Ice/ConnectionI.java
+++ b/java/src/Ice/src/main/java/Ice/ConnectionI.java
@@ -1458,6 +1458,19 @@ public final class ConnectionI extends IceInternal.EventHandler
s.append(_endpoint.protocol());
s.append(" connection\n");
s.append(toString());
+
+ //
+ // Trace the cause of unexpected connection closures
+ //
+ if(!(_exception instanceof CloseConnectionException ||
+ _exception instanceof ForcedCloseConnectionException ||
+ _exception instanceof ConnectionTimeoutException ||
+ _exception instanceof CommunicatorDestroyedException ||
+ _exception instanceof ObjectAdapterDeactivatedException))
+ {
+ s.append("\n");
+ s.append(_exception);
+ }
_instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString());
}
}
diff --git a/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java b/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java
index 7451d818389..81c29a3916e 100644
--- a/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java
+++ b/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java
@@ -404,7 +404,7 @@ final class WSTransceiver implements Transceiver
if(buf.b.remaining() > readSz)
{
int size = buf.size();
- buf.resize(readSz, true);
+ buf.resize(buf.b.position() + readSz, true);
s = _delegate.read(buf, moreData);
buf.resize(size, true);
}
@@ -534,7 +534,7 @@ final class WSTransceiver implements Transceiver
_readState = ReadStateOpcode;
_readBuffer = new Buffer(false, java.nio.ByteOrder.BIG_ENDIAN); // Use network byte order.
_readBufferSize = 1024;
- _readLastFrame = false;
+ _readLastFrame = true;
_readOpCode = 0;
_readHeaderLength = 0;
_readPayloadLength = 0;
@@ -819,9 +819,30 @@ final class WSTransceiver implements Transceiver
{
ch += 256;
}
- _readLastFrame = (ch & FLAG_FINAL) == FLAG_FINAL;
_readOpCode = ch & 0xf;
+ //
+ // Remember if last frame if we're going to read a data or
+ // continuation frame, this is only for protocol
+ // correctness checking purpose.
+ //
+ if(_readOpCode == OP_DATA)
+ {
+ if(!_readLastFrame)
+ {
+ throw new Ice.ProtocolException("invalid data frame, no FIN on previous frame");
+ }
+ _readLastFrame = (ch & FLAG_FINAL) == FLAG_FINAL;
+ }
+ else if(_readOpCode == OP_CONT)
+ {
+ if(_readLastFrame)
+ {
+ throw new Ice.ProtocolException("invalid continuation frame, previous frame FIN set");
+ }
+ _readLastFrame = (ch & FLAG_FINAL) == FLAG_FINAL;
+ }
+
ch = _readBuffer.b.get(_readBufferPos++);
if(ch < 0)
{
@@ -910,34 +931,27 @@ final class WSTransceiver implements Transceiver
switch(_readOpCode)
{
- case OP_CONT: // Continuation frame
- {
- // TODO: Add support for continuation frames?
- throw new Ice.ProtocolException("continuation frames not supported");
- }
case OP_TEXT: // Text frame
{
throw new Ice.ProtocolException("text frames not supported");
}
+ case OP_CONT: // Continuation frame
case OP_DATA: // Data frame
{
if(_instance.traceLevel() >= 2)
{
- _instance.logger().trace(
- _instance.traceCategory(),
- "received " + protocol() + " data frame with payload length of " + _readPayloadLength +
- " bytes\n" + toString());
+ _instance.logger().trace(_instance.traceCategory(), "received " + protocol() +
+ (_readOpCode == OP_DATA ? " data" : " continuation") +
+ " frame with payload length of " + _readPayloadLength + " bytes\n" +
+ toString());
}
- if(!_readLastFrame)
- {
- throw new Ice.ProtocolException("continuation frames not supported");
- }
if(_readPayloadLength <= 0)
{
throw new Ice.ProtocolException("payload length is 0");
}
_readState = ReadStatePayload;
+ _readFrameStart = buf.b.position();
break;
}
case OP_CLOSE: // Connection close
@@ -1111,16 +1125,17 @@ final class WSTransceiver implements Transceiver
if(buf.b.hasArray())
{
byte[] arr = buf.b.array();
+ int offset = buf.b.arrayOffset();
for(int n = _readStart; n < pos; ++n)
{
- arr[n] = (byte)(arr[n] ^ _readMask[n % 4]);
+ arr[n + offset] = (byte)(arr[n + offset] ^ _readMask[(n - _readFrameStart) % 4]);
}
}
else
{
for(int n = _readStart; n < pos; ++n)
{
- final byte b = (byte)(buf.b.get(n) ^ _readMask[n % 4]);
+ final byte b = (byte)(buf.b.get(n) ^ _readMask[(n - _readFrameStart) % 4]);
buf.b.put(n, b);
}
}
@@ -1495,6 +1510,7 @@ final class WSTransceiver implements Transceiver
private int _readHeaderLength;
private int _readPayloadLength;
private int _readStart;
+ private int _readFrameStart;
private byte[] _readMask;
private static final int WriteStateHeader = 0;