Skip to content

Configurable single-threaded HTTP server with non-blocking I/O

Notifications You must be signed in to change notification settings

birdper/webserv

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Webserv

Однопоточный HTTP-сервер с неблокирующим вводом-выводом. Сервер поддерживает версию HTTP 1.1.

Приложение написано на c++ 98, без использования стооронних библиотек.
Для опроса событий используется метод poll.

How to Start

Для сборки проекта выполните команду make в корне проекта.

make

Для запуска приложения вы можете указать конфигурационный файл. Или оставить пустым, тогда будет использоваться конфигурационный файл по умолчанию webserv.conf

./webserv [path_to_config_file](opt)

Конфигурация

Конфигурация вдохновлена nginx, и во многом имеет схожее поведение.

В общем случае конфигурационный файл может содержать несколько блоков server, различаемых по портам, на которых они слушают, и по имени сервера.

Определив, какой server будет обрабатывать запрос, nginx сравнивает URI, указанный в заголовке запроса, с параметрами директив location, определённых внутри блока server.

Пример:

server { 
    listen 127.0.0.1:80;
    
    location / {
        root /html/www;
    }
    
    location /some_url {
        root /html/www;
    }
}

server { 
    listen 127.0.0.1:80;
    server_name ;
    
    location / {
        root /html/www/another;
    }
    
    location /some_url {
        root /html/www/another;
    }
}

Parameters:

server
listen
server_name
location
root
index
autoindex
error_page
client_max_body_size
cgi_path
cgi_extension
redirect
upload_directory

server

Синтаксис:	server { ... }
Умолчание:	—
Контекст:	http

Задаёт конфигурацию для виртуального сервера. Чёткого разделения виртуальных серверов на IP-based (на основании IP-адреса) и name-based (на основании поля “Host” заголовка запроса) нет.
Вместо этого директивами listen описываются все адреса и порты, на которых нужно принимать соединения для этого сервера, а в директиве server_name указываются все имена серверов.


listen

Синтаксис:	listen адрес[:порт]; listen порт;
Умолчание:	listen *:80 | *:8000;
Контекст:	server

Задаёт адрес и порт для IP, на которых сервер будет принимать запросы. Можно указать адрес и порт, либо только адрес или только порт. Кроме того, адрес может быть именем хоста, например:

listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen localhost:8000;

Если указан только адрес, то используется порт 80. Cервером по умолчанию будет первый сервер, в котором описана пара адрес:порт.


server_name

Синтаксис:	server_name имя ...;
Умолчание:	server_name "";
Контекст:	server

Задаёт имена виртуального сервера, например:

server {
    server_name example.com www.example.com;
}

Первое имя становится основным именем сервера.


location

Синтаксис:	location uri { ... }
Умолчание:	—
Контекст:	server

Устанавливает конфигурацию в зависимости от URI запроса.


root

Синтаксис: root путь;
Умолчание: root html;
Контекст: server, location

Задаёт корневой каталог для запросов. Например, при такой конфигурации

location /i/ {
    root /data/w3;
}

в ответ на запрос /i/top.gif будет отдан файл /data/w3/top.gif.

Путь к файлу формируется путём замены URI к значению директивы root.


index

Синтаксис:	index файл ...;
Умолчание:	index index.html;
Контекст:	server, location

Определяет файлы, которые будут использоваться в качестве индекса.
Наличие файлов проверяется в порядке их перечисления.


autoindex

Синтаксис:	autoindex on | off;
Умолчание:	autoindex off;
Контекст:	server, location

Разрешает или запрещает вывод листинга каталога.


error_page

Синтаксис:	error_page код ... [=[ответ]] uri;  
Умолчание:	—  
Контекст:	server, location  

Пример:

error_page 404             /404.html;
error_page 500 502 503 504 /50x.html;

client_max_body_size

Синтаксис:	client_max_body_size размер;
Умолчание:	client_max_body_size 1m;
Контекст:	server, location

Задаёт максимально допустимый размер тела запроса клиента. Если размер больше заданного, то клиенту возвращается ошибка 413 (Request Entity Too Large).
Установка параметра размер в 0 отключает проверку размера тела запроса клиента.


methods_allowed

Синтаксис: methods_allowed метод ... ;
Умолчание: 
Контекст: server, location

Содержит методы которые разрешены в контексте.

Example:

methods_allowed post, delete;

upload_directory

Синтаксис:	upload_directory <directry>;
Умолчание:	none;
Контекст:	server, location

Указывает каталог в который будут записаны загружаемые файлы


cgi_path

Синтаксис:	cgi_path <directry>;
Умолчание:	none;
Контекст:	server, location

Указывает cgi обработчик


cgi_extension

Синтаксис:	cgi_extension <extension>;
Умолчание:	none;
Контекст:	server, location

Указывает расширение файлов, которые будет обрабатывать cgi


redirect

Синтаксис:	return <code> <url>;
Умолчание:	-
Контекст:	server, location

Завершает обработку и возвращает клиенту указанный код.