From 0c94d220801222fcd6737d9d307dbef61d7bca8b Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Mon, 11 Nov 2013 11:35:18 +0000 Subject: [PATCH] 'free' and 'stop' functions for HTTP library. git-svn-id: svn://kolibrios.org@4205 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/http/examples/downloader.asm | 5 +- programs/develop/libraries/http/http.asm | 73 ++++++++++++++++++- programs/develop/libraries/http/http.inc | 3 +- 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/programs/develop/libraries/http/examples/downloader.asm b/programs/develop/libraries/http/examples/downloader.asm index 2610d4ad61..e77658f199 100644 --- a/programs/develop/libraries/http/examples/downloader.asm +++ b/programs/develop/libraries/http/examples/downloader.asm @@ -133,7 +133,7 @@ mouse: exit: DEBUGF 1, "Exiting\n" - mcall 68, 13, [identifier] ; free buffer + invoke HTTP_free, [identifier] ; free buffer fail: or eax, -1 ; close this program mcall @@ -208,7 +208,8 @@ library lib_http, 'http.obj', \ import lib_http, \ HTTP_get , 'get' , \ - HTTP_process , 'process' + HTTP_process , 'process' ,\ + HTTP_free , 'free' import box_lib, \ edit_box_draw, 'edit_box', \ diff --git a/programs/develop/libraries/http/http.asm b/programs/develop/libraries/http/http.asm index ce7f3f737e..bb51cd769a 100644 --- a/programs/develop/libraries/http/http.asm +++ b/programs/develop/libraries/http/http.asm @@ -57,7 +57,7 @@ macro HTTP_init_buffer buffer, socketnum { push socketnum popd [eax + http_msg.socket] lea esi, [eax + http_msg.data] - mov [eax + http_msg.flags], 0 + mov [eax + http_msg.flags], FLAG_CONNECTED mov [eax + http_msg.write_ptr], esi mov [eax + http_msg.buffer_length], BUFFERSIZE - http_msg.data mov [eax + http_msg.chunk_ptr], 0 @@ -413,6 +413,9 @@ proc HTTP_process identifier ;////////////////////////////////////////////////// pusha mov ebp, [identifier] + test [ebp + http_msg.flags], FLAG_CONNECTED + jz .connection_closed + ; Receive some data mcall recv, [ebp + http_msg.socket], [ebp + http_msg.write_ptr], \ [ebp + http_msg.buffer_length], MSG_DONTWAIT @@ -700,7 +703,8 @@ proc HTTP_process identifier ;////////////////////////////////////////////////// mov [ebp + http_msg.content_received], eax .got_all_data: DEBUGF 1, "We got all the data! (%u bytes)\n", [ebp + http_msg.content_length] - or [ebp + http_msg.flags], FLAG_GOT_DATA + or [ebp + http_msg.flags], FLAG_GOT_ALL_DATA + and [ebp + http_msg.flags], not FLAG_CONNECTED mcall close, [ebp + http_msg.socket] popa xor eax, eax @@ -712,6 +716,9 @@ proc HTTP_process identifier ;////////////////////////////////////////////////// DEBUGF 1, "ERROR: socket error %u\n", ebx or [ebp + http_msg.flags], FLAG_SOCKET_ERROR + and [ebp + http_msg.flags], not FLAG_CONNECTED + mcall close, [ebp + http_msg.socket] + .connection_closed: popa xor eax, eax ret @@ -720,6 +727,8 @@ proc HTTP_process identifier ;////////////////////////////////////////////////// pop eax DEBUGF 1, "ERROR: invalid header\n" or [ebp + http_msg.flags], FLAG_INVALID_HEADER + and [ebp + http_msg.flags], not FLAG_CONNECTED + mcall close, [ebp + http_msg.socket] popa xor eax, eax ret @@ -729,6 +738,8 @@ proc HTTP_process identifier ;////////////////////////////////////////////////// .no_ram: DEBUGF 1, "ERROR: out of RAM\n" or [ebp + http_msg.flags], FLAG_NO_RAM + and [ebp + http_msg.flags], not FLAG_CONNECTED + mcall close, [ebp + http_msg.socket] popa xor eax, eax ret @@ -737,6 +748,59 @@ endp + +;;================================================================================================;; +proc HTTP_free identifier ;///////////////////////////////////////////////////////////////////////;; +;;------------------------------------------------------------------------------------------------;; +;? Free the http_msg structure ;; +;;------------------------------------------------------------------------------------------------;; +;> identifier = pointer to buffer containing http_msg struct. ;; +;;------------------------------------------------------------------------------------------------;; +;< none ;; +;;================================================================================================;; + + pusha + mov ebp, [identifier] + + test [ebp + http_msg.flags], FLAG_CONNECTED + jz .not_connected + + and [ebp + http_msg.flags], not FLAG_CONNECTED + mcall close, [ebp + http_msg.socket] + + .not_connected: + invoke mem.free, ebp + + popa + ret + +endp + + + +;;================================================================================================;; +proc HTTP_stop identifier ;///////////////////////////////////////////////////////////////////////;; +;;------------------------------------------------------------------------------------------------;; +;? Stops the open connection ;; +;;------------------------------------------------------------------------------------------------;; +;> identifier = pointer to buffer containing http_msg struct. ;; +;;------------------------------------------------------------------------------------------------;; +;< none ;; +;;================================================================================================;; + + pusha + mov ebp, [identifier] + + and [ebp + http_msg.flags], not FLAG_CONNECTED + mcall close, [ebp + http_msg.socket] + + popa + ret + +endp + + + ;;================================================================================================;; proc find_header_field identifier, headername ;///////////////////////////////////////////////////;; ;;------------------------------------------------------------------------------------------------;; @@ -810,6 +874,7 @@ endp + ;;================================================================================================;; ;;////////////////////////////////////////////////////////////////////////////////////////////////;; ;;================================================================================================;; @@ -1079,7 +1144,9 @@ export \ HTTP_head , 'head' , \ HTTP_post , 'post' , \ find_header_field , 'find_header_field' , \ - HTTP_process , 'process' + HTTP_process , 'process' , \ + HTTP_free , 'free' , \ + HTTP_stop , 'stop' ; HTTP_put , 'put' , \ ; HTTP_delete , 'delete' , \ diff --git a/programs/develop/libraries/http/http.inc b/programs/develop/libraries/http/http.inc index 90119eafd2..4b9d8a32db 100644 --- a/programs/develop/libraries/http/http.inc +++ b/programs/develop/libraries/http/http.inc @@ -15,9 +15,10 @@ FLAG_HTTP11 = 1 shl 0 FLAG_GOT_HEADER = 1 shl 1 -FLAG_GOT_DATA = 1 shl 2 +FLAG_GOT_ALL_DATA = 1 shl 2 FLAG_CONTENT_LENGTH = 1 shl 3 FLAG_CHUNKED = 1 shl 4 +FLAG_CONNECTED = 1 shl 5 ; error flags go into the upper word FLAG_INVALID_HEADER = 1 shl 16