mirror of
https://github.com/Doczom/simple-httpd.git
synced 2025-09-21 02:50:09 +02:00
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:
@@ -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>
|
||||
|
Reference in New Issue
Block a user