v/examples/vanilla_http_server

Vanilla

Vanilla is a raw V server.

Description

This project is a simple server written in the V programming language. It aims to provide a minimalistic and efficient server implementation.

Features

  • Lightweight and fast
  • Minimal dependencies
  • Easy to understand and extend

Installation

To install Vanilla, you need to have the V compiler installed. You can download it from the official V website.

Usage

To run the server, use the following command:

v -prod crun .

This will start the server, and you can access it at http://localhost:3000.

Code Overview

Main Server

The main server logic is implemented in src/main.v. The server is initialized and started in the main function:

module main

const port = 3000

fn main() {
	mut server := Server{
		router: setup_router()
	}

	server.socket_fd = create_server_socket(port)
	if server.socket_fd < 0 {
		return
	}
	server.epoll_fd = C.epoll_create1(0)
	if server.epoll_fd < 0 {
		C.perror('epoll_create1 failed'.str)
		C.close(server.socket_fd)
		return
	}

	server.lock_flag.lock()
	if add_fd_to_epoll(server.epoll_fd, server.socket_fd, u32(C.EPOLLIN)) == -1 {
		C.close(server.socket_fd)
		C.close(server.epoll_fd)

		server.lock_flag.unlock()
		return
	}

	server.lock_flag.unlock()

	server.lock_flag.init()
	for i := 0; i < 16; i++ {
		server.threads[i] = spawn process_events(&server)
	}
	println('listening on http://localhost:${port}/')
	event_loop(&server)
}

Test

CURL

curl -X GET --verbose http://localhost:3000/ &&
curl -X POST --verbose http://localhost:3000/user &&
curl -X GET --verbose http://localhost:3000/user/1

WRK

wrk --connection 512 --threads 16 --duration 10s http://localhost:3000

Valgrind

# Race condition check
v -prod -gc none . 
valgrind --tool=helgrind ./vanilla_http_server