| 1248 | } |
| 1249 | |
| 1250 | Result HttpWebSocketEndpoint::queueAutomaticControl(HttpWebSocketOpcode opcode, Span<const char> payload) |
| 1251 | { |
| 1252 | SC_TRY_MSG(not hasPendingControlFrame(), "HttpWebSocketEndpoint pending control frame backpressure"); |
| 1253 | |
| 1254 | HttpWebSocketFrameHeaderView header; |
| 1255 | header.opcode = opcode; |
| 1256 | header.fin = true; |
| 1257 | header.payloadLength = payload.sizeInBytes(); |
| 1258 | SC_TRY(applyOutgoingMask(header, automaticMaskKeySet ? automaticMaskKey : nullptr)); |
| 1259 | |
| 1260 | HttpWebSocketFrameWriter controlWriter; |
| 1261 | controlWriter.reset(endpointRole); |
| 1262 | |
| 1263 | Span<const char> encodedHeader; |
| 1264 | SC_TRY(controlWriter.beginFrame(header, automaticControlStorage, encodedHeader)); |
| 1265 | SC_TRY_MSG(sizeof(automaticControlStorage) >= encodedHeader.sizeInBytes() + payload.sizeInBytes(), |
| 1266 | "HttpWebSocketEndpoint automatic control storage too small"); |
| 1267 | if (payload.sizeInBytes() > 0) |
| 1268 | { |
| 1269 | Span<char> destinationPayload = {automaticControlStorage + encodedHeader.sizeInBytes(), payload.sizeInBytes()}; |
| 1270 | ::memcpy(destinationPayload.data(), payload.data(), payload.sizeInBytes()); |
| 1271 | SC_TRY(controlWriter.writePayload(destinationPayload)); |
| 1272 | } |
| 1273 | SC_TRY(controlWriter.finishFrame()); |
| 1274 | |
| 1275 | pendingControlFrame = {automaticControlStorage, encodedHeader.sizeInBytes() + payload.sizeInBytes()}; |
| 1276 | return Result(true); |
| 1277 | } |
| 1278 | |
| 1279 | Result HttpWebSocketConnectionPump::attach(const HttpWebSocketTransportView& newTransport, |
| 1280 | HttpWebSocketEndpointRole endpointRole) |
nothing calls this directly
no test coverage detected