| 1 | // vtest build: macos || freebsd || openbsd || netbsd || dragonfly |
| 2 | module fasthttp |
| 3 | |
| 4 | fn C.socketpair(domain i32, typ i32, protocol i32, sockets &i32) i32 |
| 5 | |
| 6 | fn bsd_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_kqueue_read_after_consumed_edge() ! { |
| 13 | server := new_server(ServerConfig{ |
| 14 | family: .ip |
| 15 | port: 0 |
| 16 | max_request_buffer_size: 8192 |
| 17 | handler: bsd_reregistration_test_handler |
| 18 | })! |
| 19 | kq := C.kqueue() |
| 20 | assert kq >= 0 |
| 21 | defer { |
| 22 | C.close(kq) |
| 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_nonblocking(sockets[0]) |
| 31 | mut conn := &Conn{ |
| 32 | fd: sockets[0] |
| 33 | request_active: true |
| 34 | file_fd: -1 |
| 35 | } |
| 36 | assert add_event(kq, u64(sockets[0]), i16(C.EVFILT_READ), |
| 37 | u16(C.EV_ADD | C.EV_ENABLE | C.EV_CLEAR), conn) == 0 |
| 38 | assert C.write(sockets[1], c'GET ', 4) == 4 |
| 39 | |
| 40 | mut event := C.kevent{} |
| 41 | mut timeout := C.timespec{ |
| 42 | tv_sec: 1 |
| 43 | } |
| 44 | assert C.kevent(kq, unsafe { nil }, 0, &event, 1, &timeout) == 1 |
| 45 | assert event.ident == u64(sockets[0]) |
| 46 | |
| 47 | server.begin_request() |
| 48 | mut clients := { |
| 49 | sockets[0]: voidptr(conn) |
| 50 | } |
| 51 | complete_response(server, kq, conn, mut clients, false) |
| 52 | |
| 53 | assert server.active_request_count() == 0 |
| 54 | assert clients[sockets[0]] or { unsafe { nil } } == voidptr(conn) |
| 55 | timeout = C.timespec{ |
| 56 | tv_sec: 1 |
| 57 | } |
| 58 | assert C.kevent(kq, unsafe { nil }, 0, &event, 1, &timeout) == 1 |
| 59 | assert event.ident == u64(sockets[0]) |
| 60 | close_conn(server, kq, conn, mut clients) |
| 61 | } |
| 62 | |