Loading src/httpd.cpp +29 −1 Original line number Diff line number Diff line Loading @@ -770,10 +770,13 @@ bool libhttppp::HttpEvent::Http2RequestEvent(netplus::con &curcon, cureq.h2state().serverPrefaceSent = true; out += h2BuildSettings(); out += h2ConnectionWindowBoost(); std::cerr << "[H2-PREFACE] Sent SETTINGS + connection window boost, out.size=" << out.size() << std::endl; } // Process all complete frames in RecvData reprocess: std::cerr << "[H2-REPROCESS] RecvData.size=" << cureq.RecvData.size() << " off=" << off << std::endl; while (off + H2_FRAME_HEADER_LEN <= cureq.RecvData.size()) { const char *data = cureq.RecvData.data(); uint32_t flen = (static_cast<uint8_t>(data[off]) << 16) | Loading @@ -787,11 +790,17 @@ reprocess: static_cast<uint8_t>(data[off + 8]); if (off + H2_FRAME_HEADER_LEN + flen > cureq.RecvData.size()) { std::cerr << "[H2-FRAME] INCOMPLETE: need " << (off + H2_FRAME_HEADER_LEN + flen) << " have " << cureq.RecvData.size() << std::endl; break; // Incomplete frame, wait for more data } off += H2_FRAME_HEADER_LEN; std::cerr << "[H2-FRAME] type=" << (int)ftype << " flags=0x" << std::hex << (int)fflags << std::dec << " sid=" << sid << " flen=" << flen << std::endl; switch (ftype) { case H2_FRAME_SETTINGS: if (!(fflags & H2_FLAG_ACK)) { Loading Loading @@ -901,6 +910,12 @@ reprocess: if (flen > 0) { out += h2BuildWindowUpdate(sid, flen); out += h2BuildWindowUpdate(0, flen); std::cerr << "[H2-RX-DATA] sid=" << sid << " flen=" << flen << " bodyTotal=" << it->second.body.size() << " outSize=" << out.size() << " END_STREAM=" << ((fflags & H2_FLAG_END_STREAM) ? 1 : 0) << std::endl; } if (fflags & H2_FLAG_END_STREAM) { Loading @@ -919,6 +934,11 @@ reprocess: goto done; } } } else { std::cerr << "[H2-RX-DATA] sid=" << sid << " flen=" << flen << " NOT FOUND in pendingIncoming!" << std::endl; } break; } Loading Loading @@ -995,6 +1015,11 @@ reprocess: } done: std::cerr << "[H2-DONE] out.size=" << out.size() << " SendData.size=" << cureq.SendData.size() << " RecvData.size=" << cureq.RecvData.size() << " off=" << off << std::endl; if (!out.empty()) { // DEBUG: validate H2 frames before writing to SendData { Loading Loading @@ -1033,7 +1058,10 @@ done: // If frames remain in RecvData (e.g. HEADERS that arrived during // streaming), process them now instead of waiting for the next // EPOLLIN which may never fire. if (cureq.RecvData.size() >= H2_FRAME_HEADER_LEN) { // Only reprocess if we actually made progress (consumed frames or // generated output). Otherwise we'd spin forever on an incomplete // frame that needs more network data to arrive. if ((!out.empty() || off > 0) && cureq.RecvData.size() >= H2_FRAME_HEADER_LEN) { out.clear(); out.reserve(4096); off = 0; Loading Loading
src/httpd.cpp +29 −1 Original line number Diff line number Diff line Loading @@ -770,10 +770,13 @@ bool libhttppp::HttpEvent::Http2RequestEvent(netplus::con &curcon, cureq.h2state().serverPrefaceSent = true; out += h2BuildSettings(); out += h2ConnectionWindowBoost(); std::cerr << "[H2-PREFACE] Sent SETTINGS + connection window boost, out.size=" << out.size() << std::endl; } // Process all complete frames in RecvData reprocess: std::cerr << "[H2-REPROCESS] RecvData.size=" << cureq.RecvData.size() << " off=" << off << std::endl; while (off + H2_FRAME_HEADER_LEN <= cureq.RecvData.size()) { const char *data = cureq.RecvData.data(); uint32_t flen = (static_cast<uint8_t>(data[off]) << 16) | Loading @@ -787,11 +790,17 @@ reprocess: static_cast<uint8_t>(data[off + 8]); if (off + H2_FRAME_HEADER_LEN + flen > cureq.RecvData.size()) { std::cerr << "[H2-FRAME] INCOMPLETE: need " << (off + H2_FRAME_HEADER_LEN + flen) << " have " << cureq.RecvData.size() << std::endl; break; // Incomplete frame, wait for more data } off += H2_FRAME_HEADER_LEN; std::cerr << "[H2-FRAME] type=" << (int)ftype << " flags=0x" << std::hex << (int)fflags << std::dec << " sid=" << sid << " flen=" << flen << std::endl; switch (ftype) { case H2_FRAME_SETTINGS: if (!(fflags & H2_FLAG_ACK)) { Loading Loading @@ -901,6 +910,12 @@ reprocess: if (flen > 0) { out += h2BuildWindowUpdate(sid, flen); out += h2BuildWindowUpdate(0, flen); std::cerr << "[H2-RX-DATA] sid=" << sid << " flen=" << flen << " bodyTotal=" << it->second.body.size() << " outSize=" << out.size() << " END_STREAM=" << ((fflags & H2_FLAG_END_STREAM) ? 1 : 0) << std::endl; } if (fflags & H2_FLAG_END_STREAM) { Loading @@ -919,6 +934,11 @@ reprocess: goto done; } } } else { std::cerr << "[H2-RX-DATA] sid=" << sid << " flen=" << flen << " NOT FOUND in pendingIncoming!" << std::endl; } break; } Loading Loading @@ -995,6 +1015,11 @@ reprocess: } done: std::cerr << "[H2-DONE] out.size=" << out.size() << " SendData.size=" << cureq.SendData.size() << " RecvData.size=" << cureq.RecvData.size() << " off=" << off << std::endl; if (!out.empty()) { // DEBUG: validate H2 frames before writing to SendData { Loading Loading @@ -1033,7 +1058,10 @@ done: // If frames remain in RecvData (e.g. HEADERS that arrived during // streaming), process them now instead of waiting for the next // EPOLLIN which may never fire. if (cureq.RecvData.size() >= H2_FRAME_HEADER_LEN) { // Only reprocess if we actually made progress (consumed frames or // generated output). Otherwise we'd spin forever on an incomplete // frame that needs more network data to arrive. if ((!out.empty() || off > 0) && cureq.RecvData.size() >= H2_FRAME_HEADER_LEN) { out.clear(); out.reserve(4096); off = 0; Loading