Loading src/event/iocp.cpp +17 −2 Original line number Diff line number Diff line Loading @@ -522,8 +522,11 @@ namespace netplus { // Do NOT call flush_out again - the WRITE completion handler will manage async writes. // Just check if handshake is done, otherwise repost recv for more data. if (!owner->csock->getHandshakeDone()) { std::cerr << "[IOCP] Handshake not done yet, reposting recv" << std::endl; bool handshakeDone = owner->csock->getHandshakeDone(); std::cerr << "[IOCP] After handshake_after_accept: handshakeDone=" << handshakeDone << " hasPendingWrite=" << (int)owner->csock->hasPendingWrite() << std::endl; if (!handshakeDone) { std::cerr << "[IOCP] Handshake not done yet, reposting recv for more data" << std::endl; try { post_recv(st, *owner); } catch (...) {} Loading @@ -539,11 +542,14 @@ namespace netplus { if (decLen == 0) break; std::cerr << "[IOCP] Received " << decLen << " bytes of application data" << std::endl; owner->RecvData.append(decrypted.data.buf, decLen); ev->RequestEvent(*owner, tid, (ULONG_PTR)decLen); std::cerr << "[IOCP] RequestEvent returned, SendData.size()=" << owner->SendData.size() << std::endl; } } catch (NetException& e) { if (e.getErrorType() != NetException::Note) { std::cerr << "[IOCP] Application data recvData threw NetException: " << e.what() << std::endl; ev->DisconnectEvent(*owner, tid, 0); remove_con(st, cs); try { owner->csock->close(); } catch (...) {} Loading @@ -554,8 +560,17 @@ namespace netplus { // if user filled SendData -> try send try { std::cerr << "[IOCP] Calling try_post_send, SendData.size()=" << owner->SendData.size() << std::endl; try_post_send(ev, st, *owner, tid); std::cerr << "[IOCP] try_post_send completed" << std::endl; } catch (std::exception& ex) { std::cerr << "[IOCP] try_post_send threw: " << ex.what() << std::endl; ev->DisconnectEvent(*owner, tid, 0); remove_con(st, cs); try { owner->csock->close(); } catch (...) {} continue; } catch (...) { std::cerr << "[IOCP] try_post_send threw unknown exception" << std::endl; ev->DisconnectEvent(*owner, tid, 0); remove_con(st, cs); try { owner->csock->close(); } catch (...) {} Loading src/ssl.cpp +13 −2 Original line number Diff line number Diff line Loading @@ -1216,18 +1216,29 @@ std::vector<uint8_t> netplus::ssl::_tls13_read_record_handshake() { for (;;) { // Loop to skip CCS records std::vector<uint8_t> rec = readTlsRecordAsync(); if (rec.empty()) return {}; if (rec.empty()) { std::cerr << "[SSL] _tls13_read_record_handshake: readTlsRecordAsync returned empty" << std::endl; return {}; } if (rec.size() < 5) std::cerr << "[SSL] _tls13_read_record_handshake: got record, size=" << rec.size() << std::endl; if (rec.size() < 5) { std::cerr << "[SSL] _tls13_read_record_handshake: record too short (" << rec.size() << " < 5)" << std::endl; throwSSL(NetException::Error, "TLS1.3 record too short"); } uint8_t outer_type = rec[0]; uint16_t ver = (uint16_t(rec[1]) << 8) | rec[2]; uint16_t rlen = (uint16_t(rec[3]) << 8) | rec[4]; std::cerr << "[SSL] _tls13_read_record_handshake: outer_type=0x" << std::hex << (int)outer_type << std::dec << " ver=0x" << std::hex << ver << std::dec << " rlen=" << rlen << std::endl; // ✅ Skip CCS records (middlebox compatibility in TLS 1.3) if (outer_type == 0x14) { if (rec.size() == 6 && rec[5] == 0x01) { std::cerr << "[SSL] _tls13_read_record_handshake: skipping CCS record" << std::endl; continue; // ignore CCS, read next record } } Loading Loading
src/event/iocp.cpp +17 −2 Original line number Diff line number Diff line Loading @@ -522,8 +522,11 @@ namespace netplus { // Do NOT call flush_out again - the WRITE completion handler will manage async writes. // Just check if handshake is done, otherwise repost recv for more data. if (!owner->csock->getHandshakeDone()) { std::cerr << "[IOCP] Handshake not done yet, reposting recv" << std::endl; bool handshakeDone = owner->csock->getHandshakeDone(); std::cerr << "[IOCP] After handshake_after_accept: handshakeDone=" << handshakeDone << " hasPendingWrite=" << (int)owner->csock->hasPendingWrite() << std::endl; if (!handshakeDone) { std::cerr << "[IOCP] Handshake not done yet, reposting recv for more data" << std::endl; try { post_recv(st, *owner); } catch (...) {} Loading @@ -539,11 +542,14 @@ namespace netplus { if (decLen == 0) break; std::cerr << "[IOCP] Received " << decLen << " bytes of application data" << std::endl; owner->RecvData.append(decrypted.data.buf, decLen); ev->RequestEvent(*owner, tid, (ULONG_PTR)decLen); std::cerr << "[IOCP] RequestEvent returned, SendData.size()=" << owner->SendData.size() << std::endl; } } catch (NetException& e) { if (e.getErrorType() != NetException::Note) { std::cerr << "[IOCP] Application data recvData threw NetException: " << e.what() << std::endl; ev->DisconnectEvent(*owner, tid, 0); remove_con(st, cs); try { owner->csock->close(); } catch (...) {} Loading @@ -554,8 +560,17 @@ namespace netplus { // if user filled SendData -> try send try { std::cerr << "[IOCP] Calling try_post_send, SendData.size()=" << owner->SendData.size() << std::endl; try_post_send(ev, st, *owner, tid); std::cerr << "[IOCP] try_post_send completed" << std::endl; } catch (std::exception& ex) { std::cerr << "[IOCP] try_post_send threw: " << ex.what() << std::endl; ev->DisconnectEvent(*owner, tid, 0); remove_con(st, cs); try { owner->csock->close(); } catch (...) {} continue; } catch (...) { std::cerr << "[IOCP] try_post_send threw unknown exception" << std::endl; ev->DisconnectEvent(*owner, tid, 0); remove_con(st, cs); try { owner->csock->close(); } catch (...) {} Loading
src/ssl.cpp +13 −2 Original line number Diff line number Diff line Loading @@ -1216,18 +1216,29 @@ std::vector<uint8_t> netplus::ssl::_tls13_read_record_handshake() { for (;;) { // Loop to skip CCS records std::vector<uint8_t> rec = readTlsRecordAsync(); if (rec.empty()) return {}; if (rec.empty()) { std::cerr << "[SSL] _tls13_read_record_handshake: readTlsRecordAsync returned empty" << std::endl; return {}; } if (rec.size() < 5) std::cerr << "[SSL] _tls13_read_record_handshake: got record, size=" << rec.size() << std::endl; if (rec.size() < 5) { std::cerr << "[SSL] _tls13_read_record_handshake: record too short (" << rec.size() << " < 5)" << std::endl; throwSSL(NetException::Error, "TLS1.3 record too short"); } uint8_t outer_type = rec[0]; uint16_t ver = (uint16_t(rec[1]) << 8) | rec[2]; uint16_t rlen = (uint16_t(rec[3]) << 8) | rec[4]; std::cerr << "[SSL] _tls13_read_record_handshake: outer_type=0x" << std::hex << (int)outer_type << std::dec << " ver=0x" << std::hex << ver << std::dec << " rlen=" << rlen << std::endl; // ✅ Skip CCS records (middlebox compatibility in TLS 1.3) if (outer_type == 0x14) { if (rec.size() == 6 && rec[5] == 0x01) { std::cerr << "[SSL] _tls13_read_record_handshake: skipping CCS record" << std::endl; continue; // ignore CCS, read next record } } Loading