mirror of
https://github.com/Doczom/simple-httpd.git
synced 2025-09-21 02:50:09 +02:00
## 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
261 lines
6.9 KiB
PHP
261 lines
6.9 KiB
PHP
|
|
|
|
|
|
|
|
struct HTTPD_MODULE
|
|
next rd 1
|
|
prev rd 1
|
|
httpd_close rd 1
|
|
httpd_serv rd 1
|
|
pdata rd 1
|
|
uri_path rb 4096-5*4
|
|
ends
|
|
|
|
struct RESPD
|
|
session rd 1
|
|
flags rd 1
|
|
http_status rd 1
|
|
http_ver_ptr rd 1
|
|
http_ver_len rd 1
|
|
buffer rd 1
|
|
buffer_size rd 1
|
|
http_body rd 1
|
|
count_header rd 1
|
|
header.ptr rd 1
|
|
header.len rd 1
|
|
rd 2*(64 - 1)
|
|
ends
|
|
|
|
|
|
struct REQUEST_DATA
|
|
ptr_name dd 0 ;
|
|
ptr_data dd 0 ;
|
|
ends
|
|
|
|
; Load server config
|
|
; ecx - path to file
|
|
; OUT: eax - 0 or err_code
|
|
load_settings:
|
|
mov ebp, ecx
|
|
|
|
sub esp, 16
|
|
mov esi, esp
|
|
invoke ini.get_str, ebp, ini_section_main, ini_key_ip, esi, 16, 0 ; ip
|
|
test eax, eax
|
|
jnz .error_exit2
|
|
; xxx.xxx.xxx.xxx\n - 16 byte max
|
|
xor edx, edx
|
|
xor eax, eax
|
|
mov ecx, 4 ; count '.'
|
|
@@:
|
|
add al, [esp]
|
|
sub al, '0'
|
|
inc esp
|
|
mul dword[_DIV_10_]
|
|
|
|
cmp byte[esp], '0' ; if . , space and other
|
|
jae @b
|
|
|
|
mov byte[srv_sockaddr.ip], al
|
|
ror dword[srv_sockaddr.ip], 8
|
|
add esp, 1
|
|
dec ecx
|
|
jnz @b
|
|
|
|
mov esp, esi
|
|
add esp, 16
|
|
|
|
|
|
mov word[srv_sockaddr], AF_INET4
|
|
|
|
invoke ini.get_int, ebp, ini_section_main, ini_key_port, 80 ; standart port
|
|
xchg al, ah
|
|
mov [srv_sockaddr.port], ax
|
|
|
|
invoke ini.get_int, ebp, ini_section_main, ini_key_conn, 10 ; standart port
|
|
mov [srv_backlog], ax
|
|
|
|
; flags
|
|
|
|
; work_dir
|
|
invoke ini.get_str, ebp, ini_section_main, ini_key_work_dir, GLOBAL_DATA.work_dir, 1024, 0
|
|
test eax, eax
|
|
jnz .error_exit
|
|
|
|
push edi
|
|
mov ecx, 1024
|
|
mov edi, GLOBAL_DATA.work_dir
|
|
xor eax, eax
|
|
repne scasb
|
|
dec edi
|
|
sub edi, GLOBAL_DATA.work_dir
|
|
mov [GLOBAL_DATA.work_dir.size], edi
|
|
pop edi
|
|
|
|
; get mime file
|
|
call load_mime_file
|
|
|
|
; units_dir
|
|
invoke ini.get_str, ebp, ini_section_main, ini_key_modules_dir, GLOBAL_DATA.modules_dir, 1024, 0
|
|
test eax, eax
|
|
jnz .no_modules
|
|
|
|
push edi
|
|
mov ecx, 1024
|
|
mov edi, GLOBAL_DATA.modules_dir
|
|
xor eax, eax
|
|
repne scasb
|
|
mov byte[edi-1], '/'
|
|
mov [GLOBAL_DATA.modules_dir.end], edi
|
|
pop edi
|
|
|
|
; get all units
|
|
invoke ini.enum_keys, ebp, ini_section_units, .add_module
|
|
.no_modules:
|
|
xor eax, eax
|
|
ret
|
|
|
|
.add_module: ; [esp + 4*3] - name [esp + 4*4] - value
|
|
; add new item in list
|
|
push dword sizeof.HTTPD_MODULE
|
|
call Alloc
|
|
test eax, eax
|
|
jz .add_module.exit
|
|
|
|
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_MODULE.prev], eax
|
|
@@:
|
|
; copy uri path
|
|
push esi edi
|
|
mov esi, [esp + 4*2 + 4*3] ; name
|
|
lea edi, [eax + HTTPD_MODULE.uri_path + 1]
|
|
mov byte[edi - 1], '/'
|
|
@@:
|
|
movsb
|
|
cmp byte[edi - 1], 0
|
|
jne @b
|
|
; copy file name
|
|
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
|
|
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_MODULE
|
|
pop esi
|
|
test eax, eax
|
|
jz @f
|
|
|
|
.add_module.err:
|
|
; error
|
|
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_module.exit
|
|
@@: ; good
|
|
; init httpd module
|
|
push dword[GLOBAL_DATA._module_cmd]
|
|
push dword EXPORT_DATA
|
|
invoke httpd_import.init
|
|
|
|
test eax, eax
|
|
jz .add_module.err
|
|
|
|
mov [esi + HTTPD_MODULE.pdata], eax
|
|
mov eax, [httpd_import.serv]
|
|
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_module_init
|
|
mov [httpd_import.serv], httpd_module_serv
|
|
mov [httpd_import.close], httpd_module_close
|
|
.add_module.exit:
|
|
ret 16
|
|
|
|
|
|
|
|
.error_exit2:
|
|
add esp, 16
|
|
.error_exit:
|
|
mov eax, -1
|
|
ret
|
|
|
|
|
|
load_mime_file:
|
|
stdcall Alloc, 4096
|
|
test eax, eax
|
|
jz .err
|
|
push eax
|
|
mov edi, eax
|
|
xor eax, eax
|
|
mov ecx, 1024
|
|
rep stosd
|
|
pop eax
|
|
|
|
mov esi, eax
|
|
lea ecx, [eax + sizeof.FILED + 40]
|
|
mov [esi + FILED.path], ecx
|
|
invoke ini.get_str, ebp, ini_section_main, ini_key_mime_file, ecx, 1024, 0
|
|
test eax, eax
|
|
jnz .no_file
|
|
|
|
lea ecx, [esi + sizeof.FILED]
|
|
mov [esi + FILED.buffer], ecx
|
|
stdcall FileInfo, esi
|
|
test eax, eax
|
|
jnz .no_file
|
|
|
|
mov ecx, [esi + sizeof.FILED + 32]
|
|
stdcall Alloc, ecx
|
|
test eax, eax
|
|
jz .no_file
|
|
|
|
mov ecx, [esi + sizeof.FILED + 32]
|
|
mov edi, eax
|
|
mov [esi + FILED.buffer], eax
|
|
mov [esi + FILED.size], ecx
|
|
mov [esi + FILED.offset], 0
|
|
mov dword[esi + FILED.offset + 4], 0
|
|
stdcall FileRead, esi
|
|
test eax, eax
|
|
jnz .error_read
|
|
|
|
mov dword[GLOBAL_DATA.MIME_types_arr], edi
|
|
mov eax, edi
|
|
@@:
|
|
add [edi], eax
|
|
mov ecx, [edi]
|
|
add edi, 4
|
|
cmp dword[ecx], 0
|
|
jne @b
|
|
|
|
stdcall Free, esi
|
|
ret
|
|
.error_read:
|
|
stdcall Free, edi
|
|
.no_file:
|
|
stdcall Free, esi
|
|
.err:
|
|
mov dword[GLOBAL_DATA.MIME_types_arr], STD_MIME_TYPE_ARR
|
|
ret |