Jump to content

Curl UDF - AutoIt binary code version of libcurl with SSL support


Recommended Posts

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 !


Edited by wakillon

AutoIt X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Link to comment
Share on other sites

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 的白痴作者,不管是誰,去死一死好了


Link to comment
Share on other sites

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)


Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.

Link to comment
Share on other sites

  • 2 months later...

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 by KotKot77
Link to comment
Share on other sites

  • 1 month later...
  • 1 month later...

Hi Ward

I'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)

#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 )

    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 )
            ConsoleWrite ( '! Curl_Easy_StrError : ' & Curl_Easy_StrError ( $Code ) & @CRLF )
        Curl_Multi_Remove_Handle ( $Multi, $Curl )
        Curl_Easy_Cleanup ( $Curl )
        Curl_Data_Cleanup ( $Curl )
        Curl_Data_Cleanup ( $Curl + 1 )
    Sleep ( 10 )
Until $Running = 0
Curl_Multi_Cleanup ( $Multi )

Theoretically 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 ?



Edited by wakillon

AutoIt X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Link to comment
Share on other sites

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 by wakillon

AutoIt X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Link to comment
Share on other sites

  • 2 months later...
  • 2 months later...
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




thx,Brother from China~~


Link to comment
Share on other sites

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 by Iczer
fail to post
Link to comment
Share on other sites

  • 9 months later...

Can't seem to get this working...

Func Example_Post_1()
    Local $Curl = Curl_Easy_Init()
    If Not $Curl Then Return
    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)

    ConsoleWrite("Paste link: " & $EffectiveUrl & @LF)
    Local $Match = $Data
    If @Error Then Return
    ConsoleWrite("RAW Paste Data: " & $Match & @LF)


What is what? What is what.

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Create New...