Update to 0.2.5 version

- Added support for uploading a configuration file over a long path
 - Added support for special uri paths (using the "*" symbol) in the configuration for groups of similar uri paths
 - Added the function of reading the contents of an http request
 - Changed the format of the uri address in the configuration file
 - Added a request redirection module
 - Added a module for blocking access to files by url path
 - Updated documentation
 - Updated module examples
This commit is contained in:
2024-06-13 00:42:58 +05:00
parent aca8a10141
commit aa78c565af
28 changed files with 670 additions and 149 deletions

View File

@@ -10,13 +10,17 @@
.menu {
background-color: aliceblue;
border: 1px solid black;
width: 40%;
width: 40%;
margin-left: 20pt;
}
h1 {
text-align: center;
}
h2 {
margin-left: 20pt;
h3 {
margin-left: 20pt;
}
.menu-header {
margin-left: 20pt;
}
</style>
</head>
@@ -24,14 +28,23 @@
<h1>Simple-httpd</h1>
<div class="menu">
<h2>Оглавление:</h2>
<h2 class="menu-header">Оглавление:</h2>
<ul>
<li><a href="#about">Описание программы и её возможностей</a></li>
<li><a href="#install">Установка и настройка</a></li>
<li><a href="#api">Документация на API модулей</a></li>
<ul>
<li><a href="#api.response">Создание ответа на запрос</a></li>
<li><a href="#api.request">Обработка данных запроса</a></li>
<li><a href="#api.file">Работа с файлами</a></li>
<li><a href="#api.control">Управление сервером</a></li>
<li><a href="#api.other">Дополнительные функции и возможности</a></li>
</ul>
<li><a href="#other-soft">Дополнительные программы и средства </a>
<ul>
<li><a href="#MIME-macro">Генерация файла MIME типов</a></li>
<li><a href="#redirect">Модуль перенаправления запросов</a></li>
<li><a href="#block_access">Модуль блокировки доступа к файлам</a></li>
</ul>
</li>
<li><a href="#Bugs">Известные баги и особенности</a></li>
@@ -80,15 +93,28 @@
<p> Данный раздел может содержать множество элементов, представленных в виде: <br>
<code>uri_path=file_name;cmdline</code> , где </p>
<ul>
<li><b>uri_path</b> - uri путь ресурса без начального "/" </li>
<li><b>uri_path</b> - uri путь ресурса с начальным символом "/" </li>
<li><b>file_name</b> - путь к файлу модуля, относительно "modules_dir"</li>
<li><b>cmdline</b> - Строка передаваемая модулю во время инициализации каждого ресурса, ассоциированного с ним</li>
</ul>
<p>
<b>Особенности работы:</b> каждый модуль добавляется последовательно и поиск нужного модуля также производится последовательно. Из-за этой особенности нужно учитывать расположение uri в данной секции.
Для того, чтобы uri модуля сравнивался с путём в запросе раньше всех остальных он должен находится в самом конце списка, чтобы
</p>
<p><b>Примечание:</b> В качестве uri_path и cmdline может использоваться строка в UTF-8 с любыми символами, но путь к модулю
всегда должен использовать только ASCII символы. Кодировка cmdline не стандартизированна, но желательно использовать
ASCII символы и проверять какую кодировку поддерживаем модуль.</p>
всегда должен использовать только ASCII символы и не использовать символ ",". Кодировка cmdline не стандартизированна, но желательно использовать
ASCII символы и проверять какую кодировку поддерживает модуль.</p>
<p> Сервер имеет возможность установить модуль для некоторого диапазона uri путей, для этого используется символ "*", обозначающий неопределённое количество(включая ноль) любых символов.
Например: При наличии записи <code>/img/*=img_module.obj</code> в секции модулей, сервер будет вызывать модуль для любых uri путей, имеющих в начале "/img/".
Также для установки модуля на все возможные uri пути необходимо прописать соответствие модуля с путём "/*".
</p>
<p> Другие примеры:
<code>*.lua=lua_module.obj</code> Любой путь, имеющий в конце ".lua".<br>
<code>*/.*=err401.obj</code> Любой путь, имеющий в названии директорию, начинающуюся с символа ".".<br>
</p>
</li>
<li><code>[TLS]</code>
<p><b>ВНИМАНИЕ!!! TLS шифрование на данный момент не поддерживается сервером</b></p>
<p>Данный раздел содержит необходимые данные для использования TLS сервером. Все поля обязательны для заполнения.</p>
<ul>
<li><code>mbedtls</code><p> Полный путь до библиотеки MbedTLS.</p></li>
@@ -114,7 +140,7 @@
По своей структуре, модуль является обычной динамической библиотекой, экспортирующей 3 специальные функции:
</p>
<ol>
<li><code>uint32_t __stdcall httpd_init(IMPORT_DATA* import, char* cmdline)</code>
<li><code>uint32_t __stdcall httpd_init(IMPORT_DATA* import, char* cmdline, char* uri_path)</code>
<p> Функция для инициализации ресурса(uri_path), ассоциированного с модулем .
В файле конфигурации для каждого ресурса можно добавить командную строку, передаваемую в эту функцию. Например
@@ -146,7 +172,7 @@
данные. После завершения всех модулей сервер полностью завершает свою работу.</p>
</li>
</ol>
<h3>Создание ответа на запрос</h3>
<h3 id="api.response">Создание ответа на запрос</h3>
<p> Любой запрос так или иначе требует ответа со стороны модуля. Этот ответ можно отправить используя экспортируемые ядром функции,
позволяющие создать экземпляр класса RESPD и через него производить отправку ответа на запрос.
</p>
@@ -160,7 +186,7 @@
</thead>
<tbody>
<tr><td>Статус ответа</td><td>"200"</td> </tr>
<tr><td>Версия протокола</td><td>"HTTP/1.1 "</td></tr>
<tr><td>Версия протокола</td><td>"HTTP/1.1"</td></tr>
<tr><td>Content-type</td><td>"text/html"</td></tr>
</tbody>
</table>
@@ -206,7 +232,7 @@
<p>В использовании функций добавления дополнительных заголовков и изменения версии есть особенность: строки должны существовать
до момента деструктуризации объекта RESPD. Также модуль сам должен отслеживать и освобождать память под эти строки.
</p>
<h3>Обработка данных запроса </h3>
<h3 id="api.request">Обработка данных запроса </h3>
<ul>
<li><code>char* __stdcall find_uri_arg(CONNECT_DATA* session, char* key); </code>
<p>Функция производит поиск аргумента uri строки по его названию. Если аргумент найден, то возвращается указатель на
@@ -216,10 +242,14 @@
<p>Функция производит поиск http заголовка по его названию. Если аргумент найден, то возвращается указатель на
строку с его значением, иначе ноль</p>
</li>
<p>Для получения остальной информации, такой как: метод запроса, версии протокола, фрагмент uri строки и тело сообщения;
<li><code>uint32_t __stdcall read_http_body(CONNECT_DATA* session, char* buff, uint32_t len);</code>
<p>Функция производит чтение части содержимого http запроса в буфер и возвращает количество прочитанных байт.
В случае ошибки сервер вернёт значение -1</p>
</li>
<p>Для получения остальной информации, такой как: метод запроса, версии протокола и фрагмент uri строки
используется доступ к структуре CONNECT_DATA. Описание этой структуры есть в файле modules_api.inc репозитория.</p>
</ul>
<h3>Работа с файлами</h3>
<h3 id="api.file">Работа с файлами</h3>
<ul>
<li><code>void __stdcall FileInitFILED(FILED* buffer, char* path);</code>
<p> Функция производит инициализацию структуры FILED для её использования в файловых операциях.</p>
@@ -246,13 +276,13 @@
</ul>
<p><b>Примечание:</b> Все пути на файл или директорию должны быть в кодировке UTF-8 или совместимой с ней ASCII.
Строки должны использовать Null-турминатор. Кодировки UTF-16LE, cp866, cp1251 и тд нельзя использовать.</p>
<h3>Управление сервером</h3>
<h3 id="api.control">Управление сервером</h3>
<code>void close_server();</code>
<p> Функция производит завершение работы всех модулей, и основного потока этого сервера. На время завершения работы модулей сервер
блокирует все новые подключения, позволяя модулям завершить открытые соединения.
</p>
<h3>Дополнительные функции</h3>
<h3 id="api.other">Дополнительные функции и возможности</h3>
<code>char* __stdcall Get_MIME_Type(FILED* fd);</code>
<p> Функция производит анализ названия файла по его структуре FILED и возвращает MIME тип, соответствующий расширению файла.
Данные о MIME типах берутся из встроенной таблицы соответствий либо из дополнительно загружаемого <a href="#MIME-macro">файла</a>.
@@ -275,7 +305,18 @@
</li>
</ol>
</p>
<h3>Что-то</h3>
<h3 id="redirect">Модуль перенаправления запросов</h3>
<p>
При эксплуатации сервера может потребоваться возможность перенаправить запросы на какой-либо определённый файл(например на index.html) или модуль. Для данных целей к серверу был создан модуль "redirect.obj", позволяющий огранизовать перенаправление на определённые ресурсы как в пределах сервера, так и на внешние ресурсы. Для использования модуля необходимо задать модуль для всех необходимых uri путей и прописать для каждого такого uri командную строку, содержащую либо полный путь к ресурсу на этом сервере, либо полную uri ссылку. Пример использования:
</p>
<code>/=redirect.obj, /docs/index.htm</code> <p> перенаправление запросов на главную страницу сервера из корня.</p>
<h3 id="block_access">Модуль блокировки доступа к файлам </h3>
<p>
При работе сервера, модули могут создавать различные "системные" файлы, например логи, к которым должен быть заблокирован доступ из запросов клиентов. Для этих целей к серверу был создан модуль "block_access.obj", позволяющий задать http код статуса и короткое сообщение в теле ответа сервера. Для использования необходимо связать модуль с uri путём и задать строку параметров: код статуса ответа и, через пробел, короткое сообщение. Пример использования:
</p>
<code>*/.*=block_access.obj, 400 access error</code> <p>Блокировка доступа к файлам и дерикториям начинающимся с символа "." .</p>
<p>Также можно не указывать текстовое сообщение, тогда сервер отправит только http статус. Если не указывать никаких параметров, то сервер будет по умолчанию отправлять код "403".</p>
<!-- Баги -->
<hr>