Этот проект был завершен в рамках 42 -основной учебной программы. это было сделано с Alouane04
Целью проекта является создание совместимого с HTTP -веб -сервером C ++ 98 с нуля. Веб -сервер может обрабатывать HTTP GET, HEAD, POLT, POLT и DELETE REDSESS, и может обслуживать статические файлы из указанного корневого каталога или динамического контента с использованием CGI. Он также может обрабатывать несколько клиентских соединений одновременно с помощью Select ().
Использование
Введение
Части веб -сервера
make
./webserv [Config File] # # leave empty to use the default configuration.HTTP (протокол передачи гипертекста) является протоколом для отправки и получения информации через Интернет. Это основа Всемирной паутины и используется веб -браузерами и веб -серверами для общения друг с другом.
Веб -сервер HTTP - это программное приложение, которое слушает и отвечает на HTTP -запросы от клиентов (таких как веб -браузеры). Основная цель веб -сервера - размещать веб -контент и сделать его доступным для пользователей через Интернет.
HTTP состоит из запросов и ответов. Когда клиент (такой как веб -браузер) хочет получить веб -страницу с сервера, он отправляет HTTP -запрос на сервер. Затем сервер обрабатывает запрос и отправляет обратный ответ HTTP.
Http -формат сообщения
start-line CRLF
Headers CRLF
CRLF(end of headers)
[message-body]
CRLF are Carriage Return and Line Feed (rn), which is just a new line.
Сообщение http может быть либо запросом, либо ответом.
Http -запрос
HTTP -запрос состоит из линии запроса, заголовков и дополнительного органа сообщений. Вот пример HTTP -запроса:
GET /index.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Линия запроса состоит из трех частей: метод, путь и HTTP -версия. Метод указывает действие, которое клиент хочет выполнить, например, Get (для извлечения ресурса) или публикация (для отправки данных на сервер). Путь или URI определяют местоположение ресурса на сервере. Версия HTTP указывает на версию используемого HTTP -протокола.
Заголовки содержат дополнительную информацию о запросе, такой как имя хоста сервера, и тип используемого браузера.
В приведенном выше примере не было тела сообщения, потому что метод получения обычно не включает в себя какое -либо тело.
Http -ответ
Ответ HTTP также состоит из строки состояния, заголовков и дополнительного тела сообщений. Вот пример ответа HTTP:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<Message Body>
Строка состояния состоит из трех частей: версия HTTP, код состояния и фраза причины. Код состояния указывает на результат запроса, такой как 200 OK (успешно) или 404, не найденные (ресурс не найден). Фраза причина - это краткое описание кода состояния. Ниже приводится очень краткое изложение того, что обозначает код состояния:
1xx указывает только информационное сообщение
2xx указывает на успех какого -либо
3xx перенаправляет клиента на другой URL
4xx указывает ошибку со стороны клиента
5xx указывает ошибку на части сервера
Заголовки содержат дополнительную информацию о ответе, такой как тип и размер возвращаемого контента. Тело сообщения содержит фактическое содержание ответа, такое как HTML -код для веб -страницы.
HTTP Методы
| Метод | Описание | Возможное тело |
|---|---|---|
GET | Получить конкретный ресурс или набор ресурсов, не должен влиять на данные/ресурс | Нет |
POST | Выполните обработку для конкретного ресурса в контенте запроса | Да |
DELETE | Удаляет целевой ресурс, данное URI | Да |
PUT | Создает новый ресурс с данными из тела сообщений, если ресурс уже существует, обновите его с помощью данных в теле. | Да |
HEAD | То же, что и Get, но не передайте содержание ответа | Нет |
ПОЛУЧАТЬ
Метод HTTP GET используется для чтения (или извлечения) представления ресурса. В случае успеха (или неверно) получите возвращение ресурса в теле реагирования и коде состояния ответа HTTP 200 (OK). В случае ошибки он чаще всего возвращает 404 (не найдено) или 400 (плохой запрос).
ПОЧТА
Метод HTTP Post чаще всего используется для создания новых ресурсов. При успешном творении возвращается код ответа HTTP 201 (созданный).
УДАЛИТЬ
HTTP Delete - это Stright Forward. Удаляет ресурс, указанный в URI. При успешном удалении он возвращает код состояния ответа HTTP 204 (без контента).
Узнайте больше о методах HTTP RFC9110#9.1
Основной веб -сервер HTTP состоит из нескольких компонентов, которые работают вместе для получения и обработки HTTP -запросов от клиентов и отправки обратных ответов. Ниже приведены основные части нашего веб -сервера.
Сеть часть веб -сервера, которая обрабатывает подключения TCP и выполняет такие задачи, как прослушивание входящих запросов и отправка ответов. Он отвечает за низкоуровневые сетевые задачи веб-сервера, такие как создание и управление сокетами, обработка ввода и потоков вывода и управление потоком данных между сервером и клиентами.
Прежде чем написать ваш WebServer, я бы порекомендовал прочитать это удивительное руководство по созданию простого клиента/сервера TCP в C, так как это поможет вам получить хорошее представление о том, как работает TCP в C/C ++. Также вам нужно будет понять множитель ввода/вывода, это видео поможет вам понять основную идею Select ().
Процесс мультиплексирования ввода/вывода на нашем веб -сервере приведен в приведенной ниже блок -схеме. (CGI не включена в блок -схему, но может быть добавлена в будущем)
Регуляционная часть веб -сервера относится к процессу, отвечающему за интерпретацию и извлечение информации из HTTP -запросов. На этом веб -сервере анализ запросов выполняется классом httprequest. Объект httprequest получает входящий запрос, анализирует его и извлекает соответствующую информацию, такую как метод, путь, заголовки и тело сообщения (если присутствуют). Если какая -либо синтаксическая ошибка была обнаружена в запросе во время анализа, установлены флаги ошибок и останавливаются. Запрос может быть подан в объект с помощью метода Feed () полностью или частично, это возможно, потому что анализатор сканирует байт запроса за раз и обновляет состояние анализа, когда это необходимо. Тот же способ анализа используется анализаторами запроса Nginx и Nodejs.
Ниже приведен обзор того, как работает анализатор.
Строитель ответов отвечает за построение и форматирование ответов HTTP, которые отправляются обратно клиентам в ответ на их запросы. На этом веб -сервере класс ответов отвечает за создание и хранение ответа HTTP, включая строку состояния, заголовки и тело сообщения. Строитель ответов также может выполнять такие задачи, как установление соответствующего кода состояния и разумной фразы, основанной на результате запроса, добавляя заголовки к ответу, чтобы предоставить дополнительную информацию о содержимом или сервере, а также форматирование тела сообщений в соответствии с типом содержимого и кодированием ответа. Например, если сервер получает запрос на веб-страницу от клиента, сервер будет анализировать запрос и передавать его в объект ответа, который принесет содержимое веб-страницы и построит HTTP-ответ с содержимым HTML в теле сообщения и соответствующих заголовках, такими как заголовки типа контента и среды.
Файл конфигурации - это текстовый файл, который содержит различные настройки и директивы, которые определяют, как должен работать веб -сервер. Эти настройки могут включать такие вещи, как номер порта, который должен прослушать веб -сервер, местоположение корневого каталога веб -сервера и многие другие настройки.
Вот пример FIE, который показывает формат файла конфигурации и поддерживаемые директивы.
server {
listen 8001 ; # listening port, mandatory parameter
host 127.0.0.1; # host or 127.0.0.1 by default
server_name test; # specify server_name, need to be added into /etc/hosts to work
error_page 404 /error/404.html; # default error page
client_max_body_size 1024 ; # max request body size in bytes
root docs/fusion_web/; # root folder of site directory, full or relative path, mandatory parameter
index index.html; # default page when requesting a directory, index.html by default
location /tours {
root docs/fusion_web; # root folder of the location, if not specified, taken from the server.
# EX: - URI /tours --> docs/fusion_web/tours
# - URI /tours/page.html --> docs/fusion_web/tours/page.html
autoindex on ; # turn on/off directory listing
allow_methods POST GET; # allowed methods in location, GET only by default
index index.html; # default page when requesting a directory, copies root index by default
return abc/index1.html; # redirection
alias docs/fusion_web; # replaces location part of URI.
# EX: - URI /tours --> docs/fusion_web
# - URI /tours/page.html --> docs/fusion_web/page.html
}
location cgi-bin {
root ./; # cgi-bin location, mandatory parameter
cgi_path /usr/bin/python3 /bin/bash; # location of interpreters installed on the current system, mandatory parameter
cgi_ext .py .sh; # extensions for executable files, mandatory parameter
}
}CGI является стандартом для запуска внешних программ с веб -сервера. Когда пользователь запрашивает веб -страницу, которую следует обрабатывать программой CGI, веб -сервер выполняет программу и возвращает вывод в веб -браузер пользователя.
Программы CGI - это просто сценарии, которые могут быть написаны на любом языке программирования, таких как Perl, Python или Bash, и обычно используются для обработки данных, представленных пользователем через веб -браузер, или для создания динамического контента на веб -странице.