DataBuffer receive_response(TCPConnection &connection) { std::array<char, 16000> response_data; NetworkConditionVariable wait_condition; std::mutex mutex; std::unique_lock<std::mutex> lock(mutex); size_t pos = 0; while (pos < response_data.size()) { size_t last_pos = pos > 0 ? pos - 4 : pos; int bytes_read; while (true) { bytes_read = connection.read(response_data.data() + pos, response_data.size() - pos); if (bytes_read != -1) break; NetworkEvent *events[] = { &connection }; wait_condition.wait(lock, 1, events); } pos += bytes_read; if (bytes_read == 0) break; bool end_header_found = false; for (size_t i = last_pos; i + 3 < pos; i++) { if (response_data[i] == '\r' && response_data[i + 1] == '\n' && response_data[i + 2] == '\r' && response_data[i + 3] == '\n') { end_header_found = true; break; } } if (end_header_found) break; } for (auto &line : StringHelp::split_text(std::string(response_data.data(), pos), "\r\n")) { Console::write_line(StringHelp::local8_to_text(line)); } return DataBuffer(); }