📄 gethttps.cpp
字号:
/* * 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 thisOSErr 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();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -