deps/openssl/openssl/MacOS/GetHTTPS.src/GetHTTPS.cpp

Summary

Maintainability
Test Coverage
/*
 *    An demo illustrating how to retrieve a URI from a secure HTTP server.
 *
 *    Author:     Roy Wood
 *    Date:        September 7, 1999
 *    Comments:    This relies heavily on my MacSockets library.
 *                This project is also set up so that it expects the OpenSSL source folder (0.9.4 as I write this)
 *                to live in a folder called "OpenSSL-0.9.4" in this project's parent folder.  For example:
 *
 *                    Macintosh HD:
 *                        Development:
 *                            OpenSSL-0.9.4:
 *                                (OpenSSL sources here)
 *                            OpenSSL Example:
 *                                (OpenSSL example junk here)
 *
 *
 *                Also-- before attempting to compile this, make sure the aliases in "OpenSSL-0.9.4:include:openssl" 
 *                are installed!  Use the AppleScript applet in the "openssl-0.9.4" folder to do this!
 */
/* modified to seed the PRNG */
/* modified to use CRandomizer for seeding */


//    Include some funky libs I've developed over time

#include "CPStringUtils.hpp"
#include "ErrorHandling.hpp"
#include "MacSocket.h"
#include "Randomizer.h"

//    We use the OpenSSL implementation of SSL....
//    This was a lot of work to finally get going, though you wouldn't know it by the results!

#include <openssl/ssl.h>
#include <openssl/err.h>

#include <timer.h>

//    Let's try grabbing some data from here:

#define kHTTPS_DNS        "www.apache-ssl.org"
#define kHTTPS_Port        443
#define kHTTPS_URI        "/"


//    Forward-declare this

OSErr MyMacSocket_IdleWaitCallback(void *inUserRefPtr);

//    My idle-wait callback.  Doesn't do much, does it?  Silly cooperative multitasking.

OSErr MyMacSocket_IdleWaitCallback(void *inUserRefPtr)
{
#pragma unused(inUserRefPtr)

EventRecord        theEvent;
    ::EventAvail(everyEvent,&theEvent);
    
    CRandomizer *randomizer = (CRandomizer*)inUserRefPtr;
    if (randomizer)
        randomizer->PeriodicAction();

    return(noErr);
}


//    Finally!

void main(void)
{
    OSErr                errCode;
    int                    theSocket = -1;
    int                    theTimeout = 30;

    SSL_CTX                *ssl_ctx = nil;
    SSL                    *ssl = nil;

    char                tempString[256];
    UnsignedWide        microTickCount;


    CRandomizer randomizer;
    
    printf("OpenSSL Demo by Roy Wood, roy@centricsystems.ca\n\n");
    
    BailIfError(errCode = MacSocket_Startup());



    //    Create a socket-like object
    
    BailIfError(errCode = MacSocket_socket(&theSocket,false,theTimeout * 60,MyMacSocket_IdleWaitCallback,&randomizer));

    
    //    Set up the connect string and try to connect
    
    CopyCStrAndInsertCStrLongIntIntoCStr("%s:%ld",kHTTPS_DNS,kHTTPS_Port,tempString,sizeof(tempString));
    
    printf("Connecting to %s....\n",tempString);

    BailIfError(errCode = MacSocket_connect(theSocket,tempString));
    
    
    //    Init SSL stuff
    
    SSL_load_error_strings();
    
    SSLeay_add_ssl_algorithms();
    
    
    //    Pick the SSL method
    
//    ssl_ctx = SSL_CTX_new(SSLv2_client_method());
    ssl_ctx = SSL_CTX_new(SSLv23_client_method());
//    ssl_ctx = SSL_CTX_new(SSLv3_client_method());
            

    //    Create an SSL thingey and try to negotiate the connection
    
    ssl = SSL_new(ssl_ctx);
    
    SSL_set_fd(ssl,theSocket);
    
    errCode = SSL_connect(ssl);
    
    if (errCode < 0)
    {
        SetErrorMessageAndLongIntAndBail("OpenSSL: Can't initiate SSL connection, SSL_connect() = ",errCode);
    }
    
    //    Request the URI from the host
    
    CopyCStrToCStr("GET ",tempString,sizeof(tempString));
    ConcatCStrToCStr(kHTTPS_URI,tempString,sizeof(tempString));
    ConcatCStrToCStr(" HTTP/1.0\r\n\r\n",tempString,sizeof(tempString));

    
    errCode = SSL_write(ssl,tempString,CStrLength(tempString));
    
    if (errCode < 0)
    {
        SetErrorMessageAndLongIntAndBail("OpenSSL: Error writing data via ssl, SSL_write() = ",errCode);
    }
    

    for (;;)
    {
    char    tempString[256];
    int        bytesRead;
        

        //    Read some bytes and dump them to the console
        
        bytesRead = SSL_read(ssl,tempString,sizeof(tempString) - 1);
        
        if (bytesRead == 0 && MacSocket_RemoteEndIsClosing(theSocket))
        {
            break;
        }
        
        else if (bytesRead < 0)
        {
            SetErrorMessageAndLongIntAndBail("OpenSSL: Error reading data via ssl, SSL_read() = ",bytesRead);
        }
        
        
        tempString[bytesRead] = '\0';
        
        printf("%s", tempString);
    }
    
    printf("\n\n\n");
    
    //    All done!
    
    errCode = noErr;
    
    
EXITPOINT:

    //    Clean up and go home
    
    if (theSocket >= 0)
    {
        MacSocket_close(theSocket);
    }
    
    if (ssl != nil)
    {
        SSL_free(ssl);
    }
    
    if (ssl_ctx != nil)
    {
        SSL_CTX_free(ssl_ctx);
    }
    
    
    if (errCode != noErr)
    {
        printf("An error occurred:\n");
        
        printf("%s",GetErrorMessage());
    }
    
    
    MacSocket_Shutdown();
}