char* recBuffer = Buffer;
unsigned int parsedBufferPosition = 0;
unsigned char position = 0; // current buffer position
+ unsigned int size = b_size;
- while (0 < b_size) {
+ while (0 < size) {
bool fin = ((recBuffer[0] & 0x80) | (recBuffer[0] & 0x01)) == 0x81;
bool rsv1 = (recBuffer[0] & 0x40) == 0x40;
DBG_MSG(("CWebSocketHandler::fin = %d recBuffer[0] = 0x%02X\n"
" parsedlength = %d b_size= %d parsedBufferPosition = %d\n",
fin, recBuffer[0], parsedBufferPosition + position,
- b_size, parsedBufferPosition));
+ size, parsedBufferPosition));
if (false == fin) {
(recBuffer[1] & 0x08) | (recBuffer[1] & 0x04) | (recBuffer[1] & 0x02) |
(recBuffer[1] & 0x01));
- unsigned int size = b_size;
unsigned long length = parseWebSocketDataLength(recBuffer, size);
position = 2;
if (length > size) {
- break;
+ DBG_MSG_ERROR(("Incomplete message"));
+ return b_size;
}
switch(payload) {
DBG_MSG(("CWebSocketHandler::parseWebSocketData()maskKeys[0]:0x%02X;"
" maskKeys[1]:0x%02X; maskKeys[2]:0x%02X; maskKeys[3]:0x%02X\n"
, maskKeys[0], maskKeys[1], maskKeys[2], maskKeys[3]));
- for( unsigned long i = position; i < position+length; i++)
+ for (unsigned long i = position; i < position+length; i++)
{
recBuffer[i] = recBuffer[i] ^ maskKeys[(i-position)%4];
}
DBG_MSG(("CWebSocketHandler::parseWebSocketData()length:%d; size:%d;"
" position:%d\n", (int)length, size, position));
- for( unsigned long i = position; i < size, i < position+length; i++)
+ for (unsigned long i = position; i < size, i < position+length; i++)
{
Buffer[parsedBufferPosition++] = recBuffer[i];
}
recBuffer += length+position;
- b_size -= length+position;
-
+ size -= length+position;
}
+
b_size = parsedBufferPosition;
return b_size;
}
ssize_t nb = -1;
std::string* pReceivingBuffer = getBufferFor(fd);
- //char buf[RECV_BUFFER_LENGTH] = {'\0'};
- char* buf = (char*)calloc(RECV_BUFFER_LENGTH + pReceivingBuffer->size(),sizeof(char));
- DBG_MSG(("Left in pReceivingBuffer: %d : %s\n", pReceivingBuffer->size(),pReceivingBuffer->c_str()));
- memcpy(buf, pReceivingBuffer->c_str(), pReceivingBuffer->size());
- nb = recv(fd, buf+ pReceivingBuffer->size(), MAX_RECV_DATA , 0);
+ std::vector<char> buf(RECV_BUFFER_LENGTH + pReceivingBuffer->size());
+ DBG_MSG(("Left in pReceivingBuffer: %d : %s\n",
+ pReceivingBuffer->size(), pReceivingBuffer->c_str()));
+ buf.assign(pReceivingBuffer->c_str(),
+ pReceivingBuffer->c_str() + pReceivingBuffer->size());
+ nb = recv(fd, &buf[pReceivingBuffer->size()], MAX_RECV_DATA, 0);
DBG_MSG(("Recieved %d from %d\n", nb, fd));
nb += pReceivingBuffer->size();
DBG_MSG(("Recieved with buffer %d from %d\n", nb, fd));
if (nb > 0)
{
unsigned int recieved_data = nb;
- char* data = buf;
- if (isWebSocket(fd))
- {
+ if (isWebSocket(fd)) {
const unsigned int data_length =
- mWebSocketHandler.parseWebSocketDataLength(buf, recieved_data);
+ mWebSocketHandler.parseWebSocketDataLength(&buf[0], recieved_data);
DBG_MSG(("Received %d actual data length %d\n",
- recieved_data, data_length));
- if (data_length > RECV_BUFFER_LENGTH) {
- char buf_tmp[MAX_RECV_BUFFER_LENGTH];
- memset(buf_tmp, 0 , MAX_RECV_BUFFER_LENGTH);
- memcpy(buf_tmp, buf, MAX_RECV_DATA);
- ssize_t recv_data = 0;
- while ((data_length > recieved_data) &&
- (0 < (recv_data =
- recv(fd, buf_tmp + recieved_data, MAX_RECV_DATA, 0)))) {
- recieved_data += recv_data;
- }
- nb = recieved_data;
- data = buf_tmp;
+ recieved_data, data_length));
+
+ if (data_length > recieved_data) {
+ DBG_MSG_ERROR(("Received %d actual data length %d\n",
+ recieved_data, data_length));
+ DBG_MSG_ERROR(("Incomplete message"));
+ *pReceivingBuffer = std::string(&buf[0], nb);
+ return false;
}
- mWebSocketHandler.parseWebSocketData(data, (unsigned int&)nb);
+ mWebSocketHandler.parseWebSocketData(&buf[0], (unsigned int&)nb);
}
- *pReceivingBuffer = std::string(data,nb);
- free(buf);
- DBG_MSG(("pReceivingBuffer before onMessageReceived:%d : %s", pReceivingBuffer->size(), pReceivingBuffer->c_str()));
+ *pReceivingBuffer = std::string(&buf[0], nb);
+ DBG_MSG(("pReceivingBuffer before onMessageReceived:%d : %s",
+ pReceivingBuffer->size(), pReceivingBuffer->c_str()));
// we need to check websocket clients here
if (!checkWebSocketHandShake(fd, pReceivingBuffer))
{//JSON MESSAGE received. Send data in CMessageBroker.