summaryrefslogtreecommitdiff
path: root/protocols
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2021-04-23 13:09:16 +0300
committerGeorge Hazan <ghazan@miranda.im>2021-04-23 13:09:16 +0300
commitb07aafea58d3af883587fdcadd817f5b1e6ed126 (patch)
tree9c19ca4e8caf6854f8b18b0300d9e553c3c94a43 /protocols
parent933b020956e5795dc58ca277293c4fa25f77751f (diff)
old buggy websocket processing code removed
Diffstat (limited to 'protocols')
-rw-r--r--protocols/WhatsAppWeb/src/proto.h2
-rw-r--r--protocols/WhatsAppWeb/src/server.cpp27
2 files changed, 13 insertions, 16 deletions
diff --git a/protocols/WhatsAppWeb/src/proto.h b/protocols/WhatsAppWeb/src/proto.h
index acbdc00b4b..e184faba67 100644
--- a/protocols/WhatsAppWeb/src/proto.h
+++ b/protocols/WhatsAppWeb/src/proto.h
@@ -106,7 +106,7 @@ class WhatsAppProto : public PROTO<WhatsAppProto>
mir_cs m_csPacketQueue;
OBJLIST<WARequest> m_arPacketQueue;
- bool WSReadPacket(int nBytes, const WSHeader &hdr, MBinBuffer &buf);
+ bool WSReadPacket(const WSHeader &hdr, MBinBuffer &buf);
int WSSend(const CMStringA &str, WA_PKT_HANDLER = nullptr);
void OnLoggedIn(void);
diff --git a/protocols/WhatsAppWeb/src/server.cpp b/protocols/WhatsAppWeb/src/server.cpp
index 14abb5ec33..6ee13e2653 100644
--- a/protocols/WhatsAppWeb/src/server.cpp
+++ b/protocols/WhatsAppWeb/src/server.cpp
@@ -249,9 +249,9 @@ void WhatsAppProto::OnStartSession(const JSONNode &root)
/////////////////////////////////////////////////////////////////////////////////////////
// gateway worker thread
-bool WhatsAppProto::WSReadPacket(int nBytes, const WSHeader &hdr, MBinBuffer &res)
+bool WhatsAppProto::WSReadPacket(const WSHeader &hdr, MBinBuffer &res)
{
- size_t currPacketSize = nBytes - hdr.headerSize;
+ size_t currPacketSize = res.length() - hdr.headerSize;
char buf[1024];
while (currPacketSize < hdr.payloadSize) {
@@ -314,12 +314,11 @@ bool WhatsAppProto::ServerThreadWorker()
WSSend(payload, &WhatsAppProto::OnRestoreSession1);
bool bExit = false;
- int offset = 0;
MBinBuffer netbuf;
while (!bExit && !m_bTerminated) {
unsigned char buf[2048];
- int bufSize = Netlib_Recv(m_hServerConn, (char *)buf + offset, _countof(buf) - offset, MSG_NODUMP);
+ int bufSize = Netlib_Recv(m_hServerConn, (char *)buf, _countof(buf), MSG_NODUMP);
if (bufSize == 0) {
debugLogA("Gateway connection gracefully closed");
break;
@@ -329,20 +328,17 @@ bool WhatsAppProto::ServerThreadWorker()
break;
}
+ netbuf.append(buf, bufSize);
+
WSHeader hdr;
- if (!WebSocket_InitHeader(hdr, buf, bufSize)) {
- offset += bufSize;
+ if (!WebSocket_InitHeader(hdr, netbuf.data(), netbuf.length()))
continue;
- }
- // we have some additional data, not only opcode
- if ((size_t)bufSize > hdr.headerSize) {
- netbuf.append(buf, bufSize);
- if (!WSReadPacket(bufSize, hdr, netbuf))
+ // we lack some data, let's read them
+ if (netbuf.length() < hdr.headerSize + hdr.payloadSize)
+ if (!WSReadPacket(hdr, netbuf))
break;
- }
- offset = 0;
debugLogA("Got packet: buffer = %d, opcode = %d, headerSize = %d, payloadSize = %d, final = %d, masked = %d",
netbuf.length(), hdr.opCode, hdr.headerSize, hdr.payloadSize, hdr.bIsFinal, hdr.bIsMasked);
// Netlib_Dump(m_hServerConn, netbuf.data(), netbuf.length(), false, 0);
@@ -351,7 +347,7 @@ bool WhatsAppProto::ServerThreadWorker()
while (true) {
MBinBuffer currPacket;
currPacket.assign(netbuf.data() + hdr.headerSize, hdr.payloadSize);
- currPacket.append("", 1);
+ currPacket.append("", 1); // add 0 to use strchr safely
const char *start = currPacket.data();
@@ -425,7 +421,8 @@ bool WhatsAppProto::ServerThreadWorker()
break;
}
- debugLogA("Got inner packet: buffer = %d, opcode = %d, headerSize = %d, payloadSize = %d, final = %d, masked = %d", netbuf.length(), hdr.opCode, hdr.headerSize, hdr.payloadSize, hdr.bIsFinal, hdr.bIsMasked);
+ debugLogA("Got inner packet: buffer = %d, opcode = %d, headerSize = %d, payloadSize = %d, final = %d, masked = %d",
+ netbuf.length(), hdr.opCode, hdr.headerSize, hdr.payloadSize, hdr.bIsFinal, hdr.bIsMasked);
}
}