Page 1 of 1
How to read content from a website using HTTPS protocol?
Posted: Fri Sep 21, 2007 1:04 pm
by Kukulkan
Hello,
I need to migrate a windows PureBasic application to linux. In this application I need to connect to a webserver using HTTPS (SSL connection).
In the current windows-version I'm using API-functions like InternetOpen_() and InternetOpenUrl_() to receive the results (code can be seen here in the german forum:
http://www.purebasic.fr/german/viewtopic.php?p=170727).
How can I transfer this to linux? All codes that I can find here in the forum are not able to do HTTPS connections (and proxy's). Is there a way using the linux-api or some classes of Gnome or SDL or something else? I'm not that linux expert...
Kukulkan
Posted: Wed Sep 26, 2007 8:58 am
by Progi1984
May be with
LibCurl
libcurl is a free and easy-to-use client-side URL transfer library, supporting FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS and FILE. libcurl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, Kerberos4), file transfer resume, http proxy tunneling and more!
libcurl is highly portable, it builds and works identically on numerous platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS and more...
libcurl is free, thread-safe, IPv6 compatible, feature rich, well supported, fast, thoroughly documented and is already used by many known, big and successful companies and numerous applications.
Posted: Thu Sep 27, 2007 6:56 am
by Kukulkan
Hi Progi1984,
This sounds very good to me. Thank you.
Is there any example, how to access this library using PureBasic/Linux? There seem to be no example available in the forum. On the LibCurl website there is no binding available. As I'm new to Linux, I would need some assistance...
Kukulkan
Posted: Thu Sep 27, 2007 7:53 am
by Progi1984
I just began to work on it... so for the moment, the result is not here !
Posted: Mon Oct 08, 2007 4:39 am
by lexvictory
here it is (includes some code for windows compilation)
some of it is progi's, others mine
Code: Select all
;declarations not completed, only ones that have been used in our project.
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
ImportC "/usr/lib/libcurl.so"
curl_escape() As "curl_escape"
curl_unescape() As "curl_unescape"
curl_free() As "curl_free"
curl_formadd() As "curl_formadd"
curl_formfree() As "curl_formfree"
curl_getdate() As "curl_getdate"
curl_getenv() As "curl_getenv"
curl_mvsnprintf() As "curl_mvsnprintf"
curl_msnprintf() As "curl_msnprintf"
curl_maprintf() As "curl_maprintf"
curl_mvaprintf() As "curl_mvaprintf"
curl_msprintf() As "curl_msprintf"
curl_mprintf() As "curl_mprintf"
curl_mfprintf() As "curl_mfprintf"
curl_mvsprintf() As "curl_mvsprintf"
curl_mvprintf() As "curl_mvprintf"
curl_mvfprintf() As "curl_mvfprintf"
curl_slist_append(*slist, string.p-utf8) As "curl_slist_append"
curl_slist_free_all(*slist) As "curl_slist_free_all"
curl_version() As "curl_version"
curl_version_info() As "curl_version_info"
curl_global_init(flags.l) As "curl_global_init"
curl_global_init_mem() As "curl_global_init_mem"
curl_global_cleanup() As "curl_global_cleanup"
curl_easy_init() As "curl_easy_init"
curl_easy_setopt(handle.l, option.l, parameter.l) As "curl_easy_setopt"
curl_easy_perform(handle.l) As "curl_easy_perform"
curl_easy_cleanup(handle.l) As "curl_easy_cleanup"
curl_easy_getinfo() As "curl_easy_getinfo"
curl_easy_duphandle() As "curl_easy_duphandle"
curl_easy_reset() As "curl_easy_reset"
curl_strequal() As "curl_strequal"
curl_strnequal() As "curl_strnequal"
curl_share_init() As "curl_share_init"
curl_share_setopt() As "curl_share_setopt"
curl_share_cleanup() As "curl_share_cleanup"
curl_multi_init() As "curl_multi_init"
curl_multi_add_handle() As "curl_multi_add_handle"
curl_multi_remove_handle() As "curl_multi_remove_handle"
curl_multi_fdset() As "curl_multi_fdset"
curl_multi_perform() As "curl_multi_perform"
curl_multi_cleanup() As "curl_multi_cleanup"
curl_multi_info_read() As "curl_multi_info_read"
curl_easy_strerror() As "curl_easy_strerror"
curl_multi_strerror() As "curl_multi_strerror"
curl_share_strerror() As "curl_share_strerror"
EndImport
CompilerEndIf
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
ImportC "libcurl_imp.lib"
curl_escape() As "_curl_escape"
curl_unescape() As "_curl_unescape"
curl_free() As "_curl_free"
curl_formadd() As "_curl_formadd"
curl_formfree() As "_curl_formfree"
curl_getdate() As "_curl_getdate"
curl_getenv() As "_curl_getenv"
curl_mvsnprintf() As "_curl_mvsnprintf"
curl_msnprintf() As "_curl_msnprintf"
curl_maprintf() As "_curl_maprintf"
curl_mvaprintf() As "_curl_mvaprintf"
curl_msprintf() As "_curl_msprintf"
curl_mprintf() As "_curl_mprintf"
curl_mfprintf() As "_curl_mfprintf"
curl_mvsprintf() As "_curl_mvsprintf"
curl_mvprintf() As "_curl_mvprintf"
curl_mvfprintf() As "_curl_mvfprintf"
curl_slist_append(*slist, string.p-utf8) As "_curl_slist_append"
curl_slist_free_all(*slist) As "_curl_slist_free_all"
curl_version() As "_curl_version"
curl_version_info() As "_curl_version_info"
curl_global_init(flags.l) As "_curl_global_init"
curl_global_init_mem() As "_curl_global_init_mem"
curl_global_cleanup() As "_curl_global_cleanup"
curl_easy_init() As "_curl_easy_init"
curl_easy_setopt(handle.l, option.l, parameter.l) As "_curl_easy_setopt"
curl_easy_perform(handle.l) As "_curl_easy_perform"
curl_easy_cleanup(handle.l) As "_curl_easy_cleanup"
curl_easy_getinfo() As "_curl_easy_getinfo"
curl_easy_duphandle() As "_curl_easy_duphandle"
curl_easy_reset() As "_curl_easy_reset"
curl_strequal() As "_curl_strequal"
curl_strnequal() As "_curl_strnequal"
curl_share_init() As "_curl_share_init"
curl_share_setopt() As "_curl_share_setopt"
curl_share_cleanup() As "_curl_share_cleanup"
curl_multi_init() As "_curl_multi_init"
curl_multi_add_handle() As "_curl_multi_add_handle"
curl_multi_remove_handle() As "_curl_multi_remove_handle"
curl_multi_fdset() As "_curl_multi_fdset"
curl_multi_perform() As "_curl_multi_perform"
curl_multi_cleanup() As "_curl_multi_cleanup"
curl_multi_info_read() As "_curl_multi_info_read"
curl_easy_strerror() As "_curl_easy_strerror"
curl_multi_strerror() As "_curl_multi_strerror"
curl_share_strerror() As "_curl_share_strerror"
EndImport
CompilerEndIf
;- curl.inc.in
#CURL_IPRESOLVE_WHATEVER = 0 ; Default resolves addresses To all IP versions that your system allows
#CURL_IPRESOLVE_V4 = 1 ; resolve To ipv4 addresses
#CURL_IPRESOLVE_V6 = 2 ; resolve To ipv6 addresses
; three convenient "aliases" that follow the name scheme better
;#CURLOPT_WRITEDATA = #CURLOPT_FILE
;#CURLOPT_READDATA = #CURLOPT_INFILE
;#CURLOPT_HEADERDATA = #CURLOPT_WRITEHEADER
#CURLOPT_HTTPREQUEST = -1
;#CURLOPT_FTPASCII = #CURLOPT_TRANSFERTEXT
#CURLOPT_MUTE = -2
#CURLOPT_PASSWDFUNCTION = -3
#CURLOPT_PASSWDDATA = -4
#CURLOPT_CLOSEFUNCTION = -5
#CURLOPTTYPE_FUNCTIONPOINT = 20000
#CURLOPTTYPE_OBJECTPOINT = 10000
#CURLOPT_WRITEFUNCTION = #CURLOPTTYPE_FUNCTIONPOINT + 11
#CURLOPT_POSTFIELDS = #CURLOPTTYPE_OBJECTPOINT + 15
#CURLOPT_POST = 47
#CURLOPT_POSTFIELDSIZE = 60
#CURLOPT_HTTPHEADER = #CURLOPTTYPE_OBJECTPOINT + 23
#CURLOPT_SOURCE_HOST = -6
#CURLOPT_SOURCE_PATH = -7
#CURLOPT_SOURCE_PORT = -8
#CURLOPT_PASV_HOST = -9
Enumeration 0
#CURLE_OK
#CURLE_UNSUPPORTED_PROTOCOL ; 1
#CURLE_FAILED_INIT ; 2
#CURLE_URL_MALFORMAT ; 3
#CURLE_URL_MALFORMAT_USER ; 4 (Not USED)
#CURLE_COULDNT_RESOLVE_PROXY ; 5
#CURLE_COULDNT_RESOLVE_HOST ; 6
#CURLE_COULDNT_CONNECT ; 7
#CURLE_FTP_WEIRD_SERVER_REPLY ; 8
#CURLE_FTP_ACCESS_DENIED ; 9 a service was denied by the FTP server due To lack of access - when login fails this is Not returned.
#CURLE_FTP_USER_PASSWORD_INCORRECT ; 10
#CURLE_FTP_WEIRD_PASS_REPLY ; 11
#CURLE_FTP_WEIRD_USER_REPLY ; 12
#CURLE_FTP_WEIRD_PASV_REPLY ; 13
#CURLE_FTP_WEIRD_227_FORMAT ; 14
#CURLE_FTP_CANT_GET_HOST ; 15
#CURLE_FTP_CANT_RECONNECT ; 16
#CURLE_FTP_COULDNT_SET_BINARY ; 17
#CURLE_PARTIAL_FILE ; 18
#CURLE_FTP_COULDNT_RETR_FILE ; 19
#CURLE_FTP_WRITE_ERROR ; 20
#CURLE_FTP_QUOTE_ERROR ; 21
#CURLE_HTTP_RETURNED_ERROR ; 22
#CURLE_WRITE_ERROR ; 23
#CURLE_MALFORMAT_USER ; 24 - Not USED
#CURLE_FTP_COULDNT_STOR_FILE ; 25 - failed FTP upload
#CURLE_READ_ERROR ; 26 - could open/Read from file
#CURLE_OUT_OF_MEMORY ; 27
#CURLE_OPERATION_TIMEOUTED ; 28 - the timeout time was reached
#CURLE_FTP_COULDNT_SET_ASCII ; 29 - TYPE A failed
#CURLE_FTP_PORT_FAILED ; 30 - FTP PORT operation failed
#CURLE_FTP_COULDNT_USE_REST ; 31 - the REST command failed
#CURLE_FTP_COULDNT_GET_SIZE ; 32 - the SIZE command failed
#CURLE_HTTP_RANGE_ERROR ; 33 - RANGE "command" didn't work
#CURLE_HTTP_POST_ERROR ; 34
#CURLE_SSL_CONNECT_ERROR ; 35 - wrong when connecting With SSL
#CURLE_BAD_DOWNLOAD_RESUME ; 36 - couldn't resume download
#CURLE_FILE_COULDNT_READ_FILE ; 37
#CURLE_LDAP_CANNOT_BIND ; 38
#CURLE_LDAP_SEARCH_FAILED ; 39
#CURLE_LIBRARY_NOT_FOUND ; 40
#CURLE_FUNCTION_NOT_FOUND ; 41
#CURLE_ABORTED_BY_CALLBACK ; 42
#CURLE_BAD_FUNCTION_ARGUMENT ; 43
#CURLE_BAD_CALLING_ORDER ; 44 - Not USED
#CURLE_INTERFACE_FAILED ; 45 - CURLOPT_INTERFACE failed
#CURLE_BAD_PASSWORD_ENTERED ; 46 - Not USED
#CURLE_TOO_MANY_REDIRECTS ; 47 - catch endless re-direct loops
#CURLE_UNKNOWN_TELNET_OPTION ; 48 - User specified an unknown option
#CURLE_TELNET_OPTION_SYNTAX ; 49 - Malformed telnet option
#CURLE_OBSOLETE ; 50 - Not USED
#CURLE_SSL_PEER_CERTIFICATE ; 51 - peer's certificate wasn't ok
#CURLE_GOT_NOTHING ; 52 - when this is a specific error
#CURLE_SSL_ENGINE_NOTFOUND ; 53 - SSL crypto engine Not found
#CURLE_SSL_ENGINE_SETFAILED ; 54 - can Not set SSL crypto engine As Default
#CURLE_SEND_ERROR ; 55 - failed sending network Data
#CURLE_RECV_ERROR ; 56 - failure in receiving network Data
#CURLE_SHARE_IN_USE ; 57 - share is in use
#CURLE_SSL_CERTPROBLEM ; 58 - problem With the local certificate
#CURLE_SSL_CIPHER ; 59 - couldn't use specified cipher
#CURLE_SSL_CACERT ; 60 - problem With the CA cert (path?)
#CURLE_BAD_CONTENT_ENCODING ; 61 - Unrecognized transfer encoding
#CURLE_LDAP_INVALID_URL ; 62 - Invalid LDAP URL
#CURLE_FILESIZE_EXCEEDED ; 63 - Maximum file size exceeded
#CURLE_FTP_SSL_FAILED ; 64 - Requested FTP SSL level failed
#CURLE_SEND_FAIL_REWIND ; 65 - Sending the Data requires a rewind that failed
#CURLE_SSL_ENGINE_INITFAILED ; 66 - failed To initialise ENGINE
#CURLE_LOGIN_DENIED ; 67 - user password Or similar was Not accepted And we failed To login
#CURLE_TFTP_NOTFOUND ; 68 - file Not found on server
#CURLE_TFTP_PERM ; 69 - permission problem on server
#CURLE_TFTP_DISKFULL ; 70 - out of disk space on server
#CURLE_TFTP_ILLEGAL ; 71 - Illegal TFTP operation
#CURLE_TFTP_UNKNOWNID ; 72 - Unknown transfer ID
#CURLE_TFTP_EXISTS ; 73 - File already exists
#CURLE_TFTP_NOSUCHUSER ; 74 - No such user
#CURL_LAST ; never use!
EndEnumeration
#CURLOPT_SSL_VERIFYPEER = 00064
#CURLOPT_SSL_VERIFYHOST = 00081
#CURLOPT_URL = 10002
;example of write function
Global ReceivedData.s
ProcedureCDLL HTTPS_WriteFunction(*ptr, Size, NMemB, *Stream)
Protected SizeProper.l
Protected NMemBProper.l
Protected MyDataS.s
SizeProper = Size & 255
NMemBProper = NMemB
MyDataS = PeekS(*ptr, SizeProper * NMemBProper)
; mydata
ReceivedData + MyDataS
ProcedureReturn SizeProper * NMemBProper
EndProcedure
Posted: Mon Oct 08, 2007 11:21 am
by Kukulkan
Hi lexvictory, progi,
I currently are not able to test this, but this will work using Linux and Windows, too? This would be fantastic!!!!
Thank you very much!!! I will report, after testing...
Kukulkan
Posted: Mon Oct 08, 2007 11:27 am
by lexvictory
yes, it works with windows too, u just need the libcurl_imp.lib file mentioned. (and of course the dll's needed)
the code also works in unicode mode, just the functions that take a pointer need to have the string converted to ASCII/UTF-8 (allocatememory, pokes, etc)
if u cant find the libcurl_imp.lib file, i can send it to you