Fixed some bugs in downloader, added some error handling.

git-svn-id: svn://kolibrios.org@3564 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2013-05-29 09:21:49 +00:00
parent 867abdc948
commit a35c1d0445

View File

@ -19,7 +19,7 @@ URLMAXLEN = 1024
primary_buffer_size = 4096 primary_buffer_size = 4096
__DEBUG__ = 1 __DEBUG__ = 1
__DEBUG_LEVEL__ = 1 __DEBUG_LEVEL__ = 2
format binary as "" format binary as ""
@ -190,7 +190,7 @@ mouse:
jmp still jmp still
save: save:
DEBUGF 1, "file saved\n" DEBUGF 2, "File saved\n"
mcall 70, fileinfo mcall 70, fileinfo
mov ecx, [sc.work_text] mov ecx, [sc.work_text]
@ -363,15 +363,18 @@ read_incoming_data:
.rid: .rid:
push esi push esi
push edi push edi
DEBUGF 1, "rid\n" DEBUGF 1, "Reading incoming data\n"
.read: .read:
; TODO: implement timeout !
mcall recv, [socketnum], primary_buf, primary_buffer_size, 0 mcall recv, [socketnum], primary_buf, primary_buffer_size, 0
inc eax ; -1 = error (socket closed?) inc eax ; -1 = error (socket closed?)
jz .no_more_data jz .no_more_data
dec eax ; 0 bytes... dec eax ; 0 bytes...
jz .read jz .read
DEBUGF 1, "Got chunk of %u bytes\n", eax
mov edi, [pos] mov edi, [pos]
add [pos], eax add [pos], eax
push eax push eax
@ -385,9 +388,14 @@ read_incoming_data:
.no_more_data: .no_more_data:
DEBUGF 1, "No more data\n"
; mov [status], 4 ; connection closed by server ; mov [status], 4 ; connection closed by server
call parse_result call parse_result
DEBUGF 1, "Parsing complete\n"
mov ecx, [shared_name] mov ecx, [shared_name]
test ecx, ecx test ecx, ecx
jz @f jz @f
@ -397,10 +405,11 @@ read_incoming_data:
mcall 70, fileinfo mcall 70, fileinfo
DEBUGF 2, "File saved\n"
mov ecx, [sc.work_text] mov ecx, [sc.work_text]
or ecx, 0x80000000 or ecx, 0x80000000
mcall 4, <10, 93>, , download_complete mcall 4, <10, 93>, , download_complete
DEBUGF 1, "file saved\n"
pop edi pop edi
pop esi pop esi
@ -449,12 +458,11 @@ parse_result:
; close socket ; close socket
mcall close, [socketnum] mcall close, [socketnum]
DEBUGF 1, "close socketnum: 0x%x\n", eax
mov edi, [buf_ptr] mov edi, [buf_ptr]
mov edx, [pos] mov edx, [pos]
mov [buf_size], edx mov [buf_size], edx
; mcall 70, fileinfo_tmp ; mcall 70, fileinfo_tmp
DEBUGF 1, "pos = 0x%x\n", edx DEBUGF 1, "Parsing result (%u bytes)\n", edx
; first, find end of headers ; first, find end of headers
.next_byte: .next_byte:
@ -465,12 +473,13 @@ parse_result:
inc edi inc edi
dec edx dec edx
jne .next_byte jne .next_byte
DEBUGF 1, "Uh-oh, there's no end of header!\n"
; no end of headers. it's an error. let client see all those headers. ; no end of headers. it's an error. let client see all those headers.
ret ret
.end_of_headers: .end_of_headers:
; here we look at headers and search content-length or transfer-encoding headers ; here we look at headers and search content-length or transfer-encoding headers
; DEBUGF 1, "eoh\n" DEBUGF 1, "Found end of header\n"
sub edi, [buf_ptr] sub edi, [buf_ptr]
add edi, 4 add edi, 4
@ -498,7 +507,7 @@ parse_result:
je .cl_error je .cl_error
jmp .cl_next jmp .cl_next
.cl_error: .cl_error:
; DEBUGF 1, "content-length not found\n" DEBUGF 1, "content-length not found\n"
; find 'chunked' ; find 'chunked'
; äà, ÿ êîïèðóþ êîä, ýòî óæàñíî, íî ìíå õî÷åòñÿ, ÷òîáû ïîñêîðåå çàðàáîòàëî ; äà, ÿ êîïèðóþ êîä, ýòî óæàñíî, íî ìíå õî÷åòñÿ, ÷òîáû ïîñêîðåå çàðàáîòàëî
@ -543,25 +552,27 @@ parse_result:
.cl_found: .cl_found:
call read_number ; eax = number from *esi call read_number ; eax = number from *esi
DEBUGF 1, "Content length: %u\n", eax
.write_final_size: .write_final_size:
mov [final_size], eax ; if this works, i will b very happy...
mov ebx, [pos] ; we well check if it is right mov ebx, [buf_size]
sub ebx, [body_pos] sub ebx, [body_pos]
cmp eax, ebx
jbe .size_ok
DEBUGF 2, "Not all data was received!\n"
mov eax, ebx
.size_ok:
mov [final_size], eax
; everything is ok, so we return mov ebx, [body_pos]
mov eax, [body_pos] add ebx, [buf_ptr]
mov ebx, [buf_ptr]
add ebx, eax
mov [final_buffer], ebx mov [final_buffer], ebx
; mov ebx, [pos]
; sub ebx, eax
; mov [final_size], ebx
ret ret
parse_chunks: parse_chunks:
; DEBUGF 1, "parse chunks\n" DEBUGF 1, "parse chunks\n"
; we have to look through the data and remove sizes of chunks we see ; we have to look through the data and remove sizes of chunks we see
; 1. read size of next chunk ; 1. read size of next chunk
; 2. if 0, it's end. if not, continue. ; 2. if 0, it's end. if not, continue.
@ -575,7 +586,7 @@ parse_chunks:
mov ebx, eax mov ebx, eax
sub ebx, [buf_ptr] sub ebx, [buf_ptr]
mov edx, eax mov edx, eax
; DEBUGF 1, "rs " DEBUGF 1, "rs "
cmp ebx, [pos] cmp ebx, [pos]
jae chunks_end ; not good jae chunks_end ; not good
@ -589,7 +600,7 @@ parse_chunks:
add ebx, eax add ebx, eax
mov [prev_chunk_end], ebx mov [prev_chunk_end], ebx
; DEBUGF 1, "sz " DEBUGF 1, "sz "
; do copying: from buf_ptr+edx to final_buffer+prev_final_size count eax ; do copying: from buf_ptr+edx to final_buffer+prev_final_size count eax
; realloc final buffer ; realloc final buffer
@ -599,13 +610,13 @@ parse_chunks:
add [final_size], eax add [final_size], eax
mcall 68, 20, [final_size], [final_buffer] mcall 68, 20, [final_size], [final_buffer]
mov [final_buffer], eax mov [final_buffer], eax
; DEBUGF 1, "re " DEBUGF 1, "re "
pop edi pop edi
pop esi pop esi
pop ecx pop ecx
; add [pos], ecx ; add [pos], ecx
add edi, [final_buffer] add edi, [final_buffer]
; DEBUGF 1, "cp " DEBUGF 1, "cp "
rep movsb rep movsb
jmp .read_size jmp .read_size
@ -845,9 +856,7 @@ pu_004:
pu_009: pu_009:
; For debugging, display resulting strings ; For debugging, display resulting strings
DEBUGF 1, "document_user: %s\n", document_user DEBUGF 2, "Downloadng %s\n", document_user
DEBUGF 1, "webAddr: %s\n", webAddr
DEBUGF 1, "document: %s\n", document
; Look up the ip address, or was it specified? ; Look up the ip address, or was it specified?
mov al, [proxyAddr] mov al, [proxyAddr]
@ -904,12 +913,11 @@ pu_010:
push webAddr push webAddr
call [getaddrinfo] call [getaddrinfo]
pop esi pop esi
; test for error ; TODO: handle error
DEBUGF 1, "eax=0x%x\n", eax
; test eax, eax ; test eax, eax
; jnz .fail_dns ; jnz .fail_dns
; fill in ip in sockstruct ; fill in ip
mov eax, [esi + addrinfo.ai_addr] mov eax, [esi + addrinfo.ai_addr]
mov eax, [eax + sockaddr_in.sin_addr] mov eax, [eax + sockaddr_in.sin_addr]
mov [server_ip], eax mov [server_ip], eax