| 310 | } |
| 311 | std::vector<int> rec; |
| 312 | int chunked_handler_pt(void*, ISocketStream* sock) { |
| 313 | EXPECT_NE(nullptr, sock); |
| 314 | char recv[4096]; |
| 315 | auto len = sock->recv(recv, 4096); |
| 316 | if (len < 0) |
| 317 | LOG_ERRNO_RETURN(0, -1, "failed to read from socket "); |
| 318 | LOG_DEBUG("Accepted"); |
| 319 | EXPECT_GT(len, 0); |
| 320 | auto ret = sock->write(header_data, sizeof(header_data) - 1); |
| 321 | EXPECT_EQ(sizeof(header_data) - 1, ret); |
| 322 | size_t offset = 0; |
| 323 | rec.clear(); |
| 324 | while (offset < std_data_size) { |
| 325 | auto remain = std_data_size - offset; |
| 326 | if (remain <= 1024) { |
| 327 | rec.push_back(remain); |
| 328 | chunked_send(offset, remain, sock); |
| 329 | break; |
| 330 | } |
| 331 | auto max_seg = std::min(remain - 1024, 2 * 4 * 1024UL); |
| 332 | auto seg = 1024 + rand() % max_seg; |
| 333 | chunked_send(offset, seg, sock); |
| 334 | rec.push_back(seg); |
| 335 | offset += seg; |
| 336 | } |
| 337 | sock->write("0\r\n\r\n", 5); |
| 338 | return 0; |
| 339 | } |
| 340 | |
| 341 | TEST(http_client, chunked) { |
| 342 | auto server = new_tcp_socket_server(); |