| 1277 | Span<const char> encodedHeader; |
| 1278 | SC_TRY(writer.beginFrame(header, storage, encodedHeader)); |
| 1279 | SC_TRY_MSG(storage.sizeInBytes() >= encodedHeader.sizeInBytes() + payload.sizeInBytes(), |
| 1280 | "HttpWebSocketEndpoint frame storage too small"); |
| 1281 | |
| 1282 | if (payload.sizeInBytes() > 0) |
| 1283 | { |
| 1284 | Span<char> destinationPayload = {storage.data() + encodedHeader.sizeInBytes(), payload.sizeInBytes()}; |
| 1285 | ::memcpy(destinationPayload.data(), payload.data(), payload.sizeInBytes()); |
| 1286 | SC_TRY(writer.writePayload(destinationPayload)); |
| 1287 | } |
| 1288 | SC_TRY(writer.finishFrame()); |
| 1289 | |
| 1290 | encodedFrame = {storage.data(), encodedHeader.sizeInBytes() + payload.sizeInBytes()}; |
| 1291 | return Result(true); |
| 1292 | } |
| 1293 | |
| 1294 | Result HttpWebSocketEndpoint::sendData(HttpWebSocketOpcode opcode, Span<const char> payload, bool fin, |
| 1295 | const uint8_t* maskKey, Span<char> storage, Span<const char>& encodedFrame) |
| 1296 | { |
| 1297 | SC_TRY_MSG(opcode == HttpWebSocketOpcode::Text or opcode == HttpWebSocketOpcode::Binary or |
| 1298 | opcode == HttpWebSocketOpcode::Continuation, |
| 1299 | "HttpWebSocketEndpoint sendData requires a data opcode"); |
| 1300 | HttpWebSocketFrameHeaderView header; |
| 1301 | header.opcode = opcode; |
| 1302 | header.fin = fin; |
| 1303 | header.payloadLength = payload.sizeInBytes(); |
| 1304 | SC_TRY(applyOutgoingMask(header, maskKey)); |
| 1305 | return sendFrame(header, payload, storage, encodedFrame); |
| 1306 | } |
| 1307 | |
| 1308 | Result HttpWebSocketEndpoint::sendPing(Span<const char> payload, const uint8_t* maskKey, Span<char> storage, |
| 1309 | Span<const char>& encodedFrame) |
| 1310 | { |
| 1311 | SC_TRY_MSG(payload.sizeInBytes() <= sizeof(controlPayload), "HttpWebSocketEndpoint ping payload too large"); |
| 1312 | HttpWebSocketFrameHeaderView header; |
| 1313 | header.opcode = HttpWebSocketOpcode::Ping; |
| 1314 | header.fin = true; |
| 1315 | header.payloadLength = payload.sizeInBytes(); |
| 1316 | SC_TRY(applyOutgoingMask(header, maskKey)); |
| 1317 | return sendFrame(header, payload, storage, encodedFrame); |
| 1318 | } |