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)
