HTTP library: small bugfixes, more comments.

git-svn-id: svn://kolibrios.org@4202 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2013-11-10 21:05:08 +00:00
parent 67d71e74e1
commit a3b0093ead

View File

@ -113,9 +113,9 @@ lib_init: ;//////////////////////////////////////////////////////////////////;;
;;================================================================================================;; ;;================================================================================================;;
proc HTTP_get URL ;///////////////////////////////////////////////////////////////////////////////;; proc HTTP_get URL ;///////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;? ;; ;? Initiates a HTTP connection, using 'GET' method. ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;> _ ;; ;> URL = pointer to ASCIIZ URL ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = 0 (error) / buffer ptr ;; ;< eax = 0 (error) / buffer ptr ;;
;;================================================================================================;; ;;================================================================================================;;
@ -202,11 +202,11 @@ endp
;;================================================================================================;; ;;================================================================================================;;
proc HTTP_head URL ;///////////////////////////////////////////////////////////////////////////////;; proc HTTP_head URL ;//////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;? ;; ;? Initiates a HTTP connection, using 'HEAD' method. ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;> _ ;; ;> URL = pointer to ASCIIZ URL ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = 0 (error) / buffer ptr ;; ;< eax = 0 (error) / buffer ptr ;;
;;================================================================================================;; ;;================================================================================================;;
@ -295,9 +295,11 @@ endp
;;================================================================================================;; ;;================================================================================================;;
proc HTTP_post URL, content_type, content_length ;////////////////////////////////////////////////;; proc HTTP_post URL, content_type, content_length ;////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;? ;; ;? Initiates a HTTP connection, using 'GET' method. ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;> _ ;; ;> URL = pointer to ASCIIZ URL ;;
;> content_type = pointer to ASCIIZ string containing content type ;;
;> content_length = length of content (in bytes) ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = 0 (error) / buffer ptr ;; ;< eax = 0 (error) / buffer ptr ;;
;;================================================================================================;; ;;================================================================================================;;
@ -401,9 +403,10 @@ endp
;;================================================================================================;; ;;================================================================================================;;
proc HTTP_process identifier ;////////////////////////////////////////////////////////////////////;; proc HTTP_process identifier ;////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;? ;; ;? Receive data from the server, parse headers and put data in receive buffer. ;;
;? To complete a transfer, this procedure must be called over and over again untill it returns 0. ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;> _ ;; ;> identifier = pointer to buffer containing http_msg struct. ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = -1 (not finished) / 0 finished ;; ;< eax = -1 (not finished) / 0 finished ;;
;;================================================================================================;; ;;================================================================================================;;
@ -601,9 +604,9 @@ endl
.chunk_loop: .chunk_loop:
mov ecx, [ebp + http_msg.write_ptr] mov ecx, [ebp + http_msg.write_ptr]
sub ecx, [ebp + http_msg.chunk_ptr] sub ecx, [ebp + http_msg.chunk_ptr]
jb .need_more_data_chunked jb .need_more_data_chunked ; TODO: use this ecx !!!
; TODO: make sure we have the complete chunkline header ; Chunkline starts here, convert the ASCII hex number into ebx
mov esi, [ebp + http_msg.chunk_ptr] mov esi, [ebp + http_msg.chunk_ptr]
xor ebx, ebx xor ebx, ebx
.chunk_hexloop: .chunk_hexloop:
@ -625,20 +628,25 @@ endl
jmp .chunk_hexloop jmp .chunk_hexloop
.chunk_: .chunk_:
DEBUGF 1, "got chunk of %u bytes\n", ebx DEBUGF 1, "got chunk of %u bytes\n", ebx
;; cmp esi, [ebp + http_msg.chunk_ptr]
;; je
; If chunk size is 0, all chunks have been received. ; If chunk size is 0, all chunks have been received.
test ebx, ebx test ebx, ebx
jz .got_all_data_chunked ; last chunk, hooray! FIXME: what if it wasnt a valid hex number??? jz .got_all_data_chunked ; last chunk, hooray! FIXME: what if it wasnt a valid hex number???
mov edi, [ebp + http_msg.chunk_ptr] ; we'll need this in about 25 lines...
add [ebp + http_msg.chunk_ptr], ebx
; Chunkline ends with a CR, LF or simply LF ; Chunkline ends with a CR, LF or simply LF
.end_of_chunkline?: ; FIXME: buffer overflow possible! .end_of_chunkline?:
cmp al, 10 cmp al, 10
je .end_of_chunkline je .end_of_chunkline
lodsb lodsb
jmp .end_of_chunkline? cmp edi, [ebp + http_msg.write_ptr]
jb .end_of_chunkline?
jmp .need_more_data
.end_of_chunkline: .end_of_chunkline:
; Update chunk ptr, and remember old one
mov edi, [ebp + http_msg.chunk_ptr]
add [ebp + http_msg.chunk_ptr], ebx
; Realloc buffer, make it 'chunksize' bigger. ; Realloc buffer, make it 'chunksize' bigger.
mov eax, [ebp + http_msg.buffer_length] mov eax, [ebp + http_msg.buffer_length]
add eax, ebx add eax, ebx
@ -725,17 +733,21 @@ endp
;;================================================================================================;; ;;================================================================================================;;
proc find_header_field identifier, headername ;///////////////////////////////////////////////////;; proc find_header_field identifier, headername ;///////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;? ;; ;? Find a header field in the received HTTP header ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;> _ ;; ;> identifier = ptr to http_msg struct ;;
;> headername = ptr to ASCIIZ string containg field you want to find (must be in lowercase) ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = -1 (error) / 0 ;; ;< eax = 0 (error) / ptr to content of the HTTP header field ;;
;;================================================================================================;; ;;================================================================================================;;
push ebx ecx edx esi edi push ebx ecx edx esi edi
DEBUGF 1, "Find header field: %s\n", [headername] DEBUGF 1, "Find header field: %s\n", [headername]
mov ebx, [identifier] mov ebx, [identifier]
test [ebx + http_msg.flags], FLAG_GOT_HEADER
jz .fail
lea edx, [ebx + http_msg.data] lea edx, [ebx + http_msg.data]
mov ecx, edx mov ecx, edx
add ecx, [ebx + http_msg.header_length] add ecx, [ebx + http_msg.header_length]
@ -789,16 +801,28 @@ proc find_header_field identifier, headername ;/////////////////////////////////
endp endp
; internal procedures start here:
;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;;
;! Internal procedures section ;;
;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;;
;;================================================================================================;; ;;================================================================================================;;
proc open_connection hostname, port ;/////////////////////////////////////////////////////////////;; proc open_connection hostname, port ;/////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;? ;; ;? Connects to a HTTP server ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;> _ ;; ;> hostname = ptr to ASCIIZ hostname ;;
;> port = port (x86 byte order) ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = -1 (error) / 0 ;; ;< eax = 0 (error) / socketnum ;;
;;================================================================================================;; ;;================================================================================================;;
locals locals
@ -869,11 +893,12 @@ endp
;;================================================================================================;; ;;================================================================================================;;
proc parse_url URL ;//////////////////////////////////////////////////////////////////////////////;; proc parse_url URL ;//////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;? ;; ;? Split a given URL into hostname and pageaddr ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;> _ ;; ;> URL = ptr to ASCIIZ URL ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = -1 (error) / 0 ;; ;< eax = 0 (error) / ptr to ASCIIZ hostname ;;
;< ebx = ptr to ASCIIZ pageaddr ;;
;;================================================================================================;; ;;================================================================================================;;
locals locals
@ -970,9 +995,16 @@ endl
endp endp
; in: eax = number ;;================================================================================================;;
; edi = ptr where to store ascii proc ascii_dec ;//////////////////////////////////////////////////////////////////////////////////;;
ascii_dec: ;;------------------------------------------------------------------------------------------------;;
;? Convert eax to ASCII decimal number ;;
;;------------------------------------------------------------------------------------------------;;
;> eax = number ;;
;> edi = ptr where to write ASCII decimal number ;;
;;------------------------------------------------------------------------------------------------;;
;< / ;;
;;================================================================================================;;
push -'0' push -'0'
mov ecx, 10 mov ecx, 10
@ -994,6 +1026,8 @@ ascii_dec:
ret ret
endp
;;================================================================================================;; ;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;; ;;////////////////////////////////////////////////////////////////////////////////////////////////;;