From cde50c18ed76e00bc726322086ed29092cc3eef0 Mon Sep 17 00:00:00 2001 From: Doczom Date: Sun, 11 Feb 2024 21:45:47 +0500 Subject: [PATCH] Update to 0.2.0 version ## Program interface - Added the function ``` char* find_uri_args(CONNECT_DATA* session, char* key) ``` - Added the function ``` char* find_header(CONNECT_DATA* session, char* key) ``` - Fixed a bug in ``` Get_MIME_Type ``` - Added the function ``` void close_server(); ``` ## Module interface - The initialization function and the request processing function have been changed: ``` uint32_t stdcall httpd_init(IMPORT_DATA* import, char* cmdline) ``` ```` void stdcall httpd_server(CONNECT_DATA* request_data, uint32_t pdata) ``` Added a module shutdown function for a specific uri: ``` void stdcall httpd_close(uint32_t pdata) ``` ## Modules - Added a module for testing parameter transmission during initialization ## Other - Added a build script - Added a single file for the program and modules with constants and structures --- bin/httpd | Bin 0 -> 4853 bytes {example => bin}/httpd.ini | 56 +++++++++---------- {utils => bin}/mime_types.bin | Bin bin/modules/test_unit.obj | Bin 0 -> 1759 bytes bin/modules/test_unit4.obj | Bin 0 -> 692 bytes bin/modules/test_unit_2.obj | Bin 0 -> 1819 bytes example/test_unit.asm | 83 +++++----------------------- example/test_unit.obj | Bin 1700 -> 0 bytes example/test_unit4.asm | 100 ++++++++++++++++++++++++++++++++++ example/test_unit_2.asm | 79 ++++----------------------- example/test_unit_2.obj | Bin 1760 -> 0 bytes file_server.inc | 9 ++- httpd.asm | 71 +++++++++++++----------- httpd.ini | 4 +- httpd_lib.inc | 1 - makefile | 19 +++++++ module_api.inc | 78 ++++++++++++++++++++++++++ readme.md | 33 +++++++---- settings.inc | 96 ++++++++++++++++---------------- sys_func.inc | 77 +++++++++++++++++++++++--- 20 files changed, 436 insertions(+), 270 deletions(-) create mode 100644 bin/httpd rename {example => bin}/httpd.ini (66%) rename {utils => bin}/mime_types.bin (100%) create mode 100644 bin/modules/test_unit.obj create mode 100644 bin/modules/test_unit4.obj create mode 100644 bin/modules/test_unit_2.obj delete mode 100644 example/test_unit.obj create mode 100644 example/test_unit4.asm delete mode 100644 example/test_unit_2.obj create mode 100644 makefile create mode 100644 module_api.inc diff --git a/bin/httpd b/bin/httpd new file mode 100644 index 0000000000000000000000000000000000000000..b1b99438708a77d6b8b9f115baa2bc4873163662 GIT binary patch literal 4853 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 L+eCY1VY2@L5CDpb literal 0 HcmV?d00001 diff --git a/example/httpd.ini b/bin/httpd.ini similarity index 66% rename from example/httpd.ini rename to bin/httpd.ini index 0ab3f65..f7ef16e 100644 --- a/example/httpd.ini +++ b/bin/httpd.ini @@ -1,29 +1,27 @@ -[MAIN] -; server IPv4 address. Non IPv6 address -ip=192.168.137.21 -; server port number -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) -units_dir=/usbhd0/3 - -mime_file=/usbhd0/3/mime_types.bin - -[UNITS] -; list units -; path = path to lib in units_dir -test=test_unit.obj -rasp=test_unit_2.obj -;database/sqlite3=sqlite3_serv.obj -;database/cvs=cvs_table_server.obj - -; server calling function httpd_serv(CONNECT_DATA* struct_server ); -; for init unit, server calling function httpd_init(void* global_data); \ No newline at end of file +[MAIN] +; server IPv4 address. Non IPv6 address +ip=192.168.137.21 +; server port number +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) +modules_dir=/usbhd0/3 + +mime_file=/usbhd0/3/mime_types.bin + +[MODULES] +; list units +; path = unit_name;cmdline +; not uning ' ' in unit_name;cmdline : "path = unit_name ; cmdline" is bad name +test=test_unit.obj +rasp=test_unit_2.obj +;database/sqlite3=sqlite3_serv.obj +;database/cvs=cvs_table_server.obj \ No newline at end of file diff --git a/utils/mime_types.bin b/bin/mime_types.bin similarity index 100% rename from utils/mime_types.bin rename to bin/mime_types.bin diff --git a/bin/modules/test_unit.obj b/bin/modules/test_unit.obj new file mode 100644 index 0000000000000000000000000000000000000000..44922db8080ed36bc7a36b4885bb9ecd962379e6 GIT binary patch literal 1759 zcmchYUuYaf9LFb@KgKiH6txHiWjuTm?q9WSTrO)cO-x0SvpJI#CC6rWl3U!{J$5Iy z0g+tWV9rB~AP6c#paI`(3(=I4OWK#~LkoL-@L5psPXv+Tzo+<}-OHp%1)m)5=J(m} z%N{jj*TSX5Z)_Q4ymxM)LVwDw9mpG=j&Xb%%0;#g{Gf5etci$ z3uUHI&d%~wk(VqKfLJ!ux#`#n)h)+E_*gXi@$hGmdL8 zw?Cc{fx_*&Ru(m>{)hf0f79P=*8Fwatl;CXHy8aY!F(y3+S`}quJBbywGtEdq&@3U z)DTAFB0JSAbI$IM>o_Xrid4eIP^tg1U-z&18_jnRwbDF?=ymFUg~VG(RY%IYe}#&z z;+|2^p5rQ3>i*?s)n7-E8z?adDBin&8>lHfid1kGYBtrn49@tUUQ>9=#4unJuw~f8 zEp25bcv=dkZF16L50BFx2X`~@{y!%1jElm$$YYZFKzNg&6{Ploq)#NRN%}(4ElFQX z`bN@ElKzzR2vUXFMqt8PUYGQSq%)GvOL||@XOb>T`cl$ONk2&X6@(AERFE{xtHOlZ o3sM`F+DlR!mD2%i&3DKG>$=%plr2B2)I)&3lyM7JNy!Iw;*mu4^sFfjZV zodFbTJy0Td97qEtOH>4UD_B~;mGI8_(_qI?!n))?!|QKzxWnv-13VQ zN-{Ew6-x6mOB6Em6q57v(lXN(^72a*ic?Dz5{uGHb5rw5iakL3fgl8k{ed_Eh*ttJ z2uzqTA)}HTbO$nvnE^S4 LfqcNszyc%zwcB&3 literal 0 HcmV?d00001 diff --git a/bin/modules/test_unit_2.obj b/bin/modules/test_unit_2.obj new file mode 100644 index 0000000000000000000000000000000000000000..3bb0572f97035248c0353ea2f290efc7433a5bcc GIT binary patch literal 1819 zcmcgtUr19?96qjTV%aKK^bmBDqCZe8F-W=Igi;EkR+<)p)ki7k3+^h>+y+aW@jv``u6Tt}jDbP$ba$tdz(kf8)XC+&*v@mt=P$JmLFO zbq!tL%aWfyE(}NQ1T8OXJ$mfOxwBP8o}LxhPdDsHmxjBm+ig#(1naKTF5*f3Kw)~1 zySq9V?<7eogoox6E=H1+jRc@j@NUH!Qxl$EuGic*nRBD^G2i-fqdz-^MeY<9k5>Y5 zW)T*-HqLkj)0%&c2yYt4Q5vx!{MP}@*;p|W=kz}hnYsP%aJS{N{RcU-TKa!HEDSHt zXIR?N88Gd3>3N(q7rb?%W4h8Wu0Vu0>@RqAum$gK%;F~XO$yo1^U0RC*_KJIfNdqF z`KJps(3|U{}*of4vr=Ct`*^JzHkT&`(&@ z)Y>AZov>(aMUsX$@2D_z8l^GIXtEMiYqac>maSFlK1u4nh$swphE5xL5^}Mqp_^L7 zw!*a)JKODAJc<x`fu_=-6y;Ei7Ux2v8>b0Mw~7-?DW7i zqt$F+*F+~7kat2WTgpAr0SBPFXjDZo+G4QMERz%tH&)1%dFWY?jQLi0KH1i$+% z`yP)fADVuQh0Xxs3%8q!d#KQuLeCX?1B5Rs7QjGy zEJcvqF2(It$gfbV%Ij0yRfTRTbXTFL%J+rxeWkc5#W{+5tGN0j{sV`a8p(`?i_Ct# RAq}s+*)KAfg5iIDKLIKf!gBxs literal 0 HcmV?d00001 diff --git a/example/test_unit.asm b/example/test_unit.asm index e83f870..efb2e85 100644 --- a/example/test_unit.asm +++ b/example/test_unit.asm @@ -1,70 +1,11 @@ format MS COFF public @EXPORT as 'EXPORTS' -API_VERSION = 0x05 -FLAG_KEEP_ALIVE = 0x01 +include "macros.inc" + +include '../module_api.inc' NO_DEBUG_INPUT = 0 -include 'D:\kos\programs\macros.inc' - -struct IMPORT_DATA - version rd 1 ; dword for check api - sizeof rd 1 ; size struct - netfunc_socket rd 1 - netfunc_close rd 1 - netfunc_bind rd 1 - netfunc_accept rd 1 - netfunc_listen rd 1 - netfunc_recv rd 1 - netfunc_send rd 1 - FileInfo rd 1 - FileRead rd 1 - Alloc rd 1 - Free rd 1 - parse_http_query rd 1 - ;send_resp(RESPD* ptr, char* content, uint32_t length) - ;create_resp(CONNECT_DATA* session, uint32_t flags) - ; FLAG_KEEP_ALIVE = 0x01 - ; FLAG_ADD_DATE = 0x02 ;(not supported) - ; FLAG_NO_SET_CACHE = 0x04 ;(not supported) - ; FLAG_NO_CONTENT_ENCODING = 0x08 ;(not supported) - ; - ;destruct_resp(RESPD* ptr) - ;set_http_status(RESPD* ptr, uint32_t status) ; status in '200' format, - ;add_http_header(RESPD* ptr, char* ptr_header) - ;del_http_header(RESPD* ptr, char* ptr_header) ; no del std header - ;set_http_ver(RESPD* ptr, char* version) ; example: RTSP/1.1 - send_resp rd 1 - create_resp rd 1 - destruct_resp rd 1 - set_http_status rd 1 - add_http_header rd 1 - del_http_header rd 1 - set_http_ver rd 1 - - base_response rd 1 - GLOBAL_DATA rd 1 -ends - -struct CONNECT_DATA ; 16*4 = 64 bytes - socket dd 0 ; номер сокета подключения - sockaddr dd 16/4 ; socaddr connection - buffer_request dd 0 ; pointer to buffer for geting message socket - request_size dd 0 ; size geted data from client - end_buffer_request dd 0 ; для парсера - buffer_response dd 0 ; pointer to buffwr for resp message - http_method dd 0 ; указатель на строку - http_verion dd 0 ; указатель на строку - num_headers dd 0 ; number items in REQUEST_DATA - http_headers dd 0 ; указатель на массив REQUEST_DATA - uri_scheme dd 0 ; указатель на схему - uri_authority dd 0 ; pointer to struct ? - uri_path dd 0 ; указатель на декодированный путь к ресурсу(без параметров) - num_uri_args dd 0 ; - uri_arg dd 0 ; pointer to array REQUEST_DATA аргументов uri строк - uri_fragment dd 0 ; указатель на строку - message_body dd 0 ; указатель на тело http запроса -ends macro board_input message { if NO_DEBUG_INPUT = 0 @@ -89,7 +30,7 @@ end if section '.flat' code readable align 16 unit_init: - mov eax, -1 + xor eax, eax push esi edi mov esi, [esp + 4*2 + 4] mov [import_httpd], esi @@ -102,10 +43,10 @@ unit_init: shr ecx, 2 ; div 4 rep movsd - xor eax, eax + mov eax, 1 ;no zero return - unit init successful .exit: pop edi esi - ret 4 + ret 8 server_entry: @@ -165,7 +106,7 @@ server_entry: board_input 'create message' ; create http message push dword 8*1024 - call [IMPORT + IMPORT_DATA.Alloc] + call [IMPORT.Alloc] test eax, eax jz .exit @@ -214,13 +155,18 @@ server_entry: push sceleton_resp.size push edi push dword[esi + CONNECT_DATA.socket] - call [IMPORT + IMPORT_DATA.netfunc_send] + call [IMPORT.netfunc_send] board_input 'send' .exit: pop edi esi + ret 8 + +server_close: + ret 4 + section '.data' data readable writable align 16 _10: dd 10 @@ -263,7 +209,8 @@ text_message: @EXPORT: export \ unit_init, 'httpd_init', \ - server_entry, 'httpd_serv' + server_entry, 'httpd_serv',\ + server_close, 'httpd_close' IMPORT IMPORT_DATA ; \ No newline at end of file diff --git a/example/test_unit.obj b/example/test_unit.obj deleted file mode 100644 index d270688fb3ad71bb41e5bf0333113e8d0343a0b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1700 zcmcJQUuYCZ9LFb@T$&y^lZT4XhcZ3-6u7%R>%T6WH5ijBh`E|;VyGl+b|<%6_I8im zi5e^=rv|gVQUVH=_9>;lDX1kFkzAr8M;{7%`s`CFQc~In5%KBzo1M!^fsCP1jhmwW zA^4qx`w(cc)&chb%5SVTp^c4K=?C4x-Yzg+P~)>b>qT&_9`CsSd+hnO+{V=8gAT-< z@}r-O)keVYs~xKcVYt@@-7f>f^RE)Ke{8-rV|hMJCMG97JK2o07#F_W)7Eo-8K^pZ zpxRaWNG}_lQObE)n0?iiFo_B8*UT z=Vj1a*yy=25wrS& z#lL`qdhYQuJHD5Dp+o5EIv5u=D9%0JvedX`$F^k+EcK7y-YrSkWSdNu$9QvJbLS<1 zsJbqIH&)l_6UX2+MGrf{1X}G#p^(q!G7^?RIhhzG-f7~=*tbe$o1{%j%SKkpNSRzR zF{tS#Ne{XX^;}!Vj+@q*1s1?W9GV_-bl0$)qKqvA<`$jXUbBf)q^69e5BKliw$iyW zkufD_Y1X7A8xjC5hv?LD9U1Gk>w|nUp}c>1WUw%iAHvK_Ra!mK3{@!+s$t#KJfG11 z)GVDzA4sVR1hW5DGdiK}FOllQ21+qz@_j+S0TLT+X^@-4)a2>}=#s__dWS zg;19T5q(@$TPAL1s|6ul2y>!~en13P(1lk)ust(llaW$4&7PU}nRnjzdFGun>^W56 zAv+eIweJ-ZvWW23U$7<8Zc%~dFybL33>Ybr^VKjK3Dj;0Thx*+F&;$RDv+E97jK2= zwInc+&7(CorRln*eP&V8JN~tRko1wlm(!k^yW1v$&94fHTn^M9Ys?)$+T~^0T`cR@!{(^vS;Sl?C43m7J)qDqRxk+1cuNQ^lBfcX^06^&N@n z{e?X{L-9_Mq=NYNLc~P~lC;qv81lYVs3bMv?dN=r1Cu#k$uqt*bLUES3X|M9OrDhk zanBM=axL8B6Q1Vjx3JKracrd?3qs!yFmGW+2%J~{0%+#ff5g>R%+(*{o;6bc^9dn% zZ6U#uj?SRvv`Wo3(wO&c5*5?(fH;9DFF26*t%o=7(=m#dG%zV>KP^OC*5cR}wS$hG zn5}0n_n1iLl=B|Kl7!t64)QA{wf%JdN{u{ku*Jbs(I7xP$W!)Y&>UOhXw-=%rt$G8y zB`V3l`IzP0UiTvE8AX49kgVpW0LPGbRYU4imT|ATy;}7~b{iZi6rW?y(T7;}J?<%Q zA7Ix>NCpQ7qm;(O!B|I(l3ARconn - максимальное количество открытых соединений(по умолчанию 10) - work_dir - директория для размещения файлов, отправляемых сервером - mime_file - путь к файлу с таблицей сопоставлениея mime типов и расширений файлов (если не указан, то используется встроенная в сервер таблица сопоставления) - - unit_dir - директория расположения модулей сервера + - modules_dir - директория расположения модулей сервера - В секции UNITS может находиться множество параметров, имеющих вид uri_path=file_name где: + В секции MODULES может находиться множество параметров, имеющих вид uri_path=file_name;cmdline где: - uri_path - путь указываемый клиентом во время запроса - - file_name - название/путь до файла модуля относительно work_dir + - file_name - название/путь до файла модуля относительно modules_dir + - cmdline - строка параметров, которая передаётся в функцию инициализации модуля. Данное значение не обязательна и может не использоваться. -## API for units +## API for modules К серверу можно подключить дополнительные модули в виде библиотек со специальными экспортируемыми функциями: - - uint32_t stdcall httpd_init(IMPORT_DATA* import) + - uint32_t stdcall httpd_init(IMPORT_DATA* import, char* cmdline) -Эта функция необходима для передачи модулю необходимых данных, таких как функции работы с сетью, рабочие директории и тд. -Если инициализация модуля прошла успешно, функция возвращает 0. - - - void stdcall httpd_server(CONNECT_DATA* request_data) -Эта функция вызывается при получении запроса с uri путём указанном в файле конфигурации для этого модуля. Сервер передаёт в функцию структуру соединения, в которой находятся данные запроса(заголовки, параметры, http метод и версия). На основе этих данных функция может генерировать необходимый ответ. +Эта функция служит для инициализации модуля для каждого связанного с модулем uri . В файле конфигурации для конкретного uri можно добавить командную строку, передаваемую в эту функцию. Например + ``` test3=test_unit4.obj; -database="file.sqlite" ``` +При успешной инициализации функция должна вернуть ненулевое значение, если же инициализация прошла неуспешно, то должен возвращаться ноль. +Для упрощения многих операций, сервер передаёт в функцию инициализации модуля таблицу некоторых функций, необходимых для работы с сетью, с файловой системой и прочими интерфейсами. + + - void stdcall httpd_serv(CONNECT_DATA* request_data, uint32_t pdata) +Эта функция вызывается сервером при получении запроса с uri путём указанном в файле конфигурации для этого модуля. +Сервер передаёт в функцию контекст запроса, содержащий: аргументы, заголовки, тело запроса, http метод и версию; и значение возвращённое функцией httpd_init. + + - void stdcall httpd_close(uint32_t pdata) +Эта функция вызывается сервером при завершении работы или в процессе управления сервером. Данная функция предназначена для корректного завершения работы модуля и освобождением связанных с ним ресурсов. ## Bugs - - В ходе тестов был обнаружена ошибка отправки "больших" файлов. Это баг сетевого стека. + - Сервер не поддерживает работу с файлами, имеющими не ascii символы, так как не производит преобразование uri пути; + - Сервер не имеет интерфейса для управления, что может вызвать трудности в сохранении временных данных модулей при завершении работы; + - В ходе тестов был обнаружена ошибка отправки "больших" файлов. Это баг сетевого стека; - При длительной работе сервер может начать "подзависать" или перестать отвечать на сообщения. Это баг сетевого стека. diff --git a/settings.inc b/settings.inc index 745f742..626d6b7 100644 --- a/settings.inc +++ b/settings.inc @@ -1,30 +1,14 @@ -struct CONNECT_DATA ; 16*4 = 64 bytes - socket dd 0 ; номер сокета подключения - sockaddr dd 16/4 ; socaddr connection - buffer_request dd 0 ; pointer to buffer for geting message socket - request_size dd 0 ; size geted data from client - end_buffer_request dd 0 ; для парсера - buffer_response dd 0 ; pointer to buffwr for resp message - http_method dd 0 ; указатель на строку - http_verion dd 0 ; указатель на строку - num_headers dd 0 ; number items in REQUEST_DATA - http_headers dd 0 ; указатель на массив REQUEST_DATA - uri_scheme dd 0 ; указатель на схему - uri_authority dd 0 ; pointer to struct ? - uri_path dd 0 ; указатель на декодированный путь к ресурсу(без параметров) - num_uri_args dd 0 ; - uri_arg dd 0 ; pointer to array REQUEST_DATA аргументов uri строк - uri_fragment dd 0 ; указатель на строку - message_body dd 0 ; указатель на тело http запроса -ends -struct HTTPD_UNIT + +struct HTTPD_MODULE next rd 1 prev rd 1 + httpd_close rd 1 httpd_serv rd 1 - uri_path rb 4096-3*4 + pdata rd 1 + uri_path rb 4096-5*4 ends struct RESPD @@ -112,89 +96,101 @@ load_settings: call load_mime_file ; units_dir - invoke ini.get_str, ebp, ini_section_main, ini_key_units_dir, GLOBAL_DATA.unit_dir, 1024, 0 + invoke ini.get_str, ebp, ini_section_main, ini_key_modules_dir, GLOBAL_DATA.modules_dir, 1024, 0 test eax, eax - jnz .no_units + jnz .no_modules push edi mov ecx, 1024 - mov edi, GLOBAL_DATA.unit_dir + mov edi, GLOBAL_DATA.modules_dir xor eax, eax repne scasb mov byte[edi-1], '/' - mov [GLOBAL_DATA.unit_dir.end], edi + mov [GLOBAL_DATA.modules_dir.end], edi pop edi ; get all units - invoke ini.enum_keys, ebp, ini_section_units, .add_unit -.no_units: + invoke ini.enum_keys, ebp, ini_section_units, .add_module +.no_modules: xor eax, eax ret -.add_unit: ; [esp + 4*3] - name [esp + 4*4] - value +.add_module: ; [esp + 4*3] - name [esp + 4*4] - value ; add new item in list - push dword sizeof.HTTPD_UNIT + push dword sizeof.HTTPD_MODULE call Alloc test eax, eax - jz .add_unit.exit + jz .add_module.exit - mov ecx, [GLOBAL_DATA.units] - mov [eax + HTTPD_UNIT.next], ecx - mov dword[eax + HTTPD_UNIT.prev], GLOBAL_DATA.units - mov [GLOBAL_DATA.units], eax + mov ecx, [GLOBAL_DATA.modules] + mov [eax + HTTPD_MODULE.next], ecx + mov dword[eax + HTTPD_MODULE.prev], GLOBAL_DATA.modules + mov [GLOBAL_DATA.modules], eax test ecx, ecx jnz @f - mov [ecx + HTTPD_UNIT.prev], eax + mov [ecx + HTTPD_MODULE.prev], eax @@: ; copy uri path push esi edi mov esi, [esp + 4*2 + 4*3] ; name - lea edi, [eax + HTTPD_UNIT.uri_path + 1] + lea edi, [eax + HTTPD_MODULE.uri_path + 1] mov byte[edi - 1], '/' @@: movsb cmp byte[edi - 1], 0 jne @b ; copy file name - mov edi, [GLOBAL_DATA.unit_dir.end] + mov [GLOBAL_DATA._module_cmd], 0 + mov edi, [GLOBAL_DATA.modules_dir.end] mov esi, [esp + 4*2 + 4*4] @@: movsb cmp byte[edi - 1], 0 - jne @b + je @f + cmp byte[esi - 1], ';' + jne @b + mov byte[edi - 1], 0 + mov [GLOBAL_DATA._module_cmd], esi +@@: pop edi esi mov esi, eax ; load library push esi - stdcall dll.Load, IMPORT_UNIT + stdcall dll.Load, IMPORT_MODULE pop esi test eax, eax jz @f - .add_unit.err: + .add_module.err: ; error - mov eax, [esi + HTTPD_UNIT.next] ; next - mov [GLOBAL_DATA.units], eax - mov dword[eax + HTTPD_UNIT.prev], GLOBAL_DATA.units + mov eax, [esi + HTTPD_MODULE.next] ; next + mov [GLOBAL_DATA.modules], eax + mov dword[eax + HTTPD_MODULE.prev], GLOBAL_DATA.modules push esi call Free - jmp .add_unit.exit + jmp .add_module.exit @@: ; good - ; init httpd unit + ; init httpd module + push dword[GLOBAL_DATA._module_cmd] push dword EXPORT_DATA invoke httpd_import.init + test eax, eax - jnz .add_unit.err + jz .add_module.err + mov [esi + HTTPD_MODULE.pdata], eax mov eax, [httpd_import.serv] - mov dword[esi + HTTPD_UNIT.httpd_serv], eax + mov dword[esi + HTTPD_MODULE.httpd_serv], eax + mov eax, [httpd_import.close] + mov dword[esi + HTTPD_MODULE.httpd_close], eax - mov [httpd_import.init], httpd_unit_init - mov [httpd_import.serv], httpd_unit_serv -.add_unit.exit: + mov [httpd_import.init], httpd_module_init + mov [httpd_import.serv], httpd_module_serv + mov [httpd_import.close], httpd_module_close +.add_module.exit: ret 16 diff --git a/sys_func.inc b/sys_func.inc index d4da36c..34a51e0 100644 --- a/sys_func.inc +++ b/sys_func.inc @@ -218,13 +218,6 @@ FileRead: -FLAG_KEEP_ALIVE = 0x01 -FLAG_ADD_DATE = 0x02 ;(not supported) -FLAG_NO_SET_CACHE = 0x04 ;(not supported) -FLAG_NO_CONTENT_ENCODING = 0x08 ;(not supported) - - - ;RESPD* stdcall create_resp(CONNECT_DATA* session, uint32_t flags) create_resp: @@ -244,7 +237,7 @@ create_resp: .exit: ret 8 -;void destruct_resp(RESPD* ptr) +;void stdcall destruct_resp(RESPD* ptr) destruct_resp: stdcall Free, [esp + 4] ret 4 @@ -452,3 +445,71 @@ send_resp: mov eax, -1 jmp .exit + + +;char* find_uri_arg(CONNECT_DATA* session, char* key) +find_uri_arg: + push esi edi + mov edx, [esp + 4*2 + 4] + mov ecx, [edx + CONNECT_DATA.num_uri_args] + mov esi, [esp + 4*2 + 8] + mov edx, [edx + CONNECT_DATA.uri_arg] + test ecx, ecx + jz .not_found +.loop: + mov edi, [edx] + push esi +@@: + cmpsb + jne @f + cmp byte[esi - 1], 0 + jne @b + + pop esi + mov eax, [edx + 4] + jmp .exit +@@: + pop esi + add edx, 4*2 ; size array item + loop .loop +.not_found: + xor eax, eax +.exit: + pop edi esi + ret 8 + +;char* find_header(CONNECT_DATA* session, char* key) +find_header: + push esi edi + mov edx, [esp + 4*2 + 4] + mov ecx, [edx + CONNECT_DATA.num_headers] + mov esi, [esp + 4*2 + 8] + mov edx, [edx + CONNECT_DATA.http_headers] + test ecx, ecx + jz .not_found +.loop: + mov edi, [edx] + push esi +@@: + cmpsb + jne @f + cmp byte[esi - 1], 0 + jne @b + + pop esi + mov eax, [edx + 4] + jmp .exit +@@: + pop esi + add edx, 4*2 ; size array item + loop .loop +.not_found: + xor eax, eax +.exit: + pop edi esi + ret 8 + +;void close_server() +close_server: + + ret \ No newline at end of file