From d191a775e67b818ec519d9ce91d9b9898cf74e44 Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Mon, 24 Aug 2015 13:43:34 +0000 Subject: [PATCH] http lib: Bugfixes for keepalive connections. git-svn-id: svn://kolibrios.org@5769 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/libraries/http/http.asm | 51 +++++++++------------ programs/develop/libraries/http/http_en.txt | 14 +++--- 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/programs/develop/libraries/http/http.asm b/programs/develop/libraries/http/http.asm index c8e617cba5..7270810c7f 100644 --- a/programs/develop/libraries/http/http.asm +++ b/programs/develop/libraries/http/http.asm @@ -145,7 +145,7 @@ proc HTTP_disconnect identifier ;/////////////////////////////////////////////// ret .error: - DEBUGF 2, "Cant close already closed connection!\n" + DEBUGF 1, "Cant close already closed connection!\n" popa ret @@ -299,19 +299,16 @@ endl DEBUGF 1, "Request has been sent to server.\n" cmp [identifier], 0 - jne .old_connection + je .new_connection + invoke mem.free, [buffer] + mov eax, [identifier] + mov [buffer], eax + .new_connection: HTTP_init_buffer [buffer], [socketnum], [flags] - popa mov eax, [buffer] ; return buffer ptr ret - .old_connection: - invoke mem.free, [buffer] - popa - mov eax, [identifier] - ret - .error: DEBUGF 2, "HTTP GET error!\n" popa @@ -441,19 +438,16 @@ endl DEBUGF 1, "Request has been sent to server.\n" cmp [identifier], 0 - jne .old_connection + je .new_connection + invoke mem.free, [buffer] + mov eax, [identifier] + mov [buffer], eax + .new_connection: HTTP_init_buffer [buffer], [socketnum], [flags] - popa mov eax, [buffer] ; return buffer ptr ret - .old_connection: - invoke mem.free, [buffer] - popa - mov eax, [identifier] - ret - .error: DEBUGF 2, "HTTP HEAD error!\n" popa @@ -598,22 +592,16 @@ endl DEBUGF 1, "Request has been sent to server.\n" cmp [identifier], 0 - jne .old_connection + je .new_connection + invoke mem.free, [buffer] + mov eax, [identifier] + mov [buffer], eax + .new_connection: HTTP_init_buffer [buffer], [socketnum], [flags] - popa mov eax, [buffer] ; return buffer ptr ret - .old_connection: - invoke mem.free, [buffer] - mov ebx, [flags] - mov eax, [identifier] - or [eax + http_msg.flags], ebx - popa - mov eax, [identifier] - ret - .error: DEBUGF 1, "HTTP POST error!\n" popa @@ -1055,8 +1043,11 @@ proc HTTP_receive identifier ;////////////////////////////////////////////////// .got_all_data: DEBUGF 1, "We got all the data! (%u bytes)\n", [ebp + http_msg.content_received] or [ebp + http_msg.flags], FLAG_GOT_ALL_DATA - and [ebp + http_msg.flags], not FLAG_CONNECTED + test [ebp + http_msg.flags], FLAG_KEEPALIVE + jnz @f mcall close, [ebp + http_msg.socket] + and [ebp + http_msg.flags], not FLAG_CONNECTED + @@: popa xor eax, eax ret @@ -1901,7 +1892,7 @@ str_proxy_auth db 13, 10, 'Proxy-Authorization: Basic ' str_close db 'User-Agent: KolibriOS libHTTP/1.1', 13, 10, 'Connection: Close', 13, 10, 13, 10 .length = $ - str_close str_keep db 'User-Agent: KolibriOS libHTTP/1.1', 13, 10, 'Connection: Keepalive', 13, 10, 13, 10 - .length = $ - str_close + .length = $ - str_keep str_http db 'http://', 0 diff --git a/programs/develop/libraries/http/http_en.txt b/programs/develop/libraries/http/http_en.txt index 1d0f53b2f4..43a6bee48d 100644 --- a/programs/develop/libraries/http/http_en.txt +++ b/programs/develop/libraries/http/http_en.txt @@ -1,8 +1,8 @@ get(*url, identifier, flags, *add_header); *url = pointer to ASCIIZ URL - identifier = identified of previously opened connection, or 0 to open a new one - flags = bit flags (see http.inc user flags and the end of this document) + identifier = identifier of previously opened connection (keep-alive), or 0 to open a new one. + flags = bit flags (see end of this document). *add_header = pointer to ASCIIZ additional header parameters, or null for none. Every additional parameter must end with CR LF bytes, including the last line. Initiates a HTTP connection, using 'GET' method. @@ -10,8 +10,8 @@ Initiates a HTTP connection, using 'GET' method. head(*url, identifier, flags, *add_header); *url = pointer to ASCIIZ URL - identifier = identified of previously opened connection, or 0 to open a new one - flags = bit flags (see http.inc user flags and the end of this document) + identifier = identifier of previously opened connection (keep-alive), or 0 to open a new one. + flags = bit flags (see end of this document). *add_header = pointer to ASCIIZ additional header parameters, or null for none. Every additional parameter must end with CR LF bytes, including the last line. Initiate a HTTP connection, using 'HEAD' method. @@ -19,8 +19,8 @@ Initiate a HTTP connection, using 'HEAD' method. post(*url, identifier, flags, *add_header, *content-type, content-length); *url = pointer to ASCIIZ URL - identifier = identified of previously opened connection, or 0 to open a new one - flags = bit flags (see http.inc user flags and the end of this document) + identifier = identifier of previously opened connection (keep-alive), or 0 to open a new one. + flags = bit flags (see end of this document). *add_header = pointer to ASCIIZ additional header parameters, or null for none. Every additional parameter must end with CR LF bytes, including the last line. *content-type = pointer to ASCIIZ string containing content type. @@ -59,6 +59,8 @@ This procedure can be used to send data to the server (POST) User flags: +For the flag codes themselves, see http.inc file. + FLAG_KEEPALIVE will keep the connection open after first GET/POST/.. so you can send a second request on the same TCP session. In this case, the session must be closed manually when done by using the exported disconnect() function.