Commit 1f17e557 authored by jan.koester's avatar jan.koester
Browse files

test

parent 982ec948
Loading
Loading
Loading
Loading
+29 −1
Original line number Diff line number Diff line
@@ -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) |
@@ -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)) {
@@ -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) {
@@ -919,6 +934,11 @@ reprocess:
                        goto done;
                    }
                }
            } else {
                std::cerr << "[H2-RX-DATA] sid=" << sid
                          << " flen=" << flen
                          << " NOT FOUND in pendingIncoming!"
                          << std::endl;
            }
            break;
        }
@@ -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
        {
@@ -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;