Page 1 of 1
ReceiveHTTPToMemory() with Proxy support
Posted: Thu Jul 07, 2016 11:29 am
by infratec
Code: Select all
IncludeFile "libcurl.pbi" ; https://github.com/deseven/pbsamples/tree/master/crossplatform/libcurl
CompilerIf #PB_Compiler_IsMainFile
EnableExplicit
CompilerEndIf
Global *ReceiveHTTPToMemoryBuffer, ReceiveHTTPToMemoryBufferPtr.i
ProcedureC ReceiveHTTPWriteToMemoryFunction(*ptr, Size.i, NMemB.i, *Stream)
Protected SizeProper.i = Size & 255
Protected NMemBProper.i = NMemB
If *ReceiveHTTPToMemoryBuffer = 0
*ReceiveHTTPToMemoryBuffer = AllocateMemory(SizeProper * NMemBProper)
Else
*ReceiveHTTPToMemoryBuffer = ReAllocateMemory(*ReceiveHTTPToMemoryBuffer, MemorySize(*ReceiveHTTPToMemoryBuffer) + SizeProper * NMemBProper)
EndIf
CopyMemory(*ptr, *ReceiveHTTPToMemoryBuffer + ReceiveHTTPToMemoryBufferPtr, SizeProper * NMemBProper)
ReceiveHTTPToMemoryBufferPtr + SizeProper * NMemBProper
ProcedureReturn SizeProper * NMemBProper
EndProcedure
Procedure.i ReceiveHTTPToMemory(URL$, Proxy$="")
Protected *Buffer, curl.i, Timeout.i, res.i
If Len(URL$)
curl = curl_easy_init()
If curl
Timeout = 3
curl_easy_setopt(curl, #CURLOPT_URL, str2curl(URL$))
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYPEER, 0)
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYHOST, 0)
curl_easy_setopt(curl, #CURLOPT_HEADER, @"")
curl_easy_setopt(curl, #CURLOPT_TIMEOUT, Timeout)
If Len(Proxy$)
curl_easy_setopt(curl, #CURLOPT_PROXY, @proxy$)
EndIf
curl_easy_setopt(curl, #CURLOPT_WRITEFUNCTION, @ReceiveHTTPWriteToMemoryFunction())
res = curl_easy_perform(curl)
If res = #CURLE_OK
*Buffer = AllocateMemory(ReceiveHTTPToMemoryBufferPtr)
If *Buffer
CopyMemory(*ReceiveHTTPToMemoryBuffer, *Buffer, ReceiveHTTPToMemoryBufferPtr)
FreeMemory(*ReceiveHTTPToMemoryBuffer)
*ReceiveHTTPToMemoryBuffer = #Null
ReceiveHTTPToMemoryBufferPtr = 0
EndIf
EndIf
curl_easy_cleanup(curl)
EndIf
EndIf
ProcedureReturn *Buffer
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
Define *Buffer, Proxy$
InitNetwork()
Proxy$ = InputRequester("ProxyServer", "Do you use a ProxyServer? Then enter the full url:", "")
*Buffer = ReceiveHTTPToMemory("http://www.purebasic.fr/english/index.php", Proxy$)
If *Buffer
ShowMemoryViewer(*Buffer, MemorySize(*Buffer))
FreeMemory(*Buffer)
EndIf
CompilerEndIf
You have to enter the full url of the proxy:
Bernd
Re: ReceiveHTTPToMemory() with Proxy support
Posted: Mon Jul 11, 2016 10:44 am
by djes
Thank you for the code. I've tried to implement proxy user and password.
Code: Select all
IncludeFile "libcurl.pbi" ; https://github.com/deseven/pbsamples/tree/master/crossplatform/libcurl
CompilerIf #PB_Compiler_IsMainFile
EnableExplicit
CompilerEndIf
Global *ReceiveHTTPToMemoryBuffer, ReceiveHTTPToMemoryBufferPtr.i
ProcedureC ReceiveHTTPWriteToMemoryFunction(*ptr, Size.i, NMemB.i, *Stream)
Protected SizeProper.i = Size & 255
Protected NMemBProper.i = NMemB
If *ReceiveHTTPToMemoryBuffer = 0
*ReceiveHTTPToMemoryBuffer = AllocateMemory(SizeProper * NMemBProper)
If *ReceiveHTTPToMemoryBuffer = 0
Debug "Problem allocating memory"
End
EndIf
Else
*ReceiveHTTPToMemoryBuffer = ReAllocateMemory(*ReceiveHTTPToMemoryBuffer, MemorySize(*ReceiveHTTPToMemoryBuffer) + SizeProper * NMemBProper)
If *ReceiveHTTPToMemoryBuffer = 0
Debug "Problem reallocating memory"
End
EndIf
EndIf
CopyMemory(*ptr, *ReceiveHTTPToMemoryBuffer + ReceiveHTTPToMemoryBufferPtr, SizeProper * NMemBProper)
ReceiveHTTPToMemoryBufferPtr + SizeProper * NMemBProper
ProcedureReturn SizeProper * NMemBProper
EndProcedure
Procedure.i ReceiveHTTPToMemory(URL$, ProxyURL$="", ProxyPort$="", ProxyUser$="", ProxyPassword$="")
Protected *Buffer, curl.i, Timeout.i, res.i
If Len(URL$)
curl = curl_easy_init()
If curl
Timeout = 3
curl_easy_setopt(curl, #CURLOPT_URL, str2curl(URL$))
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYPEER, 0)
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYHOST, 0)
curl_easy_setopt(curl, #CURLOPT_HEADER, 0) ;No headers, please :)
curl_easy_setopt(curl, #CURLOPT_TIMEOUT, Timeout)
If Len(ProxyURL$)
;curl_easy_setopt(curl, #CURLOPT_HTTPPROXYTUNNEL, #True)
If Len(ProxyPort$)
ProxyURL$ + ":" + ProxyPort$
EndIf
;Debug ProxyURL$
curl_easy_setopt(curl, #CURLOPT_PROXY, str2curl(ProxyURL$))
If Len(ProxyUser$)
If Len(ProxyPassword$)
ProxyUser$ + ":" + ProxyPassword$
EndIf
;Debug ProxyUser$
curl_easy_setopt(curl, #CURLOPT_PROXYUSERPWD, str2curl(ProxyUser$))
EndIf
EndIf
curl_easy_setopt(curl, #CURLOPT_WRITEFUNCTION, @ReceiveHTTPWriteToMemoryFunction())
res = curl_easy_perform(curl)
If res = #CURLE_OK
*Buffer = AllocateMemory(ReceiveHTTPToMemoryBufferPtr)
If *Buffer
CopyMemory(*ReceiveHTTPToMemoryBuffer, *Buffer, ReceiveHTTPToMemoryBufferPtr)
FreeMemory(*ReceiveHTTPToMemoryBuffer)
*ReceiveHTTPToMemoryBuffer = #Null
ReceiveHTTPToMemoryBufferPtr = 0
Else
Debug "Problem allocating buffer"
EndIf
curl_easy_cleanup(curl)
Else
Debug "CURL NOT OK"
EndIf
Else
Debug "Can't Init CURL"
EndIf
EndIf
ProcedureReturn *Buffer
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
Define *Buffer, ProxyURL$, ProxyPort$, ProxyUser$, ProxyPass$
InitNetwork()
ProxyURL$ = InputRequester("ProxyServer", "Do you use a Proxy Server? Then enter the full url:", "")
ProxyPort$ = InputRequester("ProxyPort" , "Do you use a specific port? Then enter it", "")
ProxyUser$ = InputRequester("ProxyUser" , "Do you use a user name? Then enter it", "")
ProxyPass$ = InputRequester("ProxyPass" , "Do you use a password? Then enter it:", "")
*Buffer = ReceiveHTTPToMemory("http://www.purebasic.fr/english/index.php", ProxyURL$, ProxyPort$, ProxyUser$, ProxyPass$)
If *Buffer
ShowMemoryViewer(*Buffer, MemorySize(*Buffer))
FreeMemory(*Buffer)
Else
MessageRequester("Erreur", "Problem while loading", #PB_MessageRequester_Ok )
EndIf
CompilerEndIf
Edit: modified the line 54 to not get headers.
Re: ReceiveHTTPToMemory() with Proxy support
Posted: Mon Jul 11, 2016 1:41 pm
by Kwai chang caine
Thanks a lot at you two for your code.
But like always...that not works for me

I have a proxy with login and Password authentification, and it return "This method is not allowed" with the code of DJES anf nothing with the code of INFRATEC "*Buffer = 0"
and
result: 7
with the test code
Code: Select all
; https://raw.githubusercontent.com/deseven/pbsamples/master/crossplatform/libcurl/curl_example.pb
; working with static libcurl
InitNetwork()
IncludeFile "libcurl.pbi"
curl = curl_easy_init()
url.s = str2curl("http://deseven.info/test.php")
agent.s = str2curl("pbcurl/1.0")
cookie.s = str2curl("var=value;")
;post.s = str2curl("login=mylogin&password=mypassword")
header.s = str2curl("Cache-Control: no-cache")
If curl
curl_easy_setopt(curl,#CURLOPT_URL,@url)
curl_easy_setopt(curl,#CURLOPT_IPRESOLVE,#CURL_IPRESOLVE_V4)
curl_easy_setopt(curl,#CURLOPT_COOKIE,@cookie)
curl_easy_setopt(curl,#CURLOPT_POSTFIELDS,@post)
curl_easy_setopt(curl,#CURLOPT_USERAGENT,@agent)
curl_easy_setopt(curl,#CURLOPT_TIMEOUT,30)
*header = curl_slist_append(0,header)
curl_easy_setopt(curl,#CURLOPT_HTTPHEADER,*header)
curl_easy_setopt(curl,#CURLOPT_WRITEFUNCTION,@curlWriteData())
res = curl_easy_perform(curl)
resData.s = curlGetData()
curl_easy_getinfo(curl,#CURLINFO_RESPONSE_CODE,@resHTTP)
Debug "result: " + Str(res)
If Not res
Debug "HTTP code: " + Str(resHTTP)
Debug "HTTP data: " + #CRLF$ + resData
EndIf
curl_easy_cleanup(curl)
Else
Debug "can't init curl!"
EndIf
Re: ReceiveHTTPToMemory() with Proxy support
Posted: Mon Jul 11, 2016 3:21 pm
by djes
Try to uncomment the line 58 : curl_easy_setopt(curl, #CURLOPT_HTTPPROXYTUNNEL, #True)
Re: ReceiveHTTPToMemory() with Proxy support
Posted: Tue Jul 12, 2016 3:42 pm
by Kwai chang caine
Hello DJES
I have commented the line like you say and i have the result
CURL NOT OK
Else, if i enter manually my Login/Password, and after run your code that works
Apparently, my Login/Password is not sending correctly to the PROXY with your code

Re: ReceiveHTTPToMemory() with Proxy support
Posted: Thu Jul 14, 2016 10:15 pm
by infratec
Re: ReceiveHTTPToMemory() with Proxy support
Posted: Mon Jul 18, 2016 9:03 am
by djes
Infratec is right. There's several way of authenticating, all implemented by curl easily (it's way this lib is great). But you have to handle them yourself. Maybe you could do a little select box to choose and test each of them. For example, code for CURLAUTH_BASIC is
Code: Select all
curl_easy_setopt(curl, #CURLOPT_PROXYAUTH, #CURLAUTH_BASIC)
Re: ReceiveHTTPToMemory() with Proxy support
Posted: Tue Jul 19, 2016 8:33 am
by thyphoon
Hello ! Thanks to infratec for this great code !
I find a hook to replace orginal ReceiveHTTPMemory by your curl wrapper and the Djes ReceiveHTTPToMemory procedure to support Proxy
Know you just add this code with a include and use at the start
Code: Select all
libcurl::InitProxy(ProxyURL$ ,ProxyPort$,ProxyUser$,ProxyPass$)
to setup proxy
and after you can use normaly ReceiveHTTPMemory(URL$)
Code: Select all
DeclareModule libcurl
Declare InitProxy( ProxyURL.s,ProxyPort.s,ProxyUser.s,ProxyPass.s)
Declare.i ReceiveHTTPToMemory(URL$)
EndDeclareModule
Module libcurl
IncludeFile "libcurl.pbi" ; https://github.com/deseven/pbsamples/tree/master/crossplatform/libcurl
Structure http_curl_ext
ProxyURL.s
ProxyPort.s
ProxyUser.s
ProxyPass.s
EndStructure
Global http.http_curl_ext
Procedure InitProxy( ProxyURL.s,ProxyPort.s,ProxyUser.s,ProxyPass.s)
http\ProxyURL=ProxyURL
http\ProxyPort=ProxyPort
http\ProxyUser=ProxyUser
http\ProxyPass=ProxyPass
EndProcedure
Global *ReceiveHTTPToMemoryBuffer, ReceiveHTTPToMemoryBufferPtr.i
ProcedureC ReceiveHTTPWriteToMemoryFunction(*ptr, Size.i, NMemB.i, *Stream)
Protected SizeProper.i = Size & 255
Protected NMemBProper.i = NMemB
If *ReceiveHTTPToMemoryBuffer = 0
*ReceiveHTTPToMemoryBuffer = AllocateMemory(SizeProper * NMemBProper)
If *ReceiveHTTPToMemoryBuffer = 0
Debug "Problem allocating memory"
End
EndIf
Else
*ReceiveHTTPToMemoryBuffer = ReAllocateMemory(*ReceiveHTTPToMemoryBuffer, MemorySize(*ReceiveHTTPToMemoryBuffer) + SizeProper * NMemBProper)
If *ReceiveHTTPToMemoryBuffer = 0
Debug "Problem reallocating memory"
End
EndIf
EndIf
CopyMemory(*ptr, *ReceiveHTTPToMemoryBuffer + ReceiveHTTPToMemoryBufferPtr, SizeProper * NMemBProper)
ReceiveHTTPToMemoryBufferPtr + SizeProper * NMemBProper
ProcedureReturn SizeProper * NMemBProper
EndProcedure
Procedure.i ReceiveHTTPToMemory(URL$)
ProxyURL$=http\ProxyURL
ProxyPort$=http\ProxyPort
ProxyUser$=http\ProxyUser
ProxyPassword$=http\ProxyPass
Protected *Buffer, curl.i, Timeout.i, res.i
If Len(URL$)
curl = curl_easy_init()
If curl
Timeout = 3
curl_easy_setopt(curl, #CURLOPT_URL, str2curl(URL$))
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYPEER, 0)
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYHOST, 0)
curl_easy_setopt(curl, #CURLOPT_HEADER, 0) ;No headers, please :)
curl_easy_setopt(curl, #CURLOPT_TIMEOUT, Timeout)
If Len(ProxyURL$)
;curl_easy_setopt(curl, #CURLOPT_HTTPPROXYTUNNEL, #True)
If Len(ProxyPort$)
ProxyURL$ + ":" + ProxyPort$
EndIf
;Debug ProxyURL$
curl_easy_setopt(curl, #CURLOPT_PROXY, str2curl(ProxyURL$))
If Len(ProxyUser$)
If Len(ProxyPassword$)
ProxyUser$ + ":" + ProxyPassword$
EndIf
;Debug ProxyUser$
curl_easy_setopt(curl, #CURLOPT_PROXYUSERPWD, str2curl(ProxyUser$))
EndIf
EndIf
curl_easy_setopt(curl, #CURLOPT_WRITEFUNCTION, @ReceiveHTTPWriteToMemoryFunction())
res = curl_easy_perform(curl)
If res = #CURLE_OK
*Buffer = AllocateMemory(ReceiveHTTPToMemoryBufferPtr)
If *Buffer
CopyMemory(*ReceiveHTTPToMemoryBuffer, *Buffer, ReceiveHTTPToMemoryBufferPtr)
FreeMemory(*ReceiveHTTPToMemoryBuffer)
*ReceiveHTTPToMemoryBuffer = #Null
ReceiveHTTPToMemoryBufferPtr = 0
Else
Debug "Problem allocating buffer"
EndIf
curl_easy_cleanup(curl)
Else
Debug "CURL NOT OK"
EndIf
Else
Debug "Can't Init CURL"
EndIf
EndIf
ProcedureReturn *Buffer
EndProcedure
EndModule
;-HOOK to remplace original ReceiveHTTPMemory
Macro ReceiveHTTPMemory(URL)
libcurl::ReceiveHTTPToMemory(URL):MessageRequester("coucou","coucou")
EndMacro
CompilerIf #PB_Compiler_IsMainFile
InitNetwork()
ProxyURL$ = InputRequester("ProxyServer", "Do you use a Proxy Server? Then enter the full url:", "")
ProxyPort$ = InputRequester("ProxyPort" , "Do you use a specific port? Then enter it", "")
ProxyUser$ = InputRequester("ProxyUser" , "Do you use a user name? Then enter it", "")
ProxyPass$ = InputRequester("ProxyPass" , "Do you use a password? Then enter it:", "")
libcurl::InitProxy(ProxyURL$ ,ProxyPort$,ProxyUser$,ProxyPass$)
*Buffer = ReceiveHTTPMemory("http://www.purebasic.fr/english/index.php")
If *Buffer
ShowMemoryViewer(*Buffer, MemorySize(*Buffer))
FreeMemory(*Buffer)
Else
MessageRequester("Erreur", "Problem while loading", #PB_MessageRequester_Ok )
EndIf
CompilerEndIf
Re: ReceiveHTTPToMemory() with Proxy support
Posted: Tue Jun 20, 2017 9:20 pm
by novablue
How do i make this work with socks5 proxy?