| 1 | // vtest build: linux |
| 2 | module fasthttp |
| 3 | |
| 4 | fn C.socketpair(domain i32, typ i32, protocol i32, sockets &i32) i32 |
| 5 | |
| 6 | fn linux_reregistration_test_handler(_ HttpRequest) !HttpResponse { |
| 7 | return HttpResponse{ |
| 8 | content: 'HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n'.bytes() |
| 9 | } |
| 10 | } |
| 11 | |
| 12 | fn test_keep_alive_completion_rearms_epollin_after_consumed_edge() ! { |
| 13 | server := new_server(ServerConfig{ |
| 14 | family: .ip |
| 15 | port: 0 |
| 16 | max_request_buffer_size: 8192 |
| 17 | handler: linux_reregistration_test_handler |
| 18 | })! |
| 19 | epoll_fd := C.epoll_create1(0) |
| 20 | assert epoll_fd >= 0 |
| 21 | defer { |
| 22 | C.close(epoll_fd) |
| 23 | } |
| 24 | mut sockets := [2]int{} |
| 25 | assert C.socketpair(C.AF_UNIX, C.SOCK_STREAM, 0, &sockets[0]) == 0 |
| 26 | defer { |
| 27 | C.close(sockets[0]) |
| 28 | C.close(sockets[1]) |
| 29 | } |
| 30 | set_blocking(sockets[0], false) |
| 31 | assert add_fd_to_epoll(epoll_fd, sockets[0], u32(C.EPOLLIN | C.EPOLLET)) == 0 |
| 32 | assert C.write(sockets[1], c'GET ', 4) == 4 |
| 33 | |
| 34 | mut event := C.epoll_event{} |
| 35 | assert C.epoll_wait(epoll_fd, &event, 1, 1000) == 1 |
| 36 | assert unsafe { event.data.fd } == sockets[0] |
| 37 | |
| 38 | server.begin_request() |
| 39 | mut state := &ClientWriteState{ |
| 40 | request_active: true |
| 41 | } |
| 42 | mut client_fds := { |
| 43 | sockets[0]: true |
| 44 | } |
| 45 | mut client_buffers := map[int][]u8{} |
| 46 | mut client_read_starts := map[int]i64{} |
| 47 | mut closing_client_fds := map[int]bool{} |
| 48 | mut client_write_states := { |
| 49 | sockets[0]: state |
| 50 | } |
| 51 | complete_write(server, epoll_fd, sockets[0], mut client_fds, mut client_buffers, mut |
| 52 | client_read_starts, mut closing_client_fds, mut client_write_states) |
| 53 | |
| 54 | assert server.active_request_count() == 0 |
| 55 | assert sockets[0] in client_fds |
| 56 | assert C.epoll_wait(epoll_fd, &event, 1, 1000) == 1 |
| 57 | assert unsafe { event.data.fd } == sockets[0] |
| 58 | } |
| 59 | |