Skip to content

Commit 8a49cbb

Browse files
authored
v: update server (#8166)
1 parent 34537fe commit 8a49cbb

File tree

4 files changed

+38
-32
lines changed

4 files changed

+38
-32
lines changed

v/v/src/main.v

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,32 @@ module main
33
const port = 3000
44
const max_thread_pool_size = 8
55

6+
// handle_request finds and executes the handler for a given route.
7+
// It takes an HttpRequest object as an argument and returns the response as a byte array.
8+
fn handle_request(req HttpRequest) ![]u8 {
9+
method := unsafe { tos(&req.buffer[req.method.start], req.method.len) }
10+
path := unsafe { tos(&req.buffer[req.path.start], req.path.len) }
11+
12+
if method == 'GET' {
13+
if path == '/' {
14+
return home_controller([])
15+
} else if path.starts_with('/user/') {
16+
id := path[6..]
17+
return get_user_controller([id])
18+
}
19+
} else if method == 'POST' {
20+
if path == '/user' {
21+
return create_user_controller([])
22+
}
23+
}
24+
25+
return tiny_bad_request_response
26+
}
27+
628
fn main() {
7-
mut server := Server{}
29+
mut server := Server{
30+
request_handler: handle_request
31+
}
832

933
server.server_socket = create_server_socket(port)
1034
if server.server_socket < 0 {

v/v/src/request_parser.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ mut:
1313
version Slice
1414
}
1515

16+
@[direct_array_access]
1617
fn parse_request_line(mut req HttpRequest) ! {
1718
mut i := 0
1819
// Parse HTTP method

v/v/src/router.v

Lines changed: 0 additions & 23 deletions
This file was deleted.

v/v/src/server.c.v

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ import sync
1616

1717
const tiny_bad_request_response = 'HTTP/1.1 400 Bad Request\r\nContent-Length: 0\r\nConnection: close\r\n\r\n'.bytes()
1818

19-
#include <arpa/inet.h>
19+
$if windows {
20+
#include <winsock2.h>
21+
} $else {
22+
#include <arpa/inet.h>
23+
}
2024
#include <fcntl.h>
2125
#include <sys/epoll.h>
2226
#include <errno.h>
@@ -80,11 +84,12 @@ fn C.epoll_wait(__epfd int, __events &C.epoll_event, __maxevents int, __timeout
8084

8185
struct Server {
8286
mut:
83-
server_socket int
84-
epoll_fd int
85-
lock_flag sync.Mutex
86-
has_clients int
87-
threads [max_thread_pool_size]thread
87+
server_socket int
88+
epoll_fd int
89+
lock_flag sync.Mutex
90+
has_clients int
91+
threads [max_thread_pool_size]thread
92+
request_handler fn (HttpRequest) ![]u8 @[required]
8893
}
8994

9095
fn C.fcntl(fd int, cmd int, arg int) int
@@ -235,7 +240,6 @@ fn handle_client_closure(server &Server, client_fd int) {
235240
}
236241
}
237242

238-
@[manualfree]
239243
fn process_events(server &Server) {
240244
events := [max_connection_size]C.epoll_event{}
241245
num_events := C.epoll_wait(server.epoll_fd, &events[0], max_connection_size, -1)
@@ -266,7 +270,7 @@ fn process_events(server &Server) {
266270
// This lock is a workaround for avoiding race condition in router.params
267271
// This slows down the server, but it's a temporary solution
268272
(*server).lock_flag.lock()
269-
response_buffer := handle_request(decoded_http_request) or {
273+
response_buffer := (*server).request_handler(decoded_http_request) or {
270274
eprintln('Error handling request ${err}')
271275
C.send(unsafe { events[i].data.fd }, tiny_bad_request_response.data,
272276
tiny_bad_request_response.len, 0)

0 commit comments

Comments
 (0)