61 const std::string& payload = frame.payload();
62 const std::size_t payload_len = payload.size();
65 std::uint8_t byte0 = 0;
66 if (frame.fin()) byte0 |= 0x80;
67 if (frame.rsv1()) byte0 |= 0x40;
68 if (frame.rsv2()) byte0 |= 0x20;
69 if (frame.rsv3()) byte0 |= 0x10;
70 byte0 |=
static_cast<std::uint8_t
>(frame.opcode() & 0x0F);
71 out.push_back(
static_cast<char>(byte0));
74 const std::uint32_t length_form = ResolveLengthForm(frame.length_form(), payload_len);
75 std::uint8_t byte1 = frame.masked() ? 0x80 : 0x00;
76 switch (length_form) {
82 byte1 |=
static_cast<std::uint8_t
>(payload_len & 0x7F);
83 out.push_back(
static_cast<char>(byte1));
87 out.push_back(
static_cast<char>(byte1));
88 AppendBigEndian(&out,
static_cast<std::uint64_t
>(payload_len & 0xFFFF), 2);
93 out.push_back(
static_cast<char>(byte1));
94 AppendBigEndian(&out,
static_cast<std::uint64_t
>(payload_len), 8);
102 if (frame.masked()) {
103 const std::uint32_t key = frame.mask_key();
104 std::uint8_t key_bytes[4] = {
105 static_cast<std::uint8_t
>((key >> 24) & 0xFF),
106 static_cast<std::uint8_t
>((key >> 16) & 0xFF),
107 static_cast<std::uint8_t
>((key >> 8) & 0xFF),
108 static_cast<std::uint8_t
>(key & 0xFF),
110 for (
unsigned char b : key_bytes) {
111 out.push_back(
static_cast<char>(b));
113 out.reserve(out.size() + payload_len);
114 for (std::size_t i = 0; i < payload_len; ++i) {
115 out.push_back(
static_cast<char>(
static_cast<std::uint8_t
>(payload[i]) ^ key_bytes[i & 0x3]));