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 ; 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.

View File

@@ -3,10 +3,27 @@
<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>
<div class="menu">
<h2>Оглавление:</h2> <h2>Оглавление:</h2>
<ul> <ul>
<li><a href="#about">Описание программы и её возможностей</a></li> <li><a href="#about">Описание программы и её возможностей</a></li>
@@ -19,7 +36,7 @@
</li> </li>
<li><a href="#Bugs">Известные баги и особенности</a></li> <li><a href="#Bugs">Известные баги и особенности</a></li>
</ul> </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>

View File

@@ -3,10 +3,27 @@
<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>
<div class="menu">
<h2>Оглавление:</h2> <h2>Оглавление:</h2>
<ul> <ul>
<li><a href="#about">Описание программы и её возможностей</a></li> <li><a href="#about">Описание программы и её возможностей</a></li>
@@ -19,7 +36,7 @@
</li> </li>
<li><a href="#Bugs">Известные баги и особенности</a></li> <li><a href="#Bugs">Известные баги и особенности</a></li>
</ul> </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>

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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,7 +129,7 @@ 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

View File

@@ -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 пути;
- В ходе тестов был обнаружена ошибка отправки "больших" файлов. Это баг сетевого стека; - В ходе тестов был обнаружена ошибка отправки "больших" файлов. Это баг сетевого стека;
- При длительной работе сервер может начать "подзависать" или перестать отвечать на сообщения. Это баг сетевого стека. - При длительной работе сервер может начать "подзависать" или перестать отвечать на сообщения. Это баг сетевого стека.

View File

@@ -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