// TODO: 3 use span here instead of zero-terminated string std::tuple<int, int, bool> feed_bytes(http_parser& parser, char const* str) { std::tuple<int, int, bool> ret(0, 0, false); std::tuple<int, int, bool> prev(0, 0, false); for (int chunks = 1; chunks < 70; ++chunks) { ret = std::make_tuple(0, 0, false); parser.reset(); span<char const> recv_buf(str, 0); for (;;) { int chunk_size = (std::min)(chunks, int(strlen(recv_buf.end()))); if (chunk_size == 0) break; recv_buf = span<char const>(recv_buf.data(), recv_buf.size() + chunk_size); int payload, protocol; bool error = false; std::tie(payload, protocol) = parser.incoming(recv_buf, error); std::get<0>(ret) += payload; std::get<1>(ret) += protocol; std::get<2>(ret) |= error; // std::cerr << payload << ", " << protocol << ", " << chunk_size << std::endl; TORRENT_ASSERT(payload + protocol == chunk_size || std::get<2>(ret)); } TEST_CHECK(prev == std::make_tuple(0, 0, false) || ret == prev || std::get<2>(ret)); if (!std::get<2>(ret)) { TEST_EQUAL(std::get<0>(ret) + std::get<1>(ret), int(strlen(str))); } prev = ret; } return ret; }
tuple<int, int, bool> feed_bytes(http_parser& parser, char const* str) { tuple<int, int, bool> ret(0, 0, false); tuple<int, int, bool> prev(0, 0, false); for (int chunks = 1; chunks < 70; ++chunks) { ret = make_tuple(0, 0, false); parser.reset(); buffer::const_interval recv_buf(str, str); for (; *str;) { int chunk_size = (std::min)(chunks, int(strlen(recv_buf.end))); if (chunk_size == 0) break; recv_buf.end += chunk_size; int payload, protocol; bool error = false; tie(payload, protocol) = parser.incoming(recv_buf, error); ret.get<0>() += payload; ret.get<1>() += protocol; ret.get<2>() += error; // std::cerr << payload << ", " << protocol << ", " << chunk_size << std::endl; TORRENT_ASSERT(payload + protocol == chunk_size); } TEST_CHECK(prev == make_tuple(0, 0, false) || ret == prev); prev = ret; } return ret; }