Using RWHttpAgent to Retrieve a Document Securely
This example uses the HTTP agent class on https:// URIs. An agent class uses its respective client class to perform common protocol requests.
This example uses utility functions provided in util.h.
Example 10 – Using a Secure Agent
// File: examples\https\manual\RWHttpSecureAgentExample.cpp
 
#include <rw/itc/RWTIOUResult.h>
#include <rw/internet/RWURL.h>
#include <rw/network/RWWinSockInfo.h>
#include <rw/secsock/RWSecureSocketPackageInit.h>
#include <rw/secsock/RWSecureSocketContext.h>
#include <rw/http/RWHttpAgent.h>
#include <rw/http/RWHttpReply.h>
#include <rw/https/RWHttpsSecurityManager.h>
 
#include <iostream>
using std::cout;
using std::cerr;
using std::endl;
using std::flush;
 
#include "args.h"
 
// This data is used to seed the RNG
const unsigned char seed[] = "123456789012345678901234567890"
"123456789012345678901234567890"
"123456789012345678901234567890"
"123456789012345678901234567890"
"123456789012345678901234567890";
 
int main(int argc, char** argv)
{
RWWinSockInfo info; //1
RWSecureSocketPackageInit secsockInit; //2
 
RWSecureSocketPackageInit::seedRNGFromMemory(seed,sizeof(seed)) //3
 
RWTValSlist<RWCString> args = processArgs(argc, argv);
 
if (args.entries() < 1)
{
cout << “Usage: “ << argv[0] << “ <URL>” << endl;
return 1;
}
 
RWURL (url(args[0]); //4
 
RWSecureSocketContext context; //5
// context.prepareToAuthenticate("<certificate file>"); //6
 
RWHttpsSecurityManager::setAgentContext(context); //7
 
RWHttpAgent agent; //8
 
RWTIOUResult<RWHttpReply> replyIOU; //9
 
try {
replyIOU = agent.executeGet(url); //10
 
RWHttpReply reply = replyIOU.redeem(); //11
 
cout << reply.asString() << endl;
 
if(reply.is2XX()) {
cout << reply.getBody() << endl; //12
}
} catch(const RWxmsg& msg) {
cerr << "An unexpected exception occurred: "
<< msg.why() << endl;
return 1;
}
 
return 0;
}
 
//1 Initialize Windows Sockets (does nothing on UNIX).
//2 Initialize the Secure Sockets package.
//3 Seed the Random Number Generator in the Secure Sockets package. (Note: Seeding the random number generator from a const string is not secure and not recommended in production applications, but is sufficient for this example.)
//4 Create a RWSecureSocketContext instance.
//5 Initialize the context. This call instructs the context to prepare to authenticate the server we will connect to. The TRUSTED_CERTS_FILE is a text file that contains the root certificates of the certificate authorities we trust. (For simplicity, we do not perform authentication in this example.)
//6 Instruct the HTTPS package to use this context whenever we use an agent on an "https://" URI.
//7 Create an agent.
//8 Create the URL of the resource we want to get.
//9 Create an IOU to store the result.
//10 Instruct the agent to use the HTTP GET method on the URL supplied.
//11 Redeem the IOU to get the reply from the agent. This call may block until the agent fully acquires the result.
//12 If the GET request was successful, display the body of the document on the screen.