summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2014-11-27 18:01:55 +0100
committerBenoit Foucher <benoit@zeroc.com>2014-11-27 18:01:55 +0100
commit3f13e098c6614993e396f0a30192a1733754dfdd (patch)
treeefa9817f0c7a1bd7ddcc5edc7ac2dc2dbfbb8e50 /cpp
parentFixed (ICE-6025) - allDemos.py does not work on Windows (diff)
downloadice-3f13e098c6614993e396f0a30192a1733754dfdd.tar.bz2
ice-3f13e098c6614993e396f0a30192a1733754dfdd.tar.xz
ice-3f13e098c6614993e396f0a30192a1733754dfdd.zip
Fixes for ICE-5984 & ICE-5965: binding test warwnings with WS
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/Ice/WSTransceiver.cpp73
1 files changed, 35 insertions, 38 deletions
diff --git a/cpp/src/Ice/WSTransceiver.cpp b/cpp/src/Ice/WSTransceiver.cpp
index 4bb0fda7ee7..8e79aa4127d 100644
--- a/cpp/src/Ice/WSTransceiver.cpp
+++ b/cpp/src/Ice/WSTransceiver.cpp
@@ -507,9 +507,8 @@ IceInternal::WSTransceiver::write(Buffer& buf)
{
return s;
}
- }
-
- if(_incoming && !buf.b.empty() && _writeState == WriteStatePayload)
+ }
+ else if(_incoming && !buf.b.empty() && _writeState == WriteStatePayload)
{
SocketOperation s = _delegate->write(buf);
if(s)
@@ -1442,18 +1441,6 @@ IceInternal::WSTransceiver::preWrite(Buffer& buf)
assert(buf.i = buf.b.begin());
prepareWriteHeader(OP_DATA, buf.b.size());
- //
- // For server connections, we use the _writeBuffer only to
- // write the header, the message is sent directly from the
- // message buffer. For client connections, we use the write
- // buffer for both the header and message buffer since we need
- // to mask the message data.
- //
- if(_incoming)
- {
- _writeBuffer.b.resize(_writeBuffer.i - _writeBuffer.b.begin());
- _writeBuffer.i = _writeBuffer.b.begin();
- }
_writeState = WriteStatePayload;
}
else if(_state == StatePingPending)
@@ -1516,33 +1503,43 @@ IceInternal::WSTransceiver::preWrite(Buffer& buf)
//
// For an outgoing connection, each message must be masked with a random
// 32-bit value, so we copy the entire message into the internal buffer
- // for writing.
+ // for writing. For incoming connections, we just copy the start of the
+ // message in the internal buffer after the hedaer. If the message is
+ // larger, the reminder is sent directly from the message buffer to avoid
+ // copying.
//
- // For an incoming connection, we use the internal buffer to hold the
- // frame header, and then write the caller's buffer to avoid copying.
- //
- if(!_incoming)
+
+ if(!_incoming && (_writePayloadLength == 0 || _writeBuffer.i == _writeBuffer.b.end()))
{
- if((_writePayloadLength == 0 || _writeBuffer.i == _writeBuffer.b.end()))
+ if(_writeBuffer.i == _writeBuffer.b.end())
{
- if(_writeBuffer.i == _writeBuffer.b.end())
- {
- _writeBuffer.i = _writeBuffer.b.begin();
- }
-
- size_t n = buf.i - buf.b.begin();
- for(; n < buf.b.size() && _writeBuffer.i < _writeBuffer.b.end(); ++_writeBuffer.i, ++n)
- {
- *_writeBuffer.i = buf.b[n] ^ _writeMask[n % 4];
- }
- _writePayloadLength = n;
-
- if(_writeBuffer.i < _writeBuffer.b.end())
- {
- _writeBuffer.b.resize(_writeBuffer.i - _writeBuffer.b.begin());
- }
_writeBuffer.i = _writeBuffer.b.begin();
}
+
+ size_t n = buf.i - buf.b.begin();
+ for(; n < buf.b.size() && _writeBuffer.i < _writeBuffer.b.end(); ++_writeBuffer.i, ++n)
+ {
+ *_writeBuffer.i = buf.b[n] ^ _writeMask[n % 4];
+ }
+ _writePayloadLength = n;
+ if(_writeBuffer.i < _writeBuffer.b.end())
+ {
+ _writeBuffer.b.resize(_writeBuffer.i - _writeBuffer.b.begin());
+ }
+ _writeBuffer.i = _writeBuffer.b.begin();
+ }
+ else if(_writePayloadLength == 0)
+ {
+ size_t n = min(_writeBuffer.b.end() - _writeBuffer.i, buf.b.end() - buf.i);
+ memcpy(_writeBuffer.i, buf.i, n);
+ _writeBuffer.i += n;
+ buf.i += n;
+ _writePayloadLength = n;
+ if(_writeBuffer.i < _writeBuffer.b.end())
+ {
+ _writeBuffer.b.resize(_writeBuffer.i - _writeBuffer.b.begin());
+ }
+ _writeBuffer.i = _writeBuffer.b.begin();
}
return true;
}
@@ -1612,7 +1609,7 @@ IceInternal::WSTransceiver::postWrite(Buffer& buf)
}
}
- if(!_incoming && _writePayloadLength > 0)
+ if((!_incoming || buf.i == buf.b.begin()) && _writePayloadLength > 0)
{
if(_writeBuffer.i == _writeBuffer.b.end())
{