http_ssl64.pb
Code: Select all
EnableExplicit
XIncludeFile "ssl_mail64.pbi"
#SMTP_RESPONSE_TIMEOUT = 5000 ; m/s
;****************************************************************************************
; receive data from the server encrypted by ssl
;****************************************************************************************
Procedure.i sslRecvData(secureSession.i, *sslError, *returnData, *lenRtnData, buffSize.i)
Protected retValue.i
Protected totReturned = 0
Protected totalMS.i = 0
; get server response, wait as needed
Repeat
Delay(100)
totalMS = totalMS + 100
If totalMS > #SMTP_RESPONSE_TIMEOUT
Break
EndIf
retValue = CryptPopData(secureSession, *returnData, buffSize, @totReturned)
If retValue <> #CRYPT_OK
PokeS(*sslError, "CryptPopData ERROR: " + lookupError(retValue))
ProcedureReturn -999
Else
If totReturned > 0
PokeI(*lenRtnData, totReturned)
Break
EndIf
EndIf
ForEver
PrintN("Recd:")
If totReturned > 0
ConsoleColor(10,0)
PrintN(PeekS(*returnData, totReturned))
ConsoleColor(15,0)
EndIf
ProcedureReturn retValue
EndProcedure
;****************************************************************************************
; send data to the server encrypted by ssl
;****************************************************************************************
Procedure.i sslSendData(secureSession.i, *sslError, *sendText, lenSendText)
Protected retValue.i
Protected bytesSent.i
; used to copy data into an encrypted envelope
retValue = CryptPushData(secureSession, *sendText, lenSendText, @bytesSent)
If retValue <> #CRYPT_OK Or lenSendText <> bytesSent
PokeS(*sslError, "CryptPushData ERROR " + lookupError(retValue) + ", lenSend = " + Str(lenSendText) + ", bytesSent = " + Str(bytesSent))
ProcedureReturn -998
EndIf
; send data to server
retValue = CryptFlushData(secureSession); used to send data to remote machine
If retValue <> #CRYPT_OK
PokeS(*sslError, "CryptFlushData ERROR " + lookupError(retValue))
ProcedureReturn -997
EndIf
PrintN("Sent:")
ConsoleColor(14,0)
PrintN(PeekS(*sendText, lenSendText))
ConsoleColor(15,0)
ProcedureReturn retValue
EndProcedure
;****************************************************************************************
; connect, send the get request, then read data in from the secure server
;****************************************************************************************
Procedure.i getSecurePage(*serverName, lenServerName.i, serverPort.i, *getString, lengthGS, *rtnString, replySize, *rtnError)
Protected retValue.i
Protected sslSession.i
Protected bytesRecvd.i
; create the ssl session
retValue = CryptCreateSession(@sslSession, #CRYPT_UNUSED, #CRYPT_SESSION_SSL)
If retValue <> #CRYPT_OK
PokeS(*rtnError, lookupError(retValue))
ProcedureReturn retValue
EndIf
; add the server name
retValue = CryptSetAttributeString(sslSession, #CRYPT_SESSINFO_SERVER_NAME, *serverName, lenServerName)
If retValue <> #CRYPT_OK
PokeS(*rtnError, lookupError(retValue))
ProcedureReturn retValue
EndIf
; specify the Port, for https SSL, it's 443
retValue = CryptSetAttribute(sslSession, #CRYPT_SESSINFO_SERVER_PORT, serverPort)
If retValue <> #CRYPT_OK
PokeS(*rtnError, lookupError(retValue))
ProcedureReturn retValue
EndIf
; activate the ssl session
retValue = CryptSetAttribute(sslSession, #CRYPT_SESSINFO_ACTIVE, 1)
If retValue <> #CRYPT_OK
PokeS(*rtnError, lookupError(retValue))
ProcedureReturn retValue
EndIf
; send the GET string to server
retValue = sslSendData(sslSession, *rtnError, *getString, lengthGS)
If retValue <> #CRYPT_OK
PokeS(*rtnError, "sslSendData ERROR: " + lookupError(retValue))
ProcedureReturn retValue
EndIf
; receive response from GET command
retValue = sslRecvData(sslSession, *rtnError, *rtnString, @bytesRecvd, replySize)
If retValue <> #CRYPT_OK
PokeS(*rtnError, "sslRecvData ERROR: " + lookupError(retValue))
ProcedureReturn retValue
EndIf
; now end the ssl session
If sslSession
CryptDestroySession(sslSession)
EndIf
ProcedureReturn 0
EndProcedure
Define retValue.i
Define lengthGS.i
Define initValue.i
Define getString.s
Define errReturn.s = Space(255)
Define replySize.i = 32767
Define rtnString.s = Space(replySize)
Define serverName.s = "maps.googleapis.com"
Define serverPort.i = 443
Define lenServerName.i = Len(serverName)
getString = "GET /maps/api/geocode/xml?address=13921+US19+N,Clearwater,FL,33764&sensor=false HTTP/1.1" + #CRLF$
getString + "Accept: */*" + #CRLF$
getString + "Accept-Language: en-us" + #CRLF$
getString + "Host: maps.google.com" + #CRLF$
getString + "Connection: Keep-Alive" + #CRLF$ + #CRLF$
lengthGS = Len(getString)
OpenConsole()
ConsoleColor(15,0)
; Initialize the crypt Library
initValue = CryptInit()
If initValue <> #CRYPT_OK
errReturn = lookupError(initValue)
PrintN(errReturn)
EndIf
retValue = getSecurePage(@serverName, lenServerName, serverPort, @getString, lengthGS, @rtnString, replySize, @errReturn)
If retValue <> #CRYPT_OK
PrintN(errReturn)
Else
PrintN("connection successful!")
EndIf
CryptEnd() ; Close the Library
Input()
CloseConsole()
; IDE Options = PureBasic 4.61 (Windows - x64)
; ExecutableFormat = Console
; CursorPosition = 81
; FirstLine = 54
; Folding = -
; Executable = http_ssl64.exe
; CompileSourceDirectory
; Compiler = PureBasic 4.61 (Windows - x64)