From ea5f8f72aca3c488aacac32b198de4f4924d550b Mon Sep 17 00:00:00 2001 From: Antonino Perricone Date: Tue, 25 Oct 2022 05:07:01 +0200 Subject: [PATCH] 2022-05-03 08:45 UTC+0200 Antonino Perricone * contrib\hbcurl\hbcurl.ch * contrib\hbcurl\core.c + added HB_CURLOPT_MAXLIFETIME_CONN to setup max lifetime of connection see https://curl.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html for more information. 2022-05-02 08:38 UTC+0200 Antonino Perricone * contrib\hbcurl\core.c + added HB_CURLOPT_DEBUGBLOCK to setup a block for debug information It takes a callback in the form of {|type, msg| ... } see https://curl.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html for more information. * contrib\hbcurl\hbcurl.ch + added HB_CURLINFOTYPE_* macros for debug block --- ChangeLog.txt | 16 +++++++++++ contrib/hbcurl/core.c | 61 ++++++++++++++++++++++++++++++++++++++++ contrib/hbcurl/hbcurl.ch | 2 ++ 3 files changed, 79 insertions(+) diff --git a/ChangeLog.txt b/ChangeLog.txt index e8a7e7c768..c885b317d1 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -73,6 +73,22 @@ RETURN With above peace of code you can mix HBQT or other QT wrapper with GTQTC. +2022-05-03 08:45 UTC+0200 Antonino Perricone + * contrib\hbcurl\hbcurl.ch + * contrib\hbcurl\core.c + + added HB_CURLOPT_MAXLIFETIME_CONN to setup max lifetime of connection + see https://curl.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html for more + information. + +2022-05-02 08:38 UTC+0200 Antonino Perricone + * contrib\hbcurl\core.c + + added HB_CURLOPT_DEBUGBLOCK to setup a block for debug information + It takes a callback in the form of {|type, msg| ... } + see https://curl.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html for more + information. + * contrib\hbcurl\hbcurl.ch + + added HB_CURLINFOTYPE_* macros for debug block + 2021-04-28 20:02 UTC+0200 Aleksander Czajczynski (hb fki.pl) * include/hbgtinfo.ch ! fixed comment, Alt+Numpad HB_GTI_KBDALT workaround was disabled by diff --git a/contrib/hbcurl/core.c b/contrib/hbcurl/core.c index 1d55b43997..9d88721632 100644 --- a/contrib/hbcurl/core.c +++ b/contrib/hbcurl/core.c @@ -115,6 +115,7 @@ typedef struct _HB_CURL size_t dl_pos; PHB_ITEM pProgressCallback; + PHB_ITEM pDebugCallback; PHB_HASH_TABLE pHash; @@ -407,6 +408,27 @@ static int hb_curl_progress_callback( void * Cargo, double dltotal, double dlnow return 0; } +static int hb_curl_debug_callback(CURL *handle, curl_infotype type, char *data, size_t size, void *Cargo) +{ + HB_SYMBOL_UNUSED( handle ); + if( Cargo ) + { + PHB_CURL hb_curl = ( PHB_CURL ) Cargo; + if( hb_curl->pDebugCallback && hb_vmRequestReenter() ) + { + hb_vmPushEvalSym(); + hb_vmPush( hb_curl->pDebugCallback ); + hb_vmPushInteger( type ); + hb_vmPushStringPcode( data, size); + hb_vmSend( 2 ); + + hb_vmRequestRestore(); + } + } + + return 0; +} + /* Helpers */ /* ------- */ @@ -527,6 +549,12 @@ static void PHB_CURL_free( PHB_CURL hb_curl, HB_BOOL bFree ) hb_curl->pProgressCallback = NULL; } + if( hb_curl->pDebugCallback ) + { + hb_itemRelease( hb_curl->pDebugCallback ); + hb_curl->pDebugCallback = NULL; + } + if( hb_curl->pHash ) { hb_hashTableKill( hb_curl->pHash ); @@ -587,6 +615,9 @@ static HB_GARBAGE_FUNC( PHB_CURL_mark ) if( hb_curl->pProgressCallback ) hb_gcMark( hb_curl->pProgressCallback ); + + if( hb_curl->pDebugCallback ) + hb_gcMark( hb_curl->pDebugCallback ); } } @@ -1752,6 +1783,36 @@ HB_FUNC( CURL_EASY_SETOPT ) curl_easy_setopt( hb_curl->curl, CURLOPT_READFUNCTION, hb_curl_read_dummy_callback ); res = curl_easy_setopt( hb_curl->curl, CURLOPT_READDATA, hb_curl ); break; + + case HB_CURLOPT_DEBUGBLOCK: + { + PHB_ITEM pDebugCallback = hb_param( 3, HB_IT_BLOCK | HB_IT_SYMBOL ); + + if( hb_curl->pDebugCallback ) + { + curl_easy_setopt( hb_curl->curl, CURLOPT_DEBUGFUNCTION, NULL ); + curl_easy_setopt( hb_curl->curl, CURLOPT_DEBUGDATA, NULL ); + + hb_itemRelease( hb_curl->pDebugCallback ); + hb_curl->pDebugCallback = NULL; + } + + if( pDebugCallback ) + { + hb_curl->pDebugCallback = hb_itemNew( pDebugCallback ); + /* unlock the item so GC will not mark them as used */ + hb_gcUnlock( hb_curl->pDebugCallback ); + + curl_easy_setopt( hb_curl->curl, CURLOPT_DEBUGFUNCTION, hb_curl_debug_callback ); + res = curl_easy_setopt( hb_curl->curl, CURLOPT_DEBUGDATA, hb_curl); + } + } + break; + + case HB_CURLOPT_MAXLIFETIME_CONN: + res = curl_easy_setopt( hb_curl->curl, CURLOPT_MAXLIFETIME_CONN, hb_parnl( 3 ) ); + break; + } } diff --git a/contrib/hbcurl/hbcurl.ch b/contrib/hbcurl/hbcurl.ch index c0f002daca..ec666d5e51 100644 --- a/contrib/hbcurl/hbcurl.ch +++ b/contrib/hbcurl/hbcurl.ch @@ -253,6 +253,7 @@ #define HB_CURLOPT_TCP_KEEPIDLE 205 #define HB_CURLOPT_TCP_KEEPINTVL 206 #define HB_CURLOPT_MAIL_AUTH 207 +#define HB_CURLOPT_MAXLIFETIME_CONN 208 #define HB_CURLOPT_DOWNLOAD 1001 /* Harbour special ones */ #define HB_CURLOPT_PROGRESSBLOCK 1002 #define HB_CURLOPT_UL_FILE_SETUP 1003 @@ -265,6 +266,7 @@ #define HB_CURLOPT_UL_NULL_SETUP 1010 #define HB_CURLOPT_UL_FHANDLE_SETUP 1011 #define HB_CURLOPT_DL_FHANDLE_SETUP 1012 +#define HB_CURLOPT_DEBUGBLOCK 1013 /* Compatibility ones. Please don't use these. */ #define HB_CURLOPT_SETUPLOADFILE HB_CURLOPT_UL_FILE_SETUP #define HB_CURLOPT_CLOSEUPLOADFILE HB_CURLOPT_UL_FILE_CLOSE