Popular Post Ward Posted June 4, 2015 Popular Post Posted June 4, 2015 (edited) I built my own libcurl for AutoIt based on BinaryCall UDF.libcurl - the multiprotocol file transfer libraryThe Features:Pure AutoIt script, no DLLs needed.Build with SSL/TLS and zlib support (without libidn, libiconv, libssh2).Full easy-interface and partial multi-interface support.Data can read from or write to autoit variables or files.Smaller code size (compare to most libcurl DLL).The version information of this build:Curl Version: libcurl/7.42.1SSL Version: mbedTLS/1.3.10Libz Version: 1.2.8Protocols: ftp,ftps,http,httpsHere are the helper functions (not include in libcurl library). Curl_DataWriteCallback()Curl_DataReadCallback()Curl_FileWriteCallback()Curl_FileReadCallback()Curl_Data_Put()Curl_Data_Get()Curl_Data_Cleanup()See the example script for detail usage.expandcollapse popup#Include "Curl.au3" Example_Easy_1() Func Example_Easy_1() ; How to get html or header data? ; 1. Set $CURLOPT_WRITEFUNCTION and $CURLOPT_HEADERFUNCTION to Curl_DataWriteCallback() ; 2. Set $CURLOPT_WRITEDATA or $CURLOPT_HEADERDATA to any number as identify ; 3. Use Curl_Data_Get() to read the returned data in binary format ; 4. Use Curl_Data_Cleanup() to remove the data ConsoleWrite("Example Easy 1" & @LF) Local $Curl = Curl_Easy_Init() If Not $Curl Then Return Local $Html = $Curl ; any number as identify Local $Header = $Curl + 1 ; any number as identify Curl_Easy_Setopt($Curl, $CURLOPT_URL, "https://www.google.com") Curl_Easy_Setopt($Curl, $CURLOPT_USERAGENT, "AutoIt/Curl") Curl_Easy_Setopt($Curl, $CURLOPT_FOLLOWLOCATION, 1) Curl_Easy_Setopt($Curl, $CURLOPT_ACCEPT_ENCODING, "gzip") ; or set "" use all built-in supported encodings Curl_Easy_Setopt($Curl, $CURLOPT_WRITEFUNCTION, Curl_DataWriteCallback()) Curl_Easy_Setopt($Curl, $CURLOPT_WRITEDATA, $Html) Curl_Easy_Setopt($Curl, $CURLOPT_HEADERFUNCTION, Curl_DataWriteCallback()) Curl_Easy_Setopt($Curl, $CURLOPT_HEADERDATA, $Header) Curl_Easy_Setopt($Curl, $CURLOPT_TIMEOUT, 30) Local $Code = Curl_Easy_Perform($Curl) If $Code = $CURLE_OK Then ConsoleWrite("Content Type: " & Curl_Easy_GetInfo($Curl, $CURLINFO_CONTENT_TYPE) & @LF) ConsoleWrite("Download Size: " & Curl_Easy_GetInfo($Curl, $CURLINFO_SIZE_DOWNLOAD) & @LF) MsgBox(0, 'Header', BinaryToString(Curl_Data_Get($Header))) MsgBox(0, 'Html', BinaryToString(Curl_Data_Get($Html))) Else ConsoleWrite(Curl_Easy_StrError($Code) & @LF) EndIf Curl_Easy_Cleanup($Curl) Curl_Data_Cleanup($Header) Curl_Data_Cleanup($Html) ConsoleWrite(@LF) EndFunc Curl.zip Edited November 23, 2015 by Ward conmed, coffeeturtle, JohnOne and 9 others 12 新版 _ArrayAdd 的白痴作者,不管是誰,去死一死好了。
trancexx Posted June 4, 2015 Posted June 4, 2015 You have typo in __Curl_lstrlenW - wrong function called.Excellent! Thanks for sharing. Ward 1 ♡♡♡ . eMyvnE
Ward Posted June 4, 2015 Author Posted June 4, 2015 You found a bug in one second.... excellent! 新版 _ArrayAdd 的白痴作者,不管是誰,去死一死好了。
wakillon Posted June 4, 2015 Posted June 4, 2015 (edited) When i try examples it return __MemoryModule_ModuleRecord and __MemoryModule_RuntimeLoader undefined function.Edit : I have replaced #Include "BinaryCall.au3" by #Include <BinaryCall.au3> and it works !Thanks Edited June 4, 2015 by wakillon AutoIt 3.3.18.0 X86 - SciTE 5.5.7 - WIN 11 24H2 X64 - Other Examples Scripts
Ward Posted June 4, 2015 Author Posted June 4, 2015 The last BinaryCall.au3 UDF can work with MemoryDll.au3. The related function will be called only if MemoryDll.au3 is included. It is checked inside BinaryCall.au3 by following line:Static $HasMemoryDll = IsFunc(Execute('__MemoryModule_RuntimeLoader'))For this Curl UDF. Both old and newer version of BinaryCall.au3 are worked. 新版 _ArrayAdd 的白痴作者,不管是誰,去死一死好了。
argumentum Posted June 4, 2015 Posted June 4, 2015 to have no complain from ScITE, I changed those lines with Execute If $HasMemoryDll Then Local $Module = Execute('__MemoryModule_ModuleRecord("get", Null, $DllName)') If $Module Then Local $MemoryGetProcAddress = Execute('__MemoryModule_RuntimeLoader("MemoryGetProcAddress")') If $MemoryGetProcAddress Then $Proc = DllCallAddress("ptr:cdecl", $MemoryGetProcAddress, "ptr", $Module, "str", $ProcName)[0] If Not $Proc Then Return SetError(2, _BinaryCall_LastError("MemoryGetProcAddress failed on " & $ProcName), False) EndIf EndIf Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
KotKot77 Posted August 11, 2015 Posted August 11, 2015 (edited) Can you give more details on how to use this awesome UDF to post a file, please.I added the following two lines but it doesn't works (I'm sure that the POSTFIELDS part is wrong) :Curl_Easy_Setopt($Curl, $CURLOPT_POST, 1)Curl_Easy_Setopt($Curl, $CURLOPT_POSTFIELDS, "file=@C:\Users\KotKot\Desktop\logo.jpg")Thanks for your help ... Edited August 11, 2015 by KotKot77
Mateusz Posted September 18, 2015 Posted September 18, 2015 Can someone write example with PUT request with json content?In linux I can send it via command:curl -X PUT -H "Content-Type: application/json" -d'{"id":"1751","title":"some title","attr1":"value1","attr2":"value2"}' https://hostname/service --insecureand it is working, but can't do the same on AutoIT.
wakillon Posted November 7, 2015 Posted November 7, 2015 (edited) Hi WardI'm a bit annoyed with the $CURLOPT_ACCEPT_ENCODING parameter.Here is an example for get first bytes (for identify file/html instead of using "Content Type" who is not always reliable)expandcollapse popup#Include 'Curl.au3' Global $Curl, $iBufferSize, $Multi, $Running, $MsgsInQueue, $Code, $CURLMsg $Curl = Curl_Easy_Init() If Not $Curl Then Exit $iBufferSize = 32 Curl_Easy_Setopt($Curl, $CURLOPT_URL, 'http://blogs.perl.org/users/kirk_kimmel/2012/08/q-when-not-to-use-regexp-a-html-parsing.html' ) Curl_Easy_Setopt ( $Curl, $CURLOPT_USERAGENT, 'AutoIt/Curl') Curl_Easy_Setopt ( $Curl, $CURLOPT_FOLLOWLOCATION, 1 ) ;~ An empty string creates an Accept-Encoding header containing all supported encodings. Curl_Easy_Setopt ( $Curl, $CURLOPT_ACCEPT_ENCODING, '' ) ; Possible values : '', 'identity', 'deflate' or 'gzip' Curl_Easy_Setopt ( $Curl, $CURLOPT_BUFFERSIZE, $iBufferSize ) Curl_Easy_Setopt ( $Curl, $CURLOPT_RANGE, '0-' & $iBufferSize -1 ) ; get the first n bytes. (Content-Range: bytes 0-31/nTotal ) Curl_Easy_Setopt ( $Curl, $CURLOPT_WRITEFUNCTION, Curl_DataWriteCallback() ) Curl_Easy_Setopt ( $Curl, $CURLOPT_WRITEDATA, $Curl) Curl_Easy_Setopt ( $Curl, $CURLOPT_HEADERFUNCTION, Curl_DataWriteCallback() ) Curl_Easy_Setopt ( $Curl, $CURLOPT_HEADERDATA, $Curl + 1 ) $Multi = Curl_Multi_Init() If Not $Multi Then Exit Curl_Multi_Add_Handle ( $Multi, $Curl ) Do Curl_Multi_Perform ( $Multi, $Running ) $CURLMsg = Curl_Multi_Info_Read ( $Multi, $MsgsInQueue ) If DllStructGetData ( $CURLMsg, 'msg' ) = $CURLMSG_DONE Then $Curl = DllStructGetData ( $CURLMsg, 'easy_handle' ) $Code = DllStructGetData ( $CURLMsg, 'data' ) If $Code = $CURLE_OK Then ConsoleWrite ( 'Content Type: ' & Curl_Easy_GetInfo ( $Curl, $CURLINFO_CONTENT_TYPE ) & @CRLF ) ConsoleWrite ( 'Download Size: ' & Curl_Easy_GetInfo ( $Curl, $CURLINFO_SIZE_DOWNLOAD ) & @CRLF ) ConsoleWrite ( '- Header : ' & BinaryToString ( Curl_Data_Get ( $Curl + 1 ) ) & @Crlf ) ConsoleWrite ( '+ Html String : ' & BinaryToString ( Curl_Data_Get ( $Curl ) ) & @Crlf ) ConsoleWrite ( @CRLF ) ConsoleWrite ( '> Html Binary : ' & Curl_Data_Get ( $Curl ) & @Crlf ) Else ConsoleWrite ( '! Curl_Easy_StrError : ' & Curl_Easy_StrError ( $Code ) & @CRLF ) EndIf Curl_Multi_Remove_Handle ( $Multi, $Curl ) Curl_Easy_Cleanup ( $Curl ) Curl_Data_Cleanup ( $Curl ) Curl_Data_Cleanup ( $Curl + 1 ) EndIf Sleep ( 10 ) Until $Running = 0 Curl_Multi_Cleanup ( $Multi ) ExitTheoretically an empty string creates an Accept-Encoding header containing all supported encodings.But in this case or if i use "gzip", script do not return any datas !If i use "deflate" or "identity" or I do not use at all the "CURLOPT_ACCEPT_ENCODING" option, script return well datas as expected.Is it a bug ?Do you have a suggestion about that ? Thanks. Edited November 7, 2015 by wakillon AutoIt 3.3.18.0 X86 - SciTE 5.5.7 - WIN 11 24H2 X64 - Other Examples Scripts
wakillon Posted November 7, 2015 Posted November 7, 2015 (edited) Well, I suppose that the problem is not from curl, but from the Buffer Size.With a Buffer Size set to 128 instead of 32, script returns datas.May be there is a minimal size to set to the buffer, but i do not find any infos on curl.haxx.se ... Edit : May be a clue at line 189 on Curl.h Edited November 7, 2015 by wakillon AutoIt 3.3.18.0 X86 - SciTE 5.5.7 - WIN 11 24H2 X64 - Other Examples Scripts
wakillon Posted January 8, 2016 Posted January 8, 2016 where can i get this udf here Curl.7z AutoIt 3.3.18.0 X86 - SciTE 5.5.7 - WIN 11 24H2 X64 - Other Examples Scripts
fairylovehn127 Posted January 8, 2016 Posted January 8, 2016 hereCurl.7zDo you have request.au3 example? I also need it
wakillon Posted January 8, 2016 Posted January 8, 2016 Do you have request.au3 example? I also need ityes Request UDF.7z AutoIt 3.3.18.0 X86 - SciTE 5.5.7 - WIN 11 24H2 X64 - Other Examples Scripts
gcriaco Posted January 12, 2016 Posted January 12, 2016 Any chance to support AutoIt X64? Thanks and best regardsPeppe
czyt Posted April 8, 2016 Posted April 8, 2016 On 2015/6/4 at 7:29 PM, Ward said: I built my own libcurl for AutoIt based on BinaryCall UDF.libcurl - the multiprotocol file transfer library The Features: Pure AutoIt script, no DLLs needed. Build with SSL/TLS and zlib support (without libidn, libiconv, libssh2). Full easy-interface and partial multi-interface support. Data can read from or write to autoit variables or files. Smaller code size (compare to most libcurl DLL). The version information of this build: Curl Version: libcurl/7.42.1 SSL Version: mbedTLS/1.3.10 Libz Version: 1.2.8 Protocols: ftp,ftps,http,https Here are the helper functions (not include in libcurl library). Curl_DataWriteCallback() Curl_DataReadCallback() Curl_FileWriteCallback() Curl_FileReadCallback() Curl_Data_Put() Curl_Data_Get() Curl_Data_Cleanup() See the example script for detail usage. Hidden Content Curl.zip 支持啦,原来也是来自中国的兄弟啊~~ thx,Brother from China~~ 董小姐,你微笑的时候很美,就像安河桥下,清澈的水...
Iczer Posted April 9, 2016 Posted April 9, 2016 (edited) I'm trying to make this UDF work under x64, but it seems just dll-repace not enough here Maybe someone can correctly correct __Curl_RuntimeLoader() to work under x64 (for some reason it make post blank if i use any tags, so i uploaded my version of Curl UDF) Curl - x64 & x86.au3 Edited January 12, 2017 by Iczer fail to post
Biatu Posted January 31, 2017 Posted January 31, 2017 Can't seem to get this working... Func Example_Post_1() Local $Curl = Curl_Easy_Init() If Not $Curl Then Return $bFile=FileRead("ReportData.7z") $tFile=DllStructCreate("byte["&BinaryLen($bFile)&"]") DllStructSetData($tFile,1,$bFile) $pFile=DllStructGetPtr($tFile) Local $HttpPost, $LastItem, $vHeader $vHeader=Curl_Slist_Append(0,"Content-Length: "&BinaryLen($bFile)) Curl_Easy_Setopt($Curl, $CURLOPT_URL, "http://infinitycommunicationsgateway.net/Pub/CxbxBugs/test2.php") Curl_Easy_Setopt($Curl, $CURLOPT_USERAGENT, "AutoIt/Curl") Curl_Easy_Setopt($Curl, $CURLOPT_ACCEPT_ENCODING, "") Curl_Easy_Setopt($Curl, $CURLOPT_WRITEFUNCTION, Curl_DataWriteCallback()) Curl_Easy_Setopt($Curl, $CURLOPT_WRITEDATA, $Curl) Curl_Easy_Setopt($Curl, $CURLOPT_VERBOSE,1) Curl_Easy_Setopt($Curl, $CURLOPT_POST, 1) Curl_Easy_Setopt($Curl, $CURLOPT_READFUNCTION, Curl_DataReadCallback()) Curl_Easy_Setopt($Curl, $CURLOPT_READDATA, $bFile) Curl_Easy_Setopt($Curl, $CURLOPT_INFILESIZE_LARGE,BinaryLen($bFile)) Curl_Easy_Setopt($Curl, $CURLOPT_FOLLOWLOCATION, 1) Local $Code = Curl_Easy_Perform($Curl) If $Code <> $CURLE_OK Then Return ConsoleWrite(Curl_Easy_StrError($Code) & @LF) Local $Data = BinaryToString(Curl_Data_Get($Curl)) Local $EffectiveUrl = Curl_Easy_GetInfo($Curl, $CURLINFO_EFFECTIVE_URL) Curl_Easy_Cleanup($Curl) Curl_Data_Cleanup($Curl) ConsoleWrite("Paste link: " & $EffectiveUrl & @LF) Local $Match = $Data If @Error Then Return ConsoleWrite("RAW Paste Data: " & $Match & @LF) ConsoleWrite(@LF) EndFunc What is what? What is what.
junkew Posted February 2, 2017 Posted February 2, 2017 nice to see sometimes suddenly a library passing by that you didn't know it existed. Whats the benefit of testing REST interfaces with this library over the WINHTTP library? FAQ 31 How to click some elements, FAQ 40 Test automation with AutoIt, Multithreading CLR .NET Powershell CMDLets
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now