| 60 | }; |
| 61 | |
| 62 | static SC::Result encodeFrame(SC::HttpWebSocketFrameWriter& writer, const SC::HttpWebSocketFrameHeaderView& header, |
| 63 | SC::Span<char> payload, SC::Span<char> outputStorage, size_t& outputBytes) |
| 64 | { |
| 65 | SC::Span<const char> encodedHeader; |
| 66 | SC_TRY(writer.beginFrame(header, outputStorage, encodedHeader)); |
| 67 | SC_TRY_MSG(outputStorage.sizeInBytes() >= encodedHeader.sizeInBytes() + payload.sizeInBytes(), |
| 68 | "encodeFrame output storage too small"); |
| 69 | |
| 70 | if (payload.sizeInBytes() > 0) |
| 71 | { |
| 72 | SC::Span<char> destinationPayload = {outputStorage.data() + encodedHeader.sizeInBytes(), payload.sizeInBytes()}; |
| 73 | for (size_t idx = 0; idx < payload.sizeInBytes(); ++idx) |
| 74 | { |
| 75 | destinationPayload[idx] = payload[idx]; |
| 76 | } |
| 77 | SC_TRY(writer.writePayload(destinationPayload)); |
| 78 | } |
| 79 | |
| 80 | SC_TRY(writer.finishFrame()); |
| 81 | outputBytes = encodedHeader.sizeInBytes() + payload.sizeInBytes(); |
| 82 | return SC::Result(true); |
| 83 | } |
| 84 | |
| 85 | static SC::Result parseFrameInChunks(SC::HttpWebSocketFrameReader& reader, SC::Span<char> encoded, |
| 86 | const size_t* chunkSizes, size_t numChunkSizes) |
no test coverage detected