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 312. 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.