Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 4232 → Rev 4233

/programs/develop/libraries/http/http.asm
6,6 → 6,7
;; HTTP library for KolibriOS ;;
;; ;;
;; Written by hidnplayr@kolibrios.org ;;
;; Proxy code written by CleverMouse ;;
;; ;;
;; GNU GENERAL PUBLIC LICENSE ;;
;; Version 2, June 1991 ;;
152,14 → 153,6
mov [pageaddr], ebx
mov [port], ecx
 
; Do we need to use a proxy?
cmp [proxyAddr], 0
jne .proxy_done
 
.proxy_done:
 
;;;;
 
; Connect to the other side.
stdcall open_connection, [hostname], [port]
test eax, eax
177,6 → 170,14
mov esi, str_get
copy_till_zero
 
; If we are using a proxy, send complete URL, otherwise send only page address.
cmp [proxyAddr], 0
je .no_proxy
mov esi, str_http ; prepend 'http://'
copy_till_zero
mov esi, [hostname]
copy_till_zero
.no_proxy:
mov esi, [pageaddr]
copy_till_zero
 
193,6 → 194,11
copy_till_zero
@@:
 
cmp byte[proxyUser], 0
je @f
call append_proxy_auth_header
@@:
 
mov esi, str_close
mov ecx, str_close.length
rep movsb
258,15 → 264,6
mov [pageaddr], ebx
mov [port], ecx
 
; Do we need to use a proxy?
cmp [proxyAddr], 0
jne .proxy_done
 
; TODO: set hostname to that of the
.proxy_done:
 
;;;;
 
; Connect to the other side.
stdcall open_connection, [hostname], [port]
test eax, eax
284,6 → 281,14
mov esi, str_head
copy_till_zero
 
; If we are using a proxy, send complete URL, otherwise send only page address.
cmp [proxyAddr], 0
je .no_proxy
mov esi, str_http ; prepend 'http://'
copy_till_zero
mov esi, [hostname]
copy_till_zero
.no_proxy:
mov esi, [pageaddr]
copy_till_zero
 
300,6 → 305,11
copy_till_zero
@@:
 
cmp byte[proxyUser], 0
je @f
call append_proxy_auth_header
@@:
 
mov esi, str_close
mov ecx, str_close.length
rep movsb
367,15 → 377,6
mov [pageaddr], ebx
mov [port], ecx
 
; Do we need to use a proxy?
cmp [proxyAddr], 0
jne .proxy_done
 
; TODO: set hostname to that of the
.proxy_done:
 
;;;;
 
; Connect to the other side.
stdcall open_connection, [hostname], [port]
test eax, eax
393,6 → 394,14
mov esi, str_post
copy_till_zero
 
; If we are using a proxy, send complete URL, otherwise send only page address.
cmp [proxyAddr], 0
je .no_proxy
mov esi, str_http ; prepend 'http://'
copy_till_zero
mov esi, [hostname]
copy_till_zero
.no_proxy:
mov esi, [pageaddr]
copy_till_zero
 
408,7 → 417,7
rep movsb
 
mov eax, [content_length]
call ascii_dec
call eax_ascii_dec
 
mov esi, str_post_ct
mov ecx, str_post_ct.length
423,6 → 432,11
copy_till_zero
@@:
 
cmp byte[proxyUser], 0
je @f
call append_proxy_auth_header
@@:
 
mov esi, str_close
mov ecx, str_close.length
rep movsb
1147,6 → 1161,15
socketnum dd ?
endl
 
cmp [proxyAddr], 0
je .no_proxy
 
mov [hostname], proxyAddr
 
push [proxyPort]
pop [port]
.no_proxy:
 
; Resolve the hostname
DEBUGF 1, "Resolving hostname\n"
push esp ; reserve stack place
1216,6 → 1239,7
;;------------------------------------------------------------------------------------------------;;
;< eax = 0 (error) / ptr to ASCIIZ hostname ;;
;< ebx = ptr to ASCIIZ pageaddr ;;
;< ecx = port number ;;
;;================================================================================================;;
 
locals
1222,6 → 1246,7
urlsize dd ?
hostname dd ?
pageaddr dd ?
port dd ?
endl
 
DEBUGF 1, "parsing URL: %s\n", [URL]
1238,11 → 1263,8
inc esi
dec ecx
jnz .loop1
jmp .invalid
 
DEBUGF 1, "Invalid URL\n"
xor eax, eax
ret
 
.skip_proto:
inc esi ; skip the two '/'
inc esi
1266,7 → 1288,7
push ecx edi ; remember the pointer and length of pageaddr
 
 
; Create new buffer and put hostname in it
; Create new buffer and put hostname in it.
mov ecx, edi
sub ecx, [URL]
inc ecx ; we will add a 0 byte at the end
1282,10 → 1304,40
xor al, al
stosb
 
; Check if user provided a port, and convert it if so.
mov esi, [hostname]
mov [port], 80 ; default port if user didnt provide one
.portloop:
lodsb
test al, al
jz .no_port
cmp al, ':'
jne .portloop
 
push esi
call ascii_dec_ebx
pop edi
cmp byte[esi-1], 0
jne .invalid
cmp [proxyAddr], 0 ; remove port number from hostname
jne @f ; unless when we are using proxy
mov byte[edi-1], 0
@@:
test ebx, ebx
je .invalid
cmp ebx, 0xffff
ja .invalid
mov [port], ebx
.no_port:
 
 
; Did user provide a pageaddr?
mov [pageaddr], str_slash ; assume there is no pageaddr
pop esi ecx
test ecx, ecx
jz .no_page
 
; Create new buffer and put pageaddr into it.
inc ecx ; we will add a 0 byte at the end
invoke mem.alloc, ecx
or eax, eax
1297,11 → 1349,11
rep movsb
xor al, al
stosb
 
.no_page:
 
mov eax, [hostname]
mov ebx, [pageaddr]
mov ecx, 80 ;;;; FIXME
mov ecx, [port]
 
DEBUGF 1, "hostname: %s\n", eax
DEBUGF 1, "pageaddr: %s\n", ebx
1310,15 → 1362,102
ret
 
.no_mem:
DEBUGF 1, "Out of memory!\n"
xor eax, eax
ret
 
.invalid:
DEBUGF 1, "Invalid URL!\n"
xor eax, eax
ret
 
endp
 
 
 
 
 
;;================================================================================================;;
proc ascii_dec ;//////////////////////////////////////////////////////////////////////////////////;;
proc append_proxy_auth_header ;///////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Appends the proxy authentication header ;;
;;------------------------------------------------------------------------------------------------;;
;> / ;;
;;------------------------------------------------------------------------------------------------;;
;< / ;;
;;================================================================================================;;
mov esi, str_proxy_auth
mov ecx, str_proxy_auth.length
rep movsb
; base64-encode string <user>:<password>
mov esi, proxyUser
 
apah000:
lodsb
test al, al
jz apah001
call encode_base64_byte
jmp apah000
 
apah001:
mov al, ':'
call encode_base64_byte
mov esi, proxyPassword
 
apah002:
lodsb
test al, al
jz apah003
call encode_base64_byte
jmp apah002
 
apah003:
call encode_base64_final
ret
 
encode_base64_byte:
inc ecx
shl edx, 8
mov dl, al
cmp ecx, 3
je ebb001
ret
 
ebb001:
shl edx, 8
inc ecx
 
ebb002:
rol edx, 6
xor eax, eax
xchg al, dl
mov al, [base64_table+eax]
stosb
loop ebb002
ret
 
encode_base64_final:
mov al, 0
test ecx, ecx
jz ebf000
call encode_base64_byte
test ecx, ecx
jz ebf001
call encode_base64_byte
mov byte [edi-2], '='
 
ebf001:
mov byte [edi-1], '='
 
ebf000:
ret
 
endp
 
 
;;================================================================================================;;
proc eax_ascii_dec ;//////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Convert eax to ASCII decimal number ;;
;;------------------------------------------------------------------------------------------------;;
;> eax = number ;;
1351,6 → 1490,35
 
 
;;================================================================================================;;
proc ascii_dec_ebx ;//////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Convert ASCII decimal number to ebx ;;
;;------------------------------------------------------------------------------------------------;;
;> esi = ptr where to read ASCII decimal number ;;
;;------------------------------------------------------------------------------------------------;;
;> ebx = number ;;
;;================================================================================================;;
 
xor eax, eax
xor ebx, ebx
.loop:
lodsb
sub al, '0'
jb .done
cmp al, 9
ja .done
lea ebx, [ebx + 4*ebx]
shl ebx, 1
add ebx, eax
jmp .loop
.done:
 
ret
 
endp
 
 
;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;;
;! Imported functions section ;;
1427,6 → 1595,8
str_proxy_auth db 13, 10, 'Proxy-Authorization: Basic '
.length = $ - str_proxy_auth
 
str_http db 'http://', 0
 
base64_table db 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
db '0123456789+/'