-
Notifications
You must be signed in to change notification settings - Fork 302
Open
Description
void WebSocket::PrepareSendFrame(uint8_t opcode, bool mask, const void* buffer, size_t size, int status)
{
// Clear the previous WebSocket send buffer
_ws_send_buffer.clear();
// Append WebSocket frame opcode
_ws_send_buffer.push_back(opcode);
// Append WebSocket frame size
if (size <= 125)
_ws_send_buffer.push_back((size & 0xFF) | (mask ? 0x80 : 0));
else if (size <= 65535)
{
_ws_send_buffer.push_back(126 | (mask ? 0x80 : 0));
_ws_send_buffer.push_back((size >> 8) & 0xFF);
_ws_send_buffer.push_back(size & 0xFF);
}
else
{
_ws_send_buffer.push_back(127 | (mask ? 0x80 : 0));
for (int i = 7; i >= 0; --i)
_ws_send_buffer.push_back((size >> (8 * i)) & 0xFF);
}
if (mask)
{
// Append WebSocket frame mask
_ws_send_buffer.push_back(_ws_send_mask[0]);
_ws_send_buffer.push_back(_ws_send_mask[1]);
_ws_send_buffer.push_back(_ws_send_mask[2]);
_ws_send_buffer.push_back(_ws_send_mask[3]);
}
// Resize WebSocket frame buffer
size_t offset = _ws_send_buffer.size();
_ws_send_buffer.resize(offset + size);
// Mask WebSocket frame content
const uint8_t* data = (const uint8_t*)buffer;
for (size_t i = 0; i < size; ++i)
_ws_send_buffer[offset + i] = data[i] ^ _ws_send_mask[i % 4];
}
Metadata
Metadata
Assignees
Labels
No labels