mirror of
https://github.com/Doczom/simple-httpd.git
synced 2025-09-21 22:53:54 +02:00
Update to 0.2.4 version
Added suport for UTF-8 paths of file and uri name. Update docs file Translate commentaries
This commit is contained in:
@@ -6,10 +6,6 @@ port=80
|
|||||||
; count open connection
|
; count open connection
|
||||||
conn=100
|
conn=100
|
||||||
|
|
||||||
; 1000 - no parse http headers, raw data in CONNECT_DATA.message_body
|
|
||||||
; This flags using for http/2.0 and other protocol execution.
|
|
||||||
;flags=0000 ; parsing http headers
|
|
||||||
|
|
||||||
; directory for find files
|
; directory for find files
|
||||||
work_dir=/usbhd0/3/server_data
|
work_dir=/usbhd0/3/server_data
|
||||||
; directory for find units(library)
|
; directory for find units(library)
|
||||||
@@ -23,5 +19,11 @@ mime_file=/usbhd0/3/mime_types.bin
|
|||||||
; not uning ' ' in unit_name;cmdline : "path = unit_name ; cmdline" is bad name
|
; not uning ' ' in unit_name;cmdline : "path = unit_name ; cmdline" is bad name
|
||||||
test=test_unit.obj
|
test=test_unit.obj
|
||||||
rasp=test_unit_2.obj
|
rasp=test_unit_2.obj
|
||||||
|
t1=test_unit4.obj; nrjkgfehkfgbvrjbgjkbdkg
|
||||||
|
t2=test_unit4.obj; -loadfile=file
|
||||||
|
t3=test_unit4.obj; -database="file.sqlite"
|
||||||
|
t4=test_unit4.obj
|
||||||
|
test5=test_unit5.obj
|
||||||
|
admin=srv_control.obj;123456
|
||||||
;database/sqlite3=sqlite3_serv.obj
|
;database/sqlite3=sqlite3_serv.obj
|
||||||
;database/cvs=cvs_table_server.obj
|
;database/cvs=cvs_table_server.obj
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -3,23 +3,40 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta lang="ru">
|
<meta lang="ru">
|
||||||
<title>Simple-httpd</title>
|
<title>Simple-httpd</title>
|
||||||
|
<style>
|
||||||
|
code {
|
||||||
|
background-color: #babfc766;
|
||||||
|
}
|
||||||
|
.menu {
|
||||||
|
background-color: aliceblue;
|
||||||
|
border: 1px solid black;
|
||||||
|
width: 40%;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
margin-left: 20pt;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Simple-httpd</h1>
|
<h1>Simple-httpd</h1>
|
||||||
|
|
||||||
<h2>Оглавление:</h2>
|
<div class="menu">
|
||||||
<ul>
|
<h2>Оглавление:</h2>
|
||||||
<li><a href="#about">Описание программы и её возможностей</a></li>
|
<ul>
|
||||||
<li><a href="#install">Установка и настройка</a></li>
|
<li><a href="#about">Описание программы и её возможностей</a></li>
|
||||||
<li><a href="#api">Документация на API модулей</a></li>
|
<li><a href="#install">Установка и настройка</a></li>
|
||||||
<li><a href="#other-soft">Дополнительные программы и средства </a>
|
<li><a href="#api">Документация на API модулей</a></li>
|
||||||
<ul>
|
<li><a href="#other-soft">Дополнительные программы и средства </a>
|
||||||
<li><a href="#MIME-macro">Генерация файла MIME типов</a></li>
|
<ul>
|
||||||
</ul>
|
<li><a href="#MIME-macro">Генерация файла MIME типов</a></li>
|
||||||
</li>
|
</ul>
|
||||||
<li><a href="#Bugs">Известные баги и особенности</a></li>
|
</li>
|
||||||
</ul>
|
<li><a href="#Bugs">Известные баги и особенности</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
<!-- Описание -->
|
<!-- Описание -->
|
||||||
@@ -40,6 +57,7 @@
|
|||||||
<p>
|
<p>
|
||||||
Дальнейшая настройка содержимого директории зависит от значений в файле httpd.ini .
|
Дальнейшая настройка содержимого директории зависит от значений в файле httpd.ini .
|
||||||
</p>
|
</p>
|
||||||
|
<p><b>Примечание:</b> Файл должен использовать кодировку UTF-8. Другие кодировки могут привести к неправильной работе сервера.</p>
|
||||||
<p>
|
<p>
|
||||||
В файле конфигурации можно выделяются 3 основных раздела:
|
В файле конфигурации можно выделяются 3 основных раздела:
|
||||||
<ol>
|
<ol>
|
||||||
@@ -55,6 +73,7 @@
|
|||||||
<li><code>modules_dir</code><p> Директория, относительно которой в разделе [MODULES] указываются модули расширения.</p></li>
|
<li><code>modules_dir</code><p> Директория, относительно которой в разделе [MODULES] указываются модули расширения.</p></li>
|
||||||
<li><code></code><p> </p></li>
|
<li><code></code><p> </p></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<p><b>Примечание:</b> В качестве modules_dir могут использоватьбся только ASCII символы.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<code>[MODULES]</code>
|
<code>[MODULES]</code>
|
||||||
@@ -65,6 +84,9 @@
|
|||||||
<li><b>file_name</b> - путь к файлу модуля, относительно "modules_dir"</li>
|
<li><b>file_name</b> - путь к файлу модуля, относительно "modules_dir"</li>
|
||||||
<li><b>cmdline</b> - Строка передаваемая модулю во время инициализации каждого ресурса, ассоциированного с ним</li>
|
<li><b>cmdline</b> - Строка передаваемая модулю во время инициализации каждого ресурса, ассоциированного с ним</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<p><b>Примечание:</b> В качестве uri_path и cmdline может использоваться строка в UTF-8 с любыми символами, но путь к модулю
|
||||||
|
всегда должен использовать только ASCII символы. Кодировка cmdline не стандартизированна, но желательно использовать
|
||||||
|
ASCII символы и проверять какую кодировку поддерживаем модуль.</p>
|
||||||
</li>
|
</li>
|
||||||
<li><code>[TLS]</code>
|
<li><code>[TLS]</code>
|
||||||
<p>Данный раздел содержит необходимые данные для использования TLS сервером. Все поля обязательны для заполнения.</p>
|
<p>Данный раздел содержит необходимые данные для использования TLS сервером. Все поля обязательны для заполнения.</p>
|
||||||
@@ -98,6 +120,9 @@
|
|||||||
|
|
||||||
<code> test3=test_unit4.obj; -database="file.sqlite" </code>
|
<code> test3=test_unit4.obj; -database="file.sqlite" </code>
|
||||||
|
|
||||||
|
Для большей совместимости рекомендуется обрабатывать эту командную строку в кодировке UTF-8.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
При успешной инициализации функция должна вернуть ненулевое значение, если же инициализация прошла неуспешно, то должен возвращаться ноль.
|
При успешной инициализации функция должна вернуть ненулевое значение, если же инициализация прошла неуспешно, то должен возвращаться ноль.
|
||||||
</p>
|
</p>
|
||||||
<p> Также для дальнейшей работы модуля предаётся указатель на таблицу экспортируемых сервером функций.</p>
|
<p> Также для дальнейшей работы модуля предаётся указатель на таблицу экспортируемых сервером функций.</p>
|
||||||
@@ -134,9 +159,9 @@
|
|||||||
<tr><th>Параметр</th><th>Значение</th></tr>
|
<tr><th>Параметр</th><th>Значение</th></tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><th>Статус ответа</th><th>"200"</th> </tr>
|
<tr><td>Статус ответа</td><td>"200"</td> </tr>
|
||||||
<tr><th>Версия протокола</th><th>"HTTP/1.1 "</th></tr>
|
<tr><td>Версия протокола</td><td>"HTTP/1.1 "</td></tr>
|
||||||
<tr><th>Content-type</th><th>"text/html"</th></tr>
|
<tr><td>Content-type</td><td>"text/html"</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p> Также разработчик может указать битовые флаги конфигурации ответа, например следующие:</p>
|
<p> Также разработчик может указать битовые флаги конфигурации ответа, например следующие:</p>
|
||||||
@@ -219,6 +244,8 @@
|
|||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<p><b>Примечание:</b> Все пути на файл или директорию должны быть в кодировке UTF-8 или совместимой с ней ASCII.
|
||||||
|
Строки должны использовать Null-турминатор. Кодировки UTF-16LE, cp866, cp1251 и тд нельзя использовать.</p>
|
||||||
<h3>Управление сервером</h3>
|
<h3>Управление сервером</h3>
|
||||||
<code>void close_server();</code>
|
<code>void close_server();</code>
|
||||||
<p> Функция производит завершение работы всех модулей, и основного потока этого сервера. На время завершения работы модулей сервер
|
<p> Функция производит завершение работы всех модулей, и основного потока этого сервера. На время завершения работы модулей сервер
|
||||||
@@ -256,9 +283,8 @@
|
|||||||
<ol>
|
<ol>
|
||||||
<li>Сетевой стек нестабилен и что-то может пойти не так.</li>
|
<li>Сетевой стек нестабилен и что-то может пойти не так.</li>
|
||||||
<li>При отправки больших объёмов данных может быть утеря или изменение порядка пакетов</li>
|
<li>При отправки больших объёмов данных может быть утеря или изменение порядка пакетов</li>
|
||||||
<li>Сервер пока не умеет обрабатывать %XX символы в пути до ресурса</li>
|
<li>Отсутствует поддержка частичных http запросов</li>
|
||||||
<li>Сервер не рассчитан на большие нагрузки</li>
|
<li>Сервер не рассчитан на большие нагрузки</li>
|
||||||
<li>Все пути в конфигурации сервера должны быть в ascii и без русских символов</li>
|
|
||||||
<li>Отсутствует поддержка TLS</li>
|
<li>Отсутствует поддержка TLS</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
|
@@ -3,23 +3,40 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta lang="ru">
|
<meta lang="ru">
|
||||||
<title>Simple-httpd</title>
|
<title>Simple-httpd</title>
|
||||||
|
<style>
|
||||||
|
code {
|
||||||
|
background-color: #babfc766;
|
||||||
|
}
|
||||||
|
.menu {
|
||||||
|
background-color: aliceblue;
|
||||||
|
border: 1px solid black;
|
||||||
|
width: 40%;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
margin-left: 20pt;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Simple-httpd</h1>
|
<h1>Simple-httpd</h1>
|
||||||
|
|
||||||
<h2>Оглавление:</h2>
|
<div class="menu">
|
||||||
<ul>
|
<h2>Оглавление:</h2>
|
||||||
<li><a href="#about">Описание программы и её возможностей</a></li>
|
<ul>
|
||||||
<li><a href="#install">Установка и настройка</a></li>
|
<li><a href="#about">Описание программы и её возможностей</a></li>
|
||||||
<li><a href="#api">Документация на API модулей</a></li>
|
<li><a href="#install">Установка и настройка</a></li>
|
||||||
<li><a href="#other-soft">Дополнительные программы и средства </a>
|
<li><a href="#api">Документация на API модулей</a></li>
|
||||||
<ul>
|
<li><a href="#other-soft">Дополнительные программы и средства </a>
|
||||||
<li><a href="#MIME-macro">Генерация файла MIME типов</a></li>
|
<ul>
|
||||||
</ul>
|
<li><a href="#MIME-macro">Генерация файла MIME типов</a></li>
|
||||||
</li>
|
</ul>
|
||||||
<li><a href="#Bugs">Известные баги и особенности</a></li>
|
</li>
|
||||||
</ul>
|
<li><a href="#Bugs">Известные баги и особенности</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
<!-- Описание -->
|
<!-- Описание -->
|
||||||
@@ -40,6 +57,7 @@
|
|||||||
<p>
|
<p>
|
||||||
Дальнейшая настройка содержимого директории зависит от значений в файле httpd.ini .
|
Дальнейшая настройка содержимого директории зависит от значений в файле httpd.ini .
|
||||||
</p>
|
</p>
|
||||||
|
<p><b>Примечание:</b> Файл должен использовать кодировку UTF-8. Другие кодировки могут привести к неправильной работе сервера.</p>
|
||||||
<p>
|
<p>
|
||||||
В файле конфигурации можно выделяются 3 основных раздела:
|
В файле конфигурации можно выделяются 3 основных раздела:
|
||||||
<ol>
|
<ol>
|
||||||
@@ -55,6 +73,7 @@
|
|||||||
<li><code>modules_dir</code><p> Директория, относительно которой в разделе [MODULES] указываются модули расширения.</p></li>
|
<li><code>modules_dir</code><p> Директория, относительно которой в разделе [MODULES] указываются модули расширения.</p></li>
|
||||||
<li><code></code><p> </p></li>
|
<li><code></code><p> </p></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<p><b>Примечание:</b> В качестве modules_dir могут использоватьбся только ASCII символы.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<code>[MODULES]</code>
|
<code>[MODULES]</code>
|
||||||
@@ -65,6 +84,9 @@
|
|||||||
<li><b>file_name</b> - путь к файлу модуля, относительно "modules_dir"</li>
|
<li><b>file_name</b> - путь к файлу модуля, относительно "modules_dir"</li>
|
||||||
<li><b>cmdline</b> - Строка передаваемая модулю во время инициализации каждого ресурса, ассоциированного с ним</li>
|
<li><b>cmdline</b> - Строка передаваемая модулю во время инициализации каждого ресурса, ассоциированного с ним</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<p><b>Примечание:</b> В качестве uri_path и cmdline может использоваться строка в UTF-8 с любыми символами, но путь к модулю
|
||||||
|
всегда должен использовать только ASCII символы. Кодировка cmdline не стандартизированна, но желательно использовать
|
||||||
|
ASCII символы и проверять какую кодировку поддерживаем модуль.</p>
|
||||||
</li>
|
</li>
|
||||||
<li><code>[TLS]</code>
|
<li><code>[TLS]</code>
|
||||||
<p>Данный раздел содержит необходимые данные для использования TLS сервером. Все поля обязательны для заполнения.</p>
|
<p>Данный раздел содержит необходимые данные для использования TLS сервером. Все поля обязательны для заполнения.</p>
|
||||||
@@ -98,6 +120,9 @@
|
|||||||
|
|
||||||
<code> test3=test_unit4.obj; -database="file.sqlite" </code>
|
<code> test3=test_unit4.obj; -database="file.sqlite" </code>
|
||||||
|
|
||||||
|
Для большей совместимости рекомендуется обрабатывать эту командную строку в кодировке UTF-8.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
При успешной инициализации функция должна вернуть ненулевое значение, если же инициализация прошла неуспешно, то должен возвращаться ноль.
|
При успешной инициализации функция должна вернуть ненулевое значение, если же инициализация прошла неуспешно, то должен возвращаться ноль.
|
||||||
</p>
|
</p>
|
||||||
<p> Также для дальнейшей работы модуля предаётся указатель на таблицу экспортируемых сервером функций.</p>
|
<p> Также для дальнейшей работы модуля предаётся указатель на таблицу экспортируемых сервером функций.</p>
|
||||||
@@ -134,9 +159,9 @@
|
|||||||
<tr><th>Параметр</th><th>Значение</th></tr>
|
<tr><th>Параметр</th><th>Значение</th></tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><th>Статус ответа</th><th>"200"</th> </tr>
|
<tr><td>Статус ответа</td><td>"200"</td> </tr>
|
||||||
<tr><th>Версия протокола</th><th>"HTTP/1.1 "</th></tr>
|
<tr><td>Версия протокола</td><td>"HTTP/1.1 "</td></tr>
|
||||||
<tr><th>Content-type</th><th>"text/html"</th></tr>
|
<tr><td>Content-type</td><td>"text/html"</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p> Также разработчик может указать битовые флаги конфигурации ответа, например следующие:</p>
|
<p> Также разработчик может указать битовые флаги конфигурации ответа, например следующие:</p>
|
||||||
@@ -219,6 +244,8 @@
|
|||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<p><b>Примечание:</b> Все пути на файл или директорию должны быть в кодировке UTF-8 или совместимой с ней ASCII.
|
||||||
|
Строки должны использовать Null-турминатор. Кодировки UTF-16LE, cp866, cp1251 и тд нельзя использовать.</p>
|
||||||
<h3>Управление сервером</h3>
|
<h3>Управление сервером</h3>
|
||||||
<code>void close_server();</code>
|
<code>void close_server();</code>
|
||||||
<p> Функция производит завершение работы всех модулей, и основного потока этого сервера. На время завершения работы модулей сервер
|
<p> Функция производит завершение работы всех модулей, и основного потока этого сервера. На время завершения работы модулей сервер
|
||||||
@@ -256,9 +283,8 @@
|
|||||||
<ol>
|
<ol>
|
||||||
<li>Сетевой стек нестабилен и что-то может пойти не так.</li>
|
<li>Сетевой стек нестабилен и что-то может пойти не так.</li>
|
||||||
<li>При отправки больших объёмов данных может быть утеря или изменение порядка пакетов</li>
|
<li>При отправки больших объёмов данных может быть утеря или изменение порядка пакетов</li>
|
||||||
<li>Сервер пока не умеет обрабатывать %XX символы в пути до ресурса</li>
|
<li>Отсутствует поддержка частичных http запросов</li>
|
||||||
<li>Сервер не рассчитан на большие нагрузки</li>
|
<li>Сервер не рассчитан на большие нагрузки</li>
|
||||||
<li>Все пути в конфигурации сервера должны быть в ascii и без русских символов</li>
|
|
||||||
<li>Отсутствует поддержка TLS</li>
|
<li>Отсутствует поддержка TLS</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
|
12
httpd.asm
12
httpd.asm
@@ -4,7 +4,7 @@
|
|||||||
; ;
|
; ;
|
||||||
; httpd - Simple http server for Kolibri OS. ;
|
; httpd - Simple http server for Kolibri OS. ;
|
||||||
; ;
|
; ;
|
||||||
; Version 0.2.3, 31 March 2024 ;
|
; Version 0.2.3, 07 April 2024 ;
|
||||||
; ;
|
; ;
|
||||||
;*****************************************************************************;
|
;*****************************************************************************;
|
||||||
|
|
||||||
@@ -205,11 +205,11 @@ thread_connect:
|
|||||||
call file_server.err_http_501
|
call file_server.err_http_501
|
||||||
.end_work:
|
.end_work:
|
||||||
add esp, 2048
|
add esp, 2048
|
||||||
; free OUT buffer
|
; ; free OUT buffer
|
||||||
cmp dword[esp + CONNECT_DATA.buffer_response], 0
|
; cmp dword[esp + CONNECT_DATA.buffer_response], 0
|
||||||
jz .err_recv_sock
|
; jz .err_recv_sock
|
||||||
push dword[esp + CONNECT_DATA.buffer_response]
|
; push dword[esp + CONNECT_DATA.buffer_response]
|
||||||
call Free
|
; call Free
|
||||||
.err_recv_sock:
|
.err_recv_sock:
|
||||||
; free IN buffer
|
; free IN buffer
|
||||||
cmp dword[esp + CONNECT_DATA.buffer_request], 0
|
cmp dword[esp + CONNECT_DATA.buffer_request], 0
|
||||||
|
@@ -66,49 +66,58 @@
|
|||||||
; db 13, 10
|
; db 13, 10
|
||||||
;.size = $ - http_err_response
|
;.size = $ - http_err_response
|
||||||
|
|
||||||
|
align 4
|
||||||
default_http_version:
|
default_http_version:
|
||||||
db 'HTTP/1.1 '
|
db 'HTTP/1.1 '
|
||||||
.length = $ - default_http_version
|
.length = $ - default_http_version
|
||||||
|
|
||||||
|
align 4
|
||||||
default_http_connection:
|
default_http_connection:
|
||||||
db 'Connection: '
|
db 'Connection: '
|
||||||
.value = $ - default_http_connection
|
.value = $ - default_http_connection
|
||||||
db 'close ', 13, 10 ; or keep-alive
|
db 'close ', 13, 10 ; or keep-alive
|
||||||
.length = $ - default_http_connection
|
.length = $ - default_http_connection
|
||||||
|
|
||||||
|
align 4
|
||||||
default_http_cont_encod:
|
default_http_cont_encod:
|
||||||
db 'Content-Encoding: identity', 13, 10
|
db 'Content-Encoding: identity', 13, 10
|
||||||
.length = $ - default_http_cont_encod
|
.length = $ - default_http_cont_encod
|
||||||
|
|
||||||
|
align 4
|
||||||
default_http_cont_type:
|
default_http_cont_type:
|
||||||
db 'Content-type: '
|
db 'Content-type: '
|
||||||
.value = $ - default_http_cont_type
|
.value = $ - default_http_cont_type
|
||||||
db 'text/html ', 13, 10;
|
db 'text/html ', 13, 10;
|
||||||
.length = $ - default_http_cont_type
|
.length = $ - default_http_cont_type
|
||||||
|
|
||||||
|
align 4
|
||||||
default_http_cache_ctl:
|
default_http_cache_ctl:
|
||||||
db 'Cache-Control: no-cache', 13, 10
|
db 'Cache-Control: no-cache', 13, 10
|
||||||
.length = $ - default_http_cache_ctl
|
.length = $ - default_http_cache_ctl
|
||||||
|
|
||||||
|
align 4
|
||||||
default_http_cont_len:
|
default_http_cont_len:
|
||||||
db 'Content-length: '
|
db 'Content-length: '
|
||||||
db '0000000000000000000000', 13, 10
|
db '0000000000000000000000', 13, 10
|
||||||
.length = $ - default_http_cont_len
|
.length = $ - default_http_cont_len
|
||||||
|
|
||||||
|
align 4
|
||||||
default_http_header_server:
|
default_http_header_server:
|
||||||
db 'Server: simple-httpd/0.3.0', 13, 10
|
db 'Server: simple-httpd/0.3.0', 13, 10
|
||||||
.length = $ - default_http_header_server
|
.length = $ - default_http_header_server
|
||||||
|
|
||||||
|
align 4
|
||||||
http_header_transfer_chunked:
|
http_header_transfer_chunked:
|
||||||
db 'Transfer-Encoding: chunked', 13, 10
|
db 'Transfer-Encoding: chunked', 13, 10
|
||||||
.length = $ - http_header_transfer_chunked
|
.length = $ - http_header_transfer_chunked
|
||||||
|
|
||||||
|
;align 4
|
||||||
;default_http_date_header:
|
;default_http_date_header:
|
||||||
; db 'Date: '
|
; db 'Date: '
|
||||||
;.date: db 'Sun, 30 Oct 2022 09:29:13 GMT',13, 10
|
;.date: db 'Sun, 30 Oct 2022 09:29:13 GMT',13, 10
|
||||||
;.length = $ - default_http_date_header
|
;.length = $ - default_http_date_header
|
||||||
|
|
||||||
|
align 4
|
||||||
http_response_err_501:
|
http_response_err_501:
|
||||||
db 'HTTP/1.1 '
|
db 'HTTP/1.1 '
|
||||||
db '501 ',13, 10
|
db '501 ',13, 10
|
||||||
@@ -118,6 +127,7 @@ http_response_err_501:
|
|||||||
db 13, 10
|
db 13, 10
|
||||||
.size = $ - http_response_err_501
|
.size = $ - http_response_err_501
|
||||||
|
|
||||||
|
align 4
|
||||||
http_response_err_404:
|
http_response_err_404:
|
||||||
db 'HTTP/1.1 '
|
db 'HTTP/1.1 '
|
||||||
db '404 ',13, 10
|
db '404 ',13, 10
|
||||||
@@ -129,6 +139,7 @@ http_response_err_404:
|
|||||||
db 'The server could not find the requested page.'
|
db 'The server could not find the requested page.'
|
||||||
.size = $ - http_response_err_404
|
.size = $ - http_response_err_404
|
||||||
|
|
||||||
|
align 4
|
||||||
http_response_options:
|
http_response_options:
|
||||||
db 'HTTP/1.1 '
|
db 'HTTP/1.1 '
|
||||||
db '204 ',13, 10
|
db '204 ',13, 10
|
||||||
@@ -143,6 +154,7 @@ http_response_options:
|
|||||||
; "GET / HTTP/1.1" - 18 byte
|
; "GET / HTTP/1.1" - 18 byte
|
||||||
min_http_size = 18
|
min_http_size = 18
|
||||||
|
|
||||||
|
align 4
|
||||||
MIME_FILE_FORMAT:
|
MIME_FILE_FORMAT:
|
||||||
.html: db 5,'.html', 'text/html',0
|
.html: db 5,'.html', 'text/html',0
|
||||||
.css: db 4,'.css', 'text/css ',0
|
.css: db 4,'.css', 'text/css ',0
|
||||||
@@ -157,6 +169,7 @@ MIME_FILE_FORMAT:
|
|||||||
.other: dd 0
|
.other: dd 0
|
||||||
db 'application/octet-stream',0 ; for unknow file - all file :)
|
db 'application/octet-stream',0 ; for unknow file - all file :)
|
||||||
|
|
||||||
|
align 4
|
||||||
STD_MIME_TYPE_ARR:
|
STD_MIME_TYPE_ARR:
|
||||||
dd MIME_FILE_FORMAT.html, \
|
dd MIME_FILE_FORMAT.html, \
|
||||||
MIME_FILE_FORMAT.css, \
|
MIME_FILE_FORMAT.css, \
|
||||||
@@ -173,5 +186,20 @@ _DIV_10_: dd 10
|
|||||||
_DIV_100_: dd 100
|
_DIV_100_: dd 100
|
||||||
_DIV_1000_: dd 1000
|
_DIV_1000_: dd 1000
|
||||||
|
|
||||||
|
align 4
|
||||||
hex_chars:
|
hex_chars:
|
||||||
db '0123456789ABCDEF'
|
db '0123456789ABCDEF'
|
||||||
|
|
||||||
|
align 16
|
||||||
|
hex_table db 256 dup -1
|
||||||
|
repeat 10
|
||||||
|
store byte %-1 at hex_table + '0' + %-1
|
||||||
|
end repeat
|
||||||
|
repeat 6
|
||||||
|
store byte 0x0A+%-1 at hex_table + 'A' + %-1
|
||||||
|
end repeat
|
||||||
|
repeat 6
|
||||||
|
store byte 0x0A+%-1 at hex_table + 'a' + %-1
|
||||||
|
end repeat
|
||||||
|
|
||||||
|
|
||||||
|
@@ -31,7 +31,7 @@ struct CONNECT_DATA ; 16*4 = 64 bytes
|
|||||||
num_headers dd 0 ; number items in REQUEST_DATA
|
num_headers dd 0 ; number items in REQUEST_DATA
|
||||||
http_headers dd 0 ; pointer to array REQUEST_DATA of HTTP headers
|
http_headers dd 0 ; pointer to array REQUEST_DATA of HTTP headers
|
||||||
uri_scheme dd 0 ; указатель на схему
|
uri_scheme dd 0 ; указатель на схему
|
||||||
uri_authority dd 0 ; pointer to struct ?
|
uri_authority dd 0 ; pointer to string(%XX not converted)
|
||||||
uri_path dd 0 ; указатель на декодированный путь к ресурсу(без параметров)
|
uri_path dd 0 ; указатель на декодированный путь к ресурсу(без параметров)
|
||||||
num_uri_args dd 0 ;
|
num_uri_args dd 0 ;
|
||||||
uri_arg dd 0 ; pointer to the REQUEST_DATA array of string uri arguments
|
uri_arg dd 0 ; pointer to the REQUEST_DATA array of string uri arguments
|
||||||
@@ -44,7 +44,7 @@ struct FILED
|
|||||||
offset rd 2
|
offset rd 2
|
||||||
size rd 1
|
size rd 1
|
||||||
buffer rd 1
|
buffer rd 1
|
||||||
rb 1
|
name_encode rd 1
|
||||||
path rd 1
|
path rd 1
|
||||||
end_path rd 1
|
end_path rd 1
|
||||||
ends
|
ends
|
||||||
|
47
parser.inc
47
parser.inc
@@ -24,9 +24,6 @@ parse_url:
|
|||||||
; \_/ \______________/\_________/ \_________/ \__/
|
; \_/ \______________/\_________/ \_________/ \__/
|
||||||
; | | | | |
|
; | | | | |
|
||||||
; scheme authority path query fragment
|
; scheme authority path query fragment
|
||||||
; | _____________________|__
|
|
||||||
; / \ / \
|
|
||||||
; urn:example:animal:ferret:nose
|
|
||||||
|
|
||||||
cmp byte[ecx], '/' ; check abs-path
|
cmp byte[ecx], '/' ; check abs-path
|
||||||
je .get_path
|
je .get_path
|
||||||
@@ -53,7 +50,7 @@ parse_url:
|
|||||||
ja .error_exit
|
ja .error_exit
|
||||||
|
|
||||||
inc ecx
|
inc ecx
|
||||||
;cmp byte[ecx - 1], ' ' ;check end, не нужно, так как в http всегда / абс путь
|
;cmp byte[ecx - 1], ' ' ;check end, in http always is used abs-path
|
||||||
|
|
||||||
cmp byte[ecx - 1], '/'
|
cmp byte[ecx - 1], '/'
|
||||||
jne @b
|
jne @b
|
||||||
@@ -61,20 +58,48 @@ parse_url:
|
|||||||
.get_path:
|
.get_path:
|
||||||
;ecx = path-absolute
|
;ecx = path-absolute
|
||||||
mov [esi + CONNECT_DATA.uri_path], ecx
|
mov [esi + CONNECT_DATA.uri_path], ecx
|
||||||
@@:
|
mov edi, ecx
|
||||||
|
mov al, byte[ecx]
|
||||||
|
.get_path.new_char:
|
||||||
|
stosb
|
||||||
inc ecx
|
inc ecx
|
||||||
|
|
||||||
cmp ecx, [esi + CONNECT_DATA.end_buffer_request]
|
cmp ecx, [esi + CONNECT_DATA.end_buffer_request]
|
||||||
ja .error_exit
|
ja .error_exit
|
||||||
|
|
||||||
cmp byte[ecx], '?'
|
mov al, byte[ecx]
|
||||||
|
mov byte[edi], 0
|
||||||
|
|
||||||
|
cmp al, '?'
|
||||||
je .get_query
|
je .get_query
|
||||||
|
|
||||||
cmp byte[ecx], '#'
|
cmp al, '#'
|
||||||
je .get_fragment
|
je .get_fragment
|
||||||
|
|
||||||
cmp byte[ecx], ' ' ; check end path
|
cmp al, ' ' ; check end path
|
||||||
jne @b
|
je .get_path.end
|
||||||
|
|
||||||
|
cmp al, '%' ; check end path
|
||||||
|
jne .get_path.new_char
|
||||||
|
|
||||||
|
; %00-%FF
|
||||||
|
inc ecx
|
||||||
|
movzx eax, byte[ecx]
|
||||||
|
mov al, byte[hex_table + eax]
|
||||||
|
cmp al, -1
|
||||||
|
je .error_exit
|
||||||
|
mov edx, eax
|
||||||
|
|
||||||
|
inc ecx
|
||||||
|
movzx eax, byte[ecx]
|
||||||
|
mov al, byte[hex_table + eax]
|
||||||
|
cmp al, -1
|
||||||
|
je .error_exit
|
||||||
|
shl edx, 4
|
||||||
|
add eax, edx
|
||||||
|
|
||||||
|
jmp .get_path.new_char
|
||||||
|
.get_path.end:
|
||||||
mov byte[ecx], 0
|
mov byte[ecx], 0
|
||||||
inc ecx
|
inc ecx
|
||||||
jmp .exit
|
jmp .exit
|
||||||
@@ -104,10 +129,10 @@ parse_url:
|
|||||||
cmp byte[ecx], '='
|
cmp byte[ecx], '='
|
||||||
je .get_args
|
je .get_args
|
||||||
|
|
||||||
cmp byte[ecx], '#' ; ЭТО БРЕД ПОЛНЫЙ, НО ВДРУГ
|
cmp byte[ecx], '#' ; THIS IS COMPLETE NONSENSE, BUT SUDDENLY
|
||||||
je .get_fragment
|
je .get_fragment
|
||||||
|
|
||||||
cmp byte[ecx], ' ' ; http://cjkhr.bvgbfdkvdf.dmejfgehf/?1pr1
|
cmp byte[ecx], ' ' ; http://cjkhr.bvgbfdkvdf.dmejfgehf/?1pr1
|
||||||
jne @b
|
jne @b
|
||||||
.exit_2:
|
.exit_2:
|
||||||
mov byte[ecx], 0
|
mov byte[ecx], 0
|
||||||
|
56
readme.md
56
readme.md
@@ -5,47 +5,35 @@
|
|||||||
Сервер отправляет содержимое файлов без сжатия в соответствии с заданной таблицей ассоциации MIME типа и расширения файла.
|
Сервер отправляет содержимое файлов без сжатия в соответствии с заданной таблицей ассоциации MIME типа и расширения файла.
|
||||||
Если запрос от клиента имеет uri путь который соответствует модулю сервера, то сервер передаёт управление коду в этом модуле с передачей всех необходимых для функционирования данных.
|
Если запрос от клиента имеет uri путь который соответствует модулю сервера, то сервер передаёт управление коду в этом модуле с передачей всех необходимых для функционирования данных.
|
||||||
|
|
||||||
|
## install
|
||||||
|
Для установки сервера на диск скопируйте файлы из директории bin данного репозитория. В этой директории находятся слудеющие файлы:
|
||||||
|
- `httpd` - исполняемый файл сервера
|
||||||
|
- `mime_types.bin` - файл с расширенной таблицей ассоцияции MIME типа с расширением файла
|
||||||
|
- `httpd.ini` - файл конфигурации сервера
|
||||||
|
|
||||||
## Configuration
|
и директории:
|
||||||
Для настройки сервера применяется файл конфигурации в формате ini, где указываются следующие параметры:
|
- `modules` - Директория в которой хранятся некоторые примеры модулей, для демонстрации возможностей сервера
|
||||||
|
- `server_data` - Директория для размещения статичных данных сервера. Изначально в ней находится только документация по использованию сервером.
|
||||||
|
|
||||||
В секции <CODE>MAIN</CODE>
|
Готовый файл конфигурации уже настроен для использование и ожидает, что всё содержимое директории bin репозитория будет размешено по пути `/usbhd0/3/`. По этому для установки достаточно скопировать содержимое в корень третьего раздела usb диска и запустить файл httpd .
|
||||||
- <CODE>ip</CODE> - ip адрес сервера
|
|
||||||
- <CODE>port</CODE> - порт для подключения (по умолчанию 80)
|
|
||||||
- <CODE>conn</CODE> - максимальное количество открытых соединений(по умолчанию 10)
|
|
||||||
- <CODE>work_dir</CODE> - директория для размещения файлов, отправляемых сервером
|
|
||||||
- <CODE>mime_file</CODE> - путь к файлу с таблицей сопоставлениея mime типов и расширений файлов (если не указан, то используется встроенная в сервер таблица сопоставления)
|
|
||||||
- <CODE>modules_dir</CODE> - директория расположения модулей сервера
|
|
||||||
|
|
||||||
В секции <CODE>MODULES</CODE> может находиться множество параметров, имеющих вид <CODE>uri_path=file_name;cmdline</CODE> где:
|
Подробная настройка сервера описана в документации, расположенной в директории doc этого репозитория.
|
||||||
- <CODE>uri_path</CODE> - путь указываемый клиентом во время запроса
|
|
||||||
- <CODE>file_name</CODE> - название/путь до файла модуля относительно <CODE>modules_dir</CODE>
|
|
||||||
- <CODE>cmdline</CODE> - строка параметров, которая передаётся в функцию инициализации модуля. Данное значение не обязательна и может не использоваться.
|
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
### Tasks on version 0.2.5
|
||||||
|
- Update srv_control module
|
||||||
|
- Добавить модуль тестовой авторизации(base64 code in header)
|
||||||
|
- Добавить модуль генерации более сложного контента
|
||||||
|
(create json object with data of CSV table)
|
||||||
|
- Добавить демонстрационный модуль на Си
|
||||||
|
- Добавить демонстрационный модуль на FPC
|
||||||
|
- Добавить модуль демонстрации cookie
|
||||||
|
- Добавить модуль демонстрации websockets
|
||||||
|
|
||||||
## API for modules
|
### Tasks on version 0.3.0
|
||||||
|
- Добавить поддержку TLS шифрования с использованием MbedTLS
|
||||||
К серверу можно подключить дополнительные модули в виде библиотек со специальными экспортируемыми функциями:
|
|
||||||
|
|
||||||
- <CODE> uint32_t stdcall httpd_init(IMPORT_DATA* import, char* cmdline) </CODE>
|
|
||||||
|
|
||||||
Эта функция служит для инициализации модуля для каждого связанного с модулем uri . В файле конфигурации для конкретного uri можно добавить командную строку, передаваемую в эту функцию. Например
|
|
||||||
|
|
||||||
``` test3=test_unit4.obj; -database="file.sqlite" ```
|
|
||||||
|
|
||||||
При успешной инициализации функция должна вернуть ненулевое значение, если же инициализация прошла неуспешно, то должен возвращаться ноль.
|
|
||||||
Для упрощения многих операций, сервер передаёт в функцию инициализации модуля таблицу некоторых функций, необходимых для работы с сетью, с файловой системой и прочими интерфейсами.
|
|
||||||
|
|
||||||
- <CODE> void stdcall httpd_serv(CONNECT_DATA* request_data, uint32_t pdata) </CODE>
|
|
||||||
Эта функция вызывается сервером при получении запроса с uri путём указанном в файле конфигурации для этого модуля.
|
|
||||||
Сервер передаёт в функцию контекст запроса, содержащий: аргументы, заголовки, тело запроса, http метод и версию; и значение возвращённое функцией httpd_init.
|
|
||||||
|
|
||||||
- <CODE>void stdcall httpd_close(uint32_t pdata) </CODE>
|
|
||||||
Эта функция вызывается сервером при завершении работы или в процессе управления сервером. Данная функция предназначена для корректного завершения работы модуля и освобождением связанных с ним ресурсов.
|
|
||||||
|
|
||||||
## Bugs
|
## Bugs
|
||||||
|
|
||||||
- Сервер не поддерживает работу с файлами, имеющими не ascii символы, так как не производит преобразование uri пути;
|
|
||||||
- В ходе тестов был обнаружена ошибка отправки "больших" файлов. Это баг сетевого стека;
|
- В ходе тестов был обнаружена ошибка отправки "больших" файлов. Это баг сетевого стека;
|
||||||
- При длительной работе сервер может начать "подзависать" или перестать отвечать на сообщения. Это баг сетевого стека.
|
- При длительной работе сервер может начать "подзависать" или перестать отвечать на сообщения. Это баг сетевого стека.
|
||||||
|
15
sys_func.inc
15
sys_func.inc
@@ -198,10 +198,10 @@ FileInfo:
|
|||||||
mov dword[esp + FILED.opcode], 5 ; file info
|
mov dword[esp + FILED.opcode], 5 ; file info
|
||||||
mov dword[esp + FILED.offset + 4], 0 ; zero flag
|
mov dword[esp + FILED.offset + 4], 0 ; zero flag
|
||||||
mov dword[esp + FILED.buffer], edx
|
mov dword[esp + FILED.buffer], edx
|
||||||
mov byte[esp + FILED.path - 1], 0
|
mov dword[esp + FILED.name_encode], 3 ;UTF-8
|
||||||
mov dword[esp + FILED.path], ecx
|
mov dword[esp + FILED.path], ecx
|
||||||
mov ebx, esp
|
mov ebx, esp
|
||||||
mcall 70
|
mcall 80
|
||||||
add esp, sizeof.FILED
|
add esp, sizeof.FILED
|
||||||
pop ebx
|
pop ebx
|
||||||
ret 8
|
ret 8
|
||||||
@@ -210,12 +210,13 @@ FileInfo:
|
|||||||
FileInitFILED:
|
FileInitFILED:
|
||||||
push ecx edi
|
push ecx edi
|
||||||
mov edi, [esp + 4*2 + 4]
|
mov edi, [esp + 4*2 + 4]
|
||||||
mov ecx, sizeof.FILED
|
mov ecx, sizeof.FILED/4
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
rep stosb
|
rep stosd
|
||||||
mov eax, [esp + 4*2 + 4]
|
mov eax, [esp + 4*2 + 4]
|
||||||
mov ecx, [esp + 4*2 + 8]
|
mov ecx, [esp + 4*2 + 8]
|
||||||
mov [eax + FILED.path], ecx
|
mov [eax + FILED.path], ecx
|
||||||
|
mov dword[eax + FILED.name_encode], 3 ;UTF-8
|
||||||
dec ecx
|
dec ecx
|
||||||
@@:
|
@@:
|
||||||
inc ecx
|
inc ecx
|
||||||
@@ -239,7 +240,7 @@ FileRead:
|
|||||||
mov [eax + FILED.buffer], ecx
|
mov [eax + FILED.buffer], ecx
|
||||||
|
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
mcall 70
|
mcall 80
|
||||||
|
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz @f
|
jz @f
|
||||||
@@ -280,10 +281,10 @@ FileReadOfName:
|
|||||||
mov dword[esp + FILED.offset + 4], 0
|
mov dword[esp + FILED.offset + 4], 0
|
||||||
mov dword[esp + FILED.size], eax
|
mov dword[esp + FILED.size], eax
|
||||||
mov dword[esp + FILED.buffer], edx
|
mov dword[esp + FILED.buffer], edx
|
||||||
mov byte[esp + FILED.path - 1], 0
|
mov dword[esp + FILED.name_encode], 3 ;UTF-8
|
||||||
mov dword[esp + FILED.path], ecx
|
mov dword[esp + FILED.path], ecx
|
||||||
mov ebx, esp
|
mov ebx, esp
|
||||||
mcall 70
|
mcall 80
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz @f
|
jz @f
|
||||||
cmp eax, 6 ; EOF
|
cmp eax, 6 ; EOF
|
||||||
|
Reference in New Issue
Block a user