Описание задачи
Написать HTTP сервер по стандарту RFC 7230-7235 на С++, реализовав:
1. Соединение клиент-сервер;
2. Запуск двух и более серверов;
3. Методы GET, POST, PUT, HEAD;
4. Коды состояний, обработка ошибок;
5. Заголовки запроса/ответа
6. Принятие chunked запроса
7. Автоиндексация
8. Поддержку CGI скриптов
9. Авторизацию клиентов
10. Настраиваемый конфигурационный файл
За основу было взято оригинальное поведение Nginx.
Настройка конфигурационного файла
В основной структуре сервера мы можем указать:
1. listen - порты сервера;
Пример: "listen 80 81"
2. server_name - наименование сервера;
Пример: "server_name example.com"
3. root - корневая директория;
Пример: "root /Users/pcatrina/Desktop/workspace/webserv/webserv/resources"
4. error_page - путь до файла, который будет отображаться вместо страницы ошибки;
Пример: "error_page 405 /40x.html"
5. autoindex - on/off автоиндексацию;
Пример: "autoindex off"
В структуре location мы можем указать:
1. root - корневая директория;
Пример: "root /Users/pcatrina/Desktop/workspace/webserv/webserv/resources/42_test"
2. index - отображаемая страница;
Пример: "index index.html"
3. limit_except - разрешенные методы у location;
Пример: "limit_except POST GET"
4. limit_client_body_size - лимит на посылаемое body от клиента;
Пример: "limit_client_body_size 10"
5. fastcgi_pass - путь до интерпретатора CGI скриптов;
Пример: "fastcgi_pass /Users/pcatrina/Desktop/workspace/webserv/webserv/resources/42_test/cgi_tester;"
6. auth_basic - заголовок авторизации;
Пример: "auth_basic ruslan:ruslan"
Авторизация в данном проекте сделана посредством Basic-авторизации. Логин:пароль авторизованных клиентов хранится в файле.
7. client_max_body_size - ограничение на максимальный размер тела запроса;
Пример: "client_max_body_size 100"
(!) Программа принимает конфигурационный файл в качестве аргумента. (!)
Проект написан по стандарту С++ 98.