HTTP library: bugfix in lib_init, more comments, stubs for URI_escape and URI_unescape

git-svn-id: svn://kolibrios.org@4209 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2013-11-11 17:28:49 +00:00
parent 9763d2b7b2
commit 844b6d4681
2 changed files with 176 additions and 19 deletions

View File

@ -87,7 +87,7 @@ lib_init: ;//////////////////////////////////////////////////////////////////;;
;> ecx = pointer to memory reallocation routine ;; ;> ecx = pointer to memory reallocation routine ;;
;> edx = pointer to library loading routine ;; ;> edx = pointer to library loading routine ;;
;;---------------------------------------------------------------------------;; ;;---------------------------------------------------------------------------;;
;< eax = 1 (fail) / 0 (ok) (library initialization result) ;; ;< eax = 1 (fail) / 0 (ok) ;;
;;===========================================================================;; ;;===========================================================================;;
mov [mem.alloc], eax mov [mem.alloc], eax
mov [mem.free], ebx mov [mem.free], ebx
@ -95,8 +95,8 @@ lib_init: ;//////////////////////////////////////////////////////////////////;;
mov [dll.load], edx mov [dll.load], edx
invoke dll.load, @IMPORT invoke dll.load, @IMPORT
or eax, eax test eax, eax
jz .ok jnz .error
; load proxy settings ; load proxy settings
invoke ini.get_str, inifile, sec_proxy, key_proxy, proxyAddr, 256, proxyAddr invoke ini.get_str, inifile, sec_proxy, key_proxy, proxyAddr, 256, proxyAddr
@ -106,13 +106,13 @@ lib_init: ;//////////////////////////////////////////////////////////////////;;
invoke ini.get_str, inifile, sec_proxy, key_password, proxyPassword, 256, proxyPassword invoke ini.get_str, inifile, sec_proxy, key_password, proxyPassword, 256, proxyPassword
xor eax, eax xor eax, eax
inc eax
ret ret
.ok: .error:
xor eax, eax xor eax, eax
ret inc eax
ret
@ -421,6 +421,7 @@ proc HTTP_process identifier ;//////////////////////////////////////////////////
pusha pusha
mov ebp, [identifier] mov ebp, [identifier]
; If the connection is closed, return immediately
test [ebp + http_msg.flags], FLAG_CONNECTED test [ebp + http_msg.flags], FLAG_CONNECTED
jz .connection_closed jz .connection_closed
@ -431,6 +432,7 @@ proc HTTP_process identifier ;//////////////////////////////////////////////////
je .check_socket je .check_socket
DEBUGF 1, "Received %u bytes\n", eax DEBUGF 1, "Received %u bytes\n", eax
; Update timestamp
push eax push eax
mcall 29, 9 mcall 29, 9
mov [ebp + http_msg.timestamp], eax mov [ebp + http_msg.timestamp], eax
@ -888,6 +890,143 @@ endp
;;================================================================================================;;
proc URI_escape URI ;/////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? ;;
;;------------------------------------------------------------------------------------------------;;
;> URI = ptr to ASCIIZ URI ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = 0 (error) / ptr to ASCIIZ URI ;;
;;================================================================================================;;
pusha
invoke mem.alloc, URLMAXLEN
test eax, eax
jz .error
mov [esp + 7 * 4], eax ; return ptr in eax
mov esi, [URI]
mov edi, eax
xor ebx, ebx
xor ecx, ecx
.loop:
lodsb
test al, al
jz .done
mov cl, al
and cl, 0x1f
mov bl, al
shr bl, 5
bt dword[bits_must_escape + ebx], ecx
jc .escape
stosb
jmp .loop
.escape:
mov al, '%'
stosb
mov bl, byte[esi-1]
shr bl, 4
mov al, byte[str_hex + ebx]
stosb
mov bl, byte[esi-1]
and bl, 0x0f
mov al, byte[str_hex + ebx]
stosb
jmp .loop
.done:
stosb
popa
ret
.error:
popa
xor eax, eax
ret
endp
;;================================================================================================;;
proc URI_unescape URI ;///////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? ;;
;;------------------------------------------------------------------------------------------------;;
;> URI = ptr to ASCIIZ URI ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = 0 (error) / ptr to ASCIIZ URI ;;
;;================================================================================================;;
pusha
invoke mem.alloc, URLMAXLEN
test eax, eax
jz .error
mov [esp + 7 * 4], eax ; return ptr in eax
mov esi, [URI]
mov edi, eax
.loop:
lodsb
test al, al
jz .done
cmp al, '%'
je .unescape
stosb
jmp .loop
.unescape:
xor ebx, ebx
xor ecx, ecx
.unescape_nibble:
lodsb
sub al, '0'
jb .fail
cmp al, 9
jbe .nibble_ok
sub al, 'A' - '0' - 10
jb .fail
cmp al, 15
jbe .nibble_ok
sub al, 'a' - 'A'
cmp al, 15
ja .fail
.nibble_ok:
shl bl, 8
or bl, al
dec ecx
jc .unescape_nibble
mov al, bl
stosb
jmp .loop
.fail:
DEBUGF 1, "ERROR: invalid URI!\n"
jmp .loop
.done:
stosb
popa
ret
.error:
popa
xor eax, eax
ret
endp
;;================================================================================================;; ;;================================================================================================;;
@ -1161,7 +1300,9 @@ export \
find_header_field , 'find_header_field' , \ find_header_field , 'find_header_field' , \
HTTP_process , 'process' , \ HTTP_process , 'process' , \
HTTP_free , 'free' , \ HTTP_free , 'free' , \
HTTP_stop , 'stop' HTTP_stop , 'stop' , \
URI_escape , 'escape' , \
URI_unescape , 'unescape'
; HTTP_put , 'put' , \ ; HTTP_put , 'put' , \
; HTTP_delete , 'delete' , \ ; HTTP_delete , 'delete' , \
@ -1201,6 +1342,20 @@ str_get db 'GET ', 0
str_head db 'HEAD ', 0 str_head db 'HEAD ', 0
str_post db 'POST ', 0 str_post db 'POST ', 0
bits_must_escape:
dd 0xffffffff ; 00-1F
dd 1 shl 0 + 1 shl 2 + 1 shl 3 + 1 shl 5 + 1 shl 28 + 1 shl 30 ; "#%<>
dd 1 shl 27 + 1 shl 28 + 1 shl 29 + 1 shl 30 ;[\]^
dd 1 shl 0 + 1 shl 27 + 1 shl 28 + 1 shl 29 + 1 shl 31 ;`{|} DEL
dd 0xffffffff
dd 0xffffffff
dd 0xffffffff
dd 0xffffffff
str_hex:
db '0123456789ABCDEF'
include_debug_strings include_debug_strings
; uninitialized data ; uninitialized data

View File

@ -13,29 +13,31 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Bitflags for http_msg.flags
FLAG_HTTP11 = 1 shl 0 FLAG_HTTP11 = 1 shl 0
FLAG_GOT_HEADER = 1 shl 1 FLAG_GOT_HEADER = 1 shl 1
FLAG_GOT_ALL_DATA = 1 shl 2 FLAG_GOT_ALL_DATA = 1 shl 2
FLAG_CONTENT_LENGTH = 1 shl 3 FLAG_CONTENT_LENGTH = 1 shl 3
FLAG_CHUNKED = 1 shl 4 FLAG_CHUNKED = 1 shl 4
FLAG_CONNECTED = 1 shl 5 FLAG_CONNECTED = 1 shl 5
; ERROR flags go into the upper word
; error flags go into the upper word
FLAG_INVALID_HEADER = 1 shl 16 FLAG_INVALID_HEADER = 1 shl 16
FLAG_NO_RAM = 1 shl 17 FLAG_NO_RAM = 1 shl 17
FLAG_SOCKET_ERROR = 1 shl 18 FLAG_SOCKET_ERROR = 1 shl 18
FLAG_TIMEOUT_ERROR = 1 shl 19 FLAG_TIMEOUT_ERROR = 1 shl 19
struc http_msg { struc http_msg {
.socket dd ?
.flags dd ? .socket dd ? ; socket on which the actual transfer happens
.write_ptr dd ? .flags dd ? ; flags, reflects status of the transfer using bitflags
.buffer_length dd ? .write_ptr dd ? ; internal use only (where to write new data in buffer)
.chunk_ptr dd ? .buffer_length dd ? ; internal use only (number of available bytes in buffer)
.timestamp dd ? .chunk_ptr dd ? ; internal use only (where the next chunk begins)
.status dd ? .timestamp dd ? ; internal use only (when last data was received)
.header_length dd ? .status dd ? ; HTTP status
.content_length dd ? .header_length dd ? ; length of HTTP header
.content_received dd ? .content_length dd ? ; length of HTTP content
.content_received dd ? ; number of currently received content bytes
.data: .data:
} }