bool WSSession::buildPacket(PacketReader& packet) { if (packet.available()<2) return false; UInt8 type = packet.read8() & 0x0F; UInt8 lengthByte = packet.read8(); UInt32 size=lengthByte&0x7f; if (size==127) { if (packet.available()<8) return false; size = (UInt32)packet.read64(); } else if (size==126) { if (packet.available()<2) return false; size = packet.read16(); } if(lengthByte&0x80) size += 4; if (packet.available()<size) return false; packet.shrink(size); if (lengthByte & 0x80) { shared_ptr<WSUnmasking> pWSUnmasking(new WSUnmasking(invoker, packet.current(),packet.available(), type)); decode<WSUnmasking>(pWSUnmasking); } else { packet.reset(packet.position()-1); *(UInt8*)packet.current() = type; } return true; }