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:
2024-04-07 20:22:19 +05:00
parent 481c66f38c
commit aca8a10141
15 changed files with 199 additions and 103 deletions

BIN
bin/httpd

Binary file not shown.

View File

@@ -6,10 +6,6 @@ port=80
; count open connection
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
work_dir=/usbhd0/3/server_data
; 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
test=test_unit.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/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.

View File

@@ -3,23 +3,40 @@
<meta charset="utf-8">
<meta lang="ru">
<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>
<body>
<h1>Simple-httpd</h1>
<h2>Оглавление:</h2>
<ul>
<li><a href="#about">Описание программы и её возможностей</a></li>
<li><a href="#install">Установка и настройка</a></li>
<li><a href="#api">Документация на API модулей</a></li>
<li><a href="#other-soft">Дополнительные программы и средства </a>
<ul>
<li><a href="#MIME-macro">Генерация файла MIME типов</a></li>
</ul>
</li>
<li><a href="#Bugs">Известные баги и особенности</a></li>
</ul>
<div class="menu">
<h2>Оглавление:</h2>
<ul>
<li><a href="#about">Описание программы и её возможностей</a></li>
<li><a href="#install">Установка и настройка</a></li>
<li><a href="#api">Документация на API модулей</a></li>
<li><a href="#other-soft">Дополнительные программы и средства </a>
<ul>
<li><a href="#MIME-macro">Генерация файла MIME типов</a></li>
</ul>
</li>
<li><a href="#Bugs">Известные баги и особенности</a></li>
</ul>
</div>
<hr>
<!-- Описание -->
@@ -40,6 +57,7 @@
<p>
Дальнейшая настройка содержимого директории зависит от значений в файле httpd.ini .
</p>
<p><b>Примечание:</b> Файл должен использовать кодировку UTF-8. Другие кодировки могут привести к неправильной работе сервера.</p>
<p>
В файле конфигурации можно выделяются 3 основных раздела:
<ol>
@@ -55,6 +73,7 @@
<li><code>modules_dir</code><p> Директория, относительно которой в разделе [MODULES] указываются модули расширения.</p></li>
<li><code></code><p> </p></li>
</ul>
<p><b>Примечание:</b> В качестве modules_dir могут использоватьбся только ASCII символы.</p>
</li>
<li>
<code>[MODULES]</code>
@@ -65,6 +84,9 @@
<li><b>file_name</b> - путь к файлу модуля, относительно "modules_dir"</li>
<li><b>cmdline</b> - Строка передаваемая модулю во время инициализации каждого ресурса, ассоциированного с ним</li>
</ul>
<p><b>Примечание:</b> В качестве uri_path и cmdline может использоваться строка в UTF-8 с любыми символами, но путь к модулю
всегда должен использовать только ASCII символы. Кодировка cmdline не стандартизированна, но желательно использовать
ASCII символы и проверять какую кодировку поддерживаем модуль.</p>
</li>
<li><code>[TLS]</code>
<p>Данный раздел содержит необходимые данные для использования TLS сервером. Все поля обязательны для заполнения.</p>
@@ -98,6 +120,9 @@
<code> test3=test_unit4.obj; -database="file.sqlite" </code>
Для большей совместимости рекомендуется обрабатывать эту командную строку в кодировке UTF-8.
</p>
<p>
При успешной инициализации функция должна вернуть ненулевое значение, если же инициализация прошла неуспешно, то должен возвращаться ноль.
</p>
<p> Также для дальнейшей работы модуля предаётся указатель на таблицу экспортируемых сервером функций.</p>
@@ -134,9 +159,9 @@
<tr><th>Параметр</th><th>Значение</th></tr>
</thead>
<tbody>
<tr><th>Статус ответа</th><th>"200"</th> </tr>
<tr><th>Версия протокола</th><th>"HTTP/1.1 "</th></tr>
<tr><th>Content-type</th><th>"text/html"</th></tr>
<tr><td>Статус ответа</td><td>"200"</td> </tr>
<tr><td>Версия протокола</td><td>"HTTP/1.1 "</td></tr>
<tr><td>Content-type</td><td>"text/html"</td></tr>
</tbody>
</table>
<p> Также разработчик может указать битовые флаги конфигурации ответа, например следующие:</p>
@@ -219,6 +244,8 @@
</p>
</li>
</ul>
<p><b>Примечание:</b> Все пути на файл или директорию должны быть в кодировке UTF-8 или совместимой с ней ASCII.
Строки должны использовать Null-турминатор. Кодировки UTF-16LE, cp866, cp1251 и тд нельзя использовать.</p>
<h3>Управление сервером</h3>
<code>void close_server();</code>
<p> Функция производит завершение работы всех модулей, и основного потока этого сервера. На время завершения работы модулей сервер
@@ -256,9 +283,8 @@
<ol>
<li>Сетевой стек нестабилен и что-то может пойти не так.</li>
<li>При отправки больших объёмов данных может быть утеря или изменение порядка пакетов</li>
<li>Сервер пока не умеет обрабатывать %XX символы в пути до ресурса</li>
<li>Отсутствует поддержка частичных http запросов</li>
<li>Сервер не рассчитан на большие нагрузки</li>
<li>Все пути в конфигурации сервера должны быть в ascii и без русских символов</li>
<li>Отсутствует поддержка TLS</li>
</ol>

View File

@@ -3,23 +3,40 @@
<meta charset="utf-8">
<meta lang="ru">
<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>
<body>
<h1>Simple-httpd</h1>
<h2>Оглавление:</h2>
<ul>
<li><a href="#about">Описание программы и её возможностей</a></li>
<li><a href="#install">Установка и настройка</a></li>
<li><a href="#api">Документация на API модулей</a></li>
<li><a href="#other-soft">Дополнительные программы и средства </a>
<ul>
<li><a href="#MIME-macro">Генерация файла MIME типов</a></li>
</ul>
</li>
<li><a href="#Bugs">Известные баги и особенности</a></li>
</ul>
<div class="menu">
<h2>Оглавление:</h2>
<ul>
<li><a href="#about">Описание программы и её возможностей</a></li>
<li><a href="#install">Установка и настройка</a></li>
<li><a href="#api">Документация на API модулей</a></li>
<li><a href="#other-soft">Дополнительные программы и средства </a>
<ul>
<li><a href="#MIME-macro">Генерация файла MIME типов</a></li>
</ul>
</li>
<li><a href="#Bugs">Известные баги и особенности</a></li>
</ul>
</div>
<hr>
<!-- Описание -->
@@ -40,6 +57,7 @@
<p>
Дальнейшая настройка содержимого директории зависит от значений в файле httpd.ini .
</p>
<p><b>Примечание:</b> Файл должен использовать кодировку UTF-8. Другие кодировки могут привести к неправильной работе сервера.</p>
<p>
В файле конфигурации можно выделяются 3 основных раздела:
<ol>
@@ -55,6 +73,7 @@
<li><code>modules_dir</code><p> Директория, относительно которой в разделе [MODULES] указываются модули расширения.</p></li>
<li><code></code><p> </p></li>
</ul>
<p><b>Примечание:</b> В качестве modules_dir могут использоватьбся только ASCII символы.</p>
</li>
<li>
<code>[MODULES]</code>
@@ -65,6 +84,9 @@
<li><b>file_name</b> - путь к файлу модуля, относительно "modules_dir"</li>
<li><b>cmdline</b> - Строка передаваемая модулю во время инициализации каждого ресурса, ассоциированного с ним</li>
</ul>
<p><b>Примечание:</b> В качестве uri_path и cmdline может использоваться строка в UTF-8 с любыми символами, но путь к модулю
всегда должен использовать только ASCII символы. Кодировка cmdline не стандартизированна, но желательно использовать
ASCII символы и проверять какую кодировку поддерживаем модуль.</p>
</li>
<li><code>[TLS]</code>
<p>Данный раздел содержит необходимые данные для использования TLS сервером. Все поля обязательны для заполнения.</p>
@@ -98,6 +120,9 @@
<code> test3=test_unit4.obj; -database="file.sqlite" </code>
Для большей совместимости рекомендуется обрабатывать эту командную строку в кодировке UTF-8.
</p>
<p>
При успешной инициализации функция должна вернуть ненулевое значение, если же инициализация прошла неуспешно, то должен возвращаться ноль.
</p>
<p> Также для дальнейшей работы модуля предаётся указатель на таблицу экспортируемых сервером функций.</p>
@@ -134,9 +159,9 @@
<tr><th>Параметр</th><th>Значение</th></tr>
</thead>
<tbody>
<tr><th>Статус ответа</th><th>"200"</th> </tr>
<tr><th>Версия протокола</th><th>"HTTP/1.1 "</th></tr>
<tr><th>Content-type</th><th>"text/html"</th></tr>
<tr><td>Статус ответа</td><td>"200"</td> </tr>
<tr><td>Версия протокола</td><td>"HTTP/1.1 "</td></tr>
<tr><td>Content-type</td><td>"text/html"</td></tr>
</tbody>
</table>
<p> Также разработчик может указать битовые флаги конфигурации ответа, например следующие:</p>
@@ -219,6 +244,8 @@
</p>
</li>
</ul>
<p><b>Примечание:</b> Все пути на файл или директорию должны быть в кодировке UTF-8 или совместимой с ней ASCII.
Строки должны использовать Null-турминатор. Кодировки UTF-16LE, cp866, cp1251 и тд нельзя использовать.</p>
<h3>Управление сервером</h3>
<code>void close_server();</code>
<p> Функция производит завершение работы всех модулей, и основного потока этого сервера. На время завершения работы модулей сервер
@@ -256,9 +283,8 @@
<ol>
<li>Сетевой стек нестабилен и что-то может пойти не так.</li>
<li>При отправки больших объёмов данных может быть утеря или изменение порядка пакетов</li>
<li>Сервер пока не умеет обрабатывать %XX символы в пути до ресурса</li>
<li>Отсутствует поддержка частичных http запросов</li>
<li>Сервер не рассчитан на большие нагрузки</li>
<li>Все пути в конфигурации сервера должны быть в ascii и без русских символов</li>
<li>Отсутствует поддержка TLS</li>
</ol>

View File

@@ -4,7 +4,7 @@
; ;
; 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
.end_work:
add esp, 2048
; free OUT buffer
cmp dword[esp + CONNECT_DATA.buffer_response], 0
jz .err_recv_sock
push dword[esp + CONNECT_DATA.buffer_response]
call Free
; ; free OUT buffer
; cmp dword[esp + CONNECT_DATA.buffer_response], 0
; jz .err_recv_sock
; push dword[esp + CONNECT_DATA.buffer_response]
; call Free
.err_recv_sock:
; free IN buffer
cmp dword[esp + CONNECT_DATA.buffer_request], 0

View File

@@ -66,49 +66,58 @@
; db 13, 10
;.size = $ - http_err_response
align 4
default_http_version:
db 'HTTP/1.1 '
.length = $ - default_http_version
align 4
default_http_connection:
db 'Connection: '
.value = $ - default_http_connection
db 'close ', 13, 10 ; or keep-alive
.length = $ - default_http_connection
align 4
default_http_cont_encod:
db 'Content-Encoding: identity', 13, 10
.length = $ - default_http_cont_encod
align 4
default_http_cont_type:
db 'Content-type: '
.value = $ - default_http_cont_type
db 'text/html ', 13, 10;
.length = $ - default_http_cont_type
align 4
default_http_cache_ctl:
db 'Cache-Control: no-cache', 13, 10
.length = $ - default_http_cache_ctl
align 4
default_http_cont_len:
db 'Content-length: '
db '0000000000000000000000', 13, 10
.length = $ - default_http_cont_len
align 4
default_http_header_server:
db 'Server: simple-httpd/0.3.0', 13, 10
.length = $ - default_http_header_server
align 4
http_header_transfer_chunked:
db 'Transfer-Encoding: chunked', 13, 10
.length = $ - http_header_transfer_chunked
;align 4
;default_http_date_header:
; db 'Date: '
;.date: db 'Sun, 30 Oct 2022 09:29:13 GMT',13, 10
;.length = $ - default_http_date_header
align 4
http_response_err_501:
db 'HTTP/1.1 '
db '501 ',13, 10
@@ -118,6 +127,7 @@ http_response_err_501:
db 13, 10
.size = $ - http_response_err_501
align 4
http_response_err_404:
db 'HTTP/1.1 '
db '404 ',13, 10
@@ -129,6 +139,7 @@ http_response_err_404:
db 'The server could not find the requested page.'
.size = $ - http_response_err_404
align 4
http_response_options:
db 'HTTP/1.1 '
db '204 ',13, 10
@@ -143,6 +154,7 @@ http_response_options:
; "GET / HTTP/1.1" - 18 byte
min_http_size = 18
align 4
MIME_FILE_FORMAT:
.html: db 5,'.html', 'text/html',0
.css: db 4,'.css', 'text/css ',0
@@ -157,6 +169,7 @@ MIME_FILE_FORMAT:
.other: dd 0
db 'application/octet-stream',0 ; for unknow file - all file :)
align 4
STD_MIME_TYPE_ARR:
dd MIME_FILE_FORMAT.html, \
MIME_FILE_FORMAT.css, \
@@ -173,5 +186,20 @@ _DIV_10_: dd 10
_DIV_100_: dd 100
_DIV_1000_: dd 1000
align 4
hex_chars:
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

View File

@@ -31,7 +31,7 @@ struct CONNECT_DATA ; 16*4 = 64 bytes
num_headers dd 0 ; number items in REQUEST_DATA
http_headers dd 0 ; pointer to array REQUEST_DATA of HTTP headers
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 ; указатель на декодированный путь к ресурсу(без параметров)
num_uri_args dd 0 ;
uri_arg dd 0 ; pointer to the REQUEST_DATA array of string uri arguments
@@ -44,7 +44,7 @@ struct FILED
offset rd 2
size rd 1
buffer rd 1
rb 1
name_encode rd 1
path rd 1
end_path rd 1
ends

View File

@@ -24,9 +24,6 @@ parse_url:
; \_/ \______________/\_________/ \_________/ \__/
; | | | | |
; scheme authority path query fragment
; | _____________________|__
; / \ / \
; urn:example:animal:ferret:nose
cmp byte[ecx], '/' ; check abs-path
je .get_path
@@ -53,7 +50,7 @@ parse_url:
ja .error_exit
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], '/'
jne @b
@@ -61,20 +58,48 @@ parse_url:
.get_path:
;ecx = path-absolute
mov [esi + CONNECT_DATA.uri_path], ecx
@@:
mov edi, ecx
mov al, byte[ecx]
.get_path.new_char:
stosb
inc ecx
cmp ecx, [esi + CONNECT_DATA.end_buffer_request]
ja .error_exit
cmp byte[ecx], '?'
mov al, byte[ecx]
mov byte[edi], 0
cmp al, '?'
je .get_query
cmp byte[ecx], '#'
cmp al, '#'
je .get_fragment
cmp byte[ecx], ' ' ; check end path
jne @b
cmp al, ' ' ; check end path
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
inc ecx
jmp .exit
@@ -104,10 +129,10 @@ parse_url:
cmp byte[ecx], '='
je .get_args
cmp byte[ecx], '#' ; ЭТО БРЕД ПОЛНЫЙ, НО ВДРУГ
cmp byte[ecx], '#' ; THIS IS COMPLETE NONSENSE, BUT SUDDENLY
je .get_fragment
cmp byte[ecx], ' ' ; http://cjkhr.bvgbfdkvdf.dmejfgehf/?1pr1
cmp byte[ecx], ' ' ; http://cjkhr.bvgbfdkvdf.dmejfgehf/?1pr1
jne @b
.exit_2:
mov byte[ecx], 0

View File

@@ -5,47 +5,35 @@
Сервер отправляет содержимое файлов без сжатия в соответствии с заданной таблицей ассоциации MIME типа и расширения файла.
Если запрос от клиента имеет uri путь который соответствует модулю сервера, то сервер передаёт управление коду в этом модуле с передачей всех необходимых для функционирования данных.
## install
Для установки сервера на диск скопируйте файлы из директории bin данного репозитория. В этой директории находятся слудеющие файлы:
- `httpd` - исполняемый файл сервера
- `mime_types.bin` - файл с расширенной таблицей ассоцияции MIME типа с расширением файла
- `httpd.ini` - файл конфигурации сервера
## Configuration
Для настройки сервера применяется файл конфигурации в формате ini, где указываются следующие параметры:
и директории:
- `modules` - Директория в которой хранятся некоторые примеры модулей, для демонстрации возможностей сервера
- `server_data` - Директория для размещения статичных данных сервера. Изначально в ней находится только документация по использованию сервером.
В секции <CODE>MAIN</CODE>
- <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> - директория расположения модулей сервера
Готовый файл конфигурации уже настроен для использование и ожидает, что всё содержимое директории bin репозитория будет размешено по пути `/usbhd0/3/`. По этому для установки достаточно скопировать содержимое в корень третьего раздела usb диска и запустить файл httpd .
В секции <CODE>MODULES</CODE> может находиться множество параметров, имеющих вид <CODE>uri_path=file_name;cmdline</CODE> где:
- <CODE>uri_path</CODE> - путь указываемый клиентом во время запроса
- <CODE>file_name</CODE> - название/путь до файла модуля относительно <CODE>modules_dir</CODE>
- <CODE>cmdline</CODE> - строка параметров, которая передаётся в функцию инициализации модуля. Данное значение не обязательна и может не использоваться.
Подробная настройка сервера описана в документации, расположенной в директории doc этого репозитория.
## 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
К серверу можно подключить дополнительные модули в виде библиотек со специальными экспортируемыми функциями:
- <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>
Эта функция вызывается сервером при завершении работы или в процессе управления сервером. Данная функция предназначена для корректного завершения работы модуля и освобождением связанных с ним ресурсов.
### Tasks on version 0.3.0
- Добавить поддержку TLS шифрования с использованием MbedTLS
## Bugs
- Сервер не поддерживает работу с файлами, имеющими не ascii символы, так как не производит преобразование uri пути;
- В ходе тестов был обнаружена ошибка отправки "больших" файлов. Это баг сетевого стека;
- При длительной работе сервер может начать "подзависать" или перестать отвечать на сообщения. Это баг сетевого стека.

View File

@@ -198,10 +198,10 @@ FileInfo:
mov dword[esp + FILED.opcode], 5 ; file info
mov dword[esp + FILED.offset + 4], 0 ; zero flag
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 ebx, esp
mcall 70
mcall 80
add esp, sizeof.FILED
pop ebx
ret 8
@@ -210,12 +210,13 @@ FileInfo:
FileInitFILED:
push ecx edi
mov edi, [esp + 4*2 + 4]
mov ecx, sizeof.FILED
mov ecx, sizeof.FILED/4
xor eax, eax
rep stosb
rep stosd
mov eax, [esp + 4*2 + 4]
mov ecx, [esp + 4*2 + 8]
mov [eax + FILED.path], ecx
mov dword[eax + FILED.name_encode], 3 ;UTF-8
dec ecx
@@:
inc ecx
@@ -239,7 +240,7 @@ FileRead:
mov [eax + FILED.buffer], ecx
mov ebx, eax
mcall 70
mcall 80
test eax, eax
jz @f
@@ -280,10 +281,10 @@ FileReadOfName:
mov dword[esp + FILED.offset + 4], 0
mov dword[esp + FILED.size], eax
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 ebx, esp
mcall 70
mcall 80
test eax, eax
jz @f
cmp eax, 6 ; EOF