| 289 | } |
| 290 | |
| 291 | void HttpStreamTransport::writeResponse(const fl::json& response) { |
| 292 | if (!isConnected()) { |
| 293 | return; |
| 294 | } |
| 295 | |
| 296 | // Serialize JSON to string |
| 297 | fl::string jsonStr = response.to_string(); |
| 298 | |
| 299 | // Write chunked data into stack buffer (or heap for large payloads) |
| 300 | size_t needed = ChunkedWriter::chunkOverhead(jsonStr.size()); |
| 301 | u8 stackBuf[512]; |
| 302 | fl::vector<u8> heapBuf; |
| 303 | fl::span<u8> outSpan; |
| 304 | if (needed <= sizeof(stackBuf)) { |
| 305 | outSpan = fl::span<u8>(stackBuf, sizeof(stackBuf)); |
| 306 | } else { |
| 307 | heapBuf.resize(needed); |
| 308 | outSpan = heapBuf; |
| 309 | } |
| 310 | size_t written = mWriter.writeChunk( |
| 311 | fl::span<const u8>(reinterpret_cast<const u8*>(jsonStr.c_str()), jsonStr.size()), // ok reinterpret cast |
| 312 | outSpan |
| 313 | ); |
| 314 | |
| 315 | // Send chunked data |
| 316 | if (written > 0) { |
| 317 | sendData(fl::span<const u8>(outSpan.data(), written)); |
| 318 | } |
| 319 | |
| 320 | // Update last sent time |
| 321 | mLastHeartbeatSent = getCurrentTimeMs(); |
| 322 | } |
| 323 | |
| 324 | void HttpStreamTransport::update(u32 currentTimeMs) { |
| 325 | // Update connection state |
no test coverage detected