APPLINK-5004; APPLINK-5005 WebSocket big msg fix
authorDmitry Klimenko <DKlimenko@luxoft.com>
Tue, 18 Mar 2014 09:35:46 +0000 (02:35 -0700)
committerJustin Dickow <jjdickow@gmail.com>
Tue, 8 Jul 2014 21:41:54 +0000 (17:41 -0400)
src/thirdPartyLibs/MessageBroker/src/lib_messagebroker/websocket_handler.cpp
src/thirdPartyLibs/MessageBroker/src/server/mb_tcpserver.cpp

index 18a07a1..471e307 100644 (file)
@@ -78,8 +78,9 @@ namespace NsMessageBroker
      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;
@@ -92,7 +93,7 @@ namespace NsMessageBroker
        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) {
@@ -104,12 +105,12 @@ namespace NsMessageBroker
         (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) {
@@ -139,7 +140,7 @@ namespace NsMessageBroker
           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]));
-          forunsigned long i = position; i < position+length; i++)
+          for (unsigned long i = position; i < position+length; i++)
           {
              recBuffer[i] = recBuffer[i] ^ maskKeys[(i-position)%4];
           }
@@ -147,15 +148,15 @@ namespace NsMessageBroker
        DBG_MSG(("CWebSocketHandler::parseWebSocketData()length:%d; size:%d;"
                 " position:%d\n", (int)length, size, position));
 
-       forunsigned 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;
    }
index 506f359..4a96df0 100644 (file)
@@ -66,11 +66,12 @@ namespace NsMessageBroker
       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));
@@ -78,34 +79,27 @@ namespace NsMessageBroker
       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.