diff --git a/v/v/src/main.v b/v/v/src/main.v index c6b5fc73739..ef5e0e489ac 100644 --- a/v/v/src/main.v +++ b/v/v/src/main.v @@ -3,8 +3,32 @@ module main const port = 3000 const max_thread_pool_size = 8 +// handle_request finds and executes the handler for a given route. +// It takes an HttpRequest object as an argument and returns the response as a byte array. +fn handle_request(req HttpRequest) ![]u8 { + method := unsafe { tos(&req.buffer[req.method.start], req.method.len) } + path := unsafe { tos(&req.buffer[req.path.start], req.path.len) } + + if method == 'GET' { + if path == '/' { + return home_controller([]) + } else if path.starts_with('/user/') { + id := path[6..] + return get_user_controller([id]) + } + } else if method == 'POST' { + if path == '/user' { + return create_user_controller([]) + } + } + + return tiny_bad_request_response +} + fn main() { - mut server := Server{} + mut server := Server{ + request_handler: handle_request + } server.server_socket = create_server_socket(port) if server.server_socket < 0 { diff --git a/v/v/src/request_parser.v b/v/v/src/request_parser.v index e8fe13bd7da..6ddb2dc13e0 100644 --- a/v/v/src/request_parser.v +++ b/v/v/src/request_parser.v @@ -13,6 +13,7 @@ mut: version Slice } +@[direct_array_access] fn parse_request_line(mut req HttpRequest) ! { mut i := 0 // Parse HTTP method diff --git a/v/v/src/router.v b/v/v/src/router.v deleted file mode 100644 index acf2e09de33..00000000000 --- a/v/v/src/router.v +++ /dev/null @@ -1,23 +0,0 @@ -module main - -// handle_request finds and executes the handler for a given route. -// It takes an HttpRequest object as an argument and returns the response as a byte array. -fn handle_request(req HttpRequest) ![]u8 { - method := unsafe { tos(&req.buffer[req.method.start], req.method.len) } - path := unsafe { tos(&req.buffer[req.path.start], req.path.len) } - - if method == 'GET' { - if path == '/' { - return home_controller([]) - } else if path.starts_with('/user/') { - id := path[6..] - return get_user_controller([id]) - } - } else if method == 'POST' { - if path == '/user' { - return create_user_controller([]) - } - } - - return tiny_bad_request_response -} diff --git a/v/v/src/server.c.v b/v/v/src/server.c.v index e7459d88895..d0a831ac871 100644 --- a/v/v/src/server.c.v +++ b/v/v/src/server.c.v @@ -16,7 +16,11 @@ import sync const tiny_bad_request_response = 'HTTP/1.1 400 Bad Request\r\nContent-Length: 0\r\nConnection: close\r\n\r\n'.bytes() -#include +$if windows { + #include +} $else { + #include +} #include #include #include @@ -80,11 +84,12 @@ fn C.epoll_wait(__epfd int, __events &C.epoll_event, __maxevents int, __timeout struct Server { mut: - server_socket int - epoll_fd int - lock_flag sync.Mutex - has_clients int - threads [max_thread_pool_size]thread + server_socket int + epoll_fd int + lock_flag sync.Mutex + has_clients int + threads [max_thread_pool_size]thread + request_handler fn (HttpRequest) ![]u8 @[required] } fn C.fcntl(fd int, cmd int, arg int) int @@ -235,7 +240,6 @@ fn handle_client_closure(server &Server, client_fd int) { } } -@[manualfree] fn process_events(server &Server) { events := [max_connection_size]C.epoll_event{} num_events := C.epoll_wait(server.epoll_fd, &events[0], max_connection_size, -1) @@ -266,7 +270,7 @@ fn process_events(server &Server) { // This lock is a workaround for avoiding race condition in router.params // This slows down the server, but it's a temporary solution (*server).lock_flag.lock() - response_buffer := handle_request(decoded_http_request) or { + response_buffer := (*server).request_handler(decoded_http_request) or { eprintln('Error handling request ${err}') C.send(unsafe { events[i].data.fd }, tiny_bad_request_response.data, tiny_bad_request_response.len, 0)