in xsec/tools/xklient/xklient.cpp [4087:4451]
int doRequest(int argc, char ** argv, int paramCount) {
XSECProvider prov;
DOMDocument * doc;
XKMSMessageAbstractType *msg = NULL;
XSECSOAPRequestorSimple::envelopeType et = XSECSOAPRequestorSimple::ENVELOPE_SOAP11;
bool twoPhase = false;
bool parmsDone = false;
char * nonce = NULL;
char * originalRequestId = NULL;
if (paramCount >= argc ||
(_stricmp(argv[paramCount], "--help") == 0) ||
(_stricmp(argv[paramCount], "-h") == 0)) {
printDoRequestUsage();
return -1;
}
while (!parmsDone) {
if ((_stricmp(argv[paramCount], "--two-phase") == 0) ||
(_stricmp(argv[paramCount], "-t") == 0)) {
twoPhase = true;
paramCount++;
}
else if ((_stricmp(argv[paramCount], "--nonce") == 0) ||
(_stricmp(argv[paramCount], "-n") == 0)) {
paramCount++;
if (paramCount == argc) {
printDoRequestUsage();
return -1;
}
nonce=argv[paramCount++];
}
else if ((_stricmp(argv[paramCount], "--original-requestid") == 0) ||
(_stricmp(argv[paramCount], "-o") == 0)) {
paramCount++;
if (paramCount == argc) {
printDoRequestUsage();
return -1;
}
originalRequestId=argv[paramCount++];
}
else if ((_stricmp(argv[paramCount], "--envelope") == 0) ||
(_stricmp(argv[paramCount], "-e") == 0)) {
// Set the wrapper envelope type
paramCount++;
if (paramCount == argc) {
printDoRequestUsage();
return -1;
}
if (_stricmp(argv[paramCount], "NONE") == 0) {
et = XSECSOAPRequestorSimple::ENVELOPE_NONE;
}
else if (_stricmp(argv[paramCount], "SOAP11") == 0) {
et = XSECSOAPRequestorSimple::ENVELOPE_SOAP11;
}
else if (_stricmp(argv[paramCount], "SOAP12") == 0) {
et = XSECSOAPRequestorSimple::ENVELOPE_SOAP12;
}
else {
printDoRequestUsage();
return -1;
}
paramCount++;
}
else if ((_stricmp(argv[paramCount], "LocateRequest") == 0) ||
(_stricmp(argv[paramCount], "lr") == 0)) {
paramCount++;
XKMSLocateRequest * r =
(XKMSLocateRequest *) (createLocateRequest(prov, &doc, argc, argv, paramCount));
if (r == NULL) {
return -1;
}
if (twoPhase)
r->appendResponseMechanismItem(XKMSConstants::s_tagRepresent);
msg = r;
parmsDone = true;
}
else if ((_stricmp(argv[paramCount], "ValidateRequest") == 0) ||
(_stricmp(argv[paramCount], "vr") == 0)) {
paramCount++;
XKMSValidateRequest * r =
(XKMSValidateRequest *) (createValidateRequest(prov, &doc, argc, argv, paramCount));
if (r == NULL) {
return -1;
}
if (twoPhase)
r->appendResponseMechanismItem(XKMSConstants::s_tagRepresent);
msg = r;
parmsDone = true;
}
else if ((_stricmp(argv[paramCount], "RegisterRequest") == 0) ||
(_stricmp(argv[paramCount], "rr") == 0)) {
paramCount++;
XKMSRegisterRequest * r =
(XKMSRegisterRequest *) (createRegisterRequest(prov, &doc, argc, argv, paramCount));
if (r == NULL) {
return -1;
}
if (twoPhase)
r->appendResponseMechanismItem(XKMSConstants::s_tagRepresent);
msg = r;
parmsDone = true;
}
else if ((_stricmp(argv[paramCount], "RevokeRequest") == 0) ||
(_stricmp(argv[paramCount], "er") == 0)) {
paramCount++;
XKMSRevokeRequest * r =
(XKMSRevokeRequest *) (createRevokeRequest(prov, &doc, argc, argv, paramCount));
if (r == NULL) {
return -1;
}
if (twoPhase)
r->appendResponseMechanismItem(XKMSConstants::s_tagRepresent);
msg = r;
parmsDone = true;
}
else if ((_stricmp(argv[paramCount], "RecoverRequest") == 0) ||
(_stricmp(argv[paramCount], "or") == 0)) {
paramCount++;
XKMSRecoverRequest * r =
(XKMSRecoverRequest *) (createRecoverRequest(prov, &doc, argc, argv, paramCount));
if (r == NULL) {
return -1;
}
if (twoPhase)
r->appendResponseMechanismItem(XKMSConstants::s_tagRepresent);
msg = r;
parmsDone = true;
}
else if ((_stricmp(argv[paramCount], "ReissueRequest") == 0) ||
(_stricmp(argv[paramCount], "ir") == 0)) {
paramCount++;
XKMSReissueRequest * r =
(XKMSReissueRequest *) (createReissueRequest(prov, &doc, argc, argv, paramCount));
if (r == NULL) {
return -1;
}
if (twoPhase)
r->appendResponseMechanismItem(XKMSConstants::s_tagRepresent);
msg = r;
parmsDone = true;
}
else if ((_stricmp(argv[paramCount], "PendingRequest") == 0) ||
(_stricmp(argv[paramCount], "pr") == 0)) {
paramCount++;
XKMSPendingRequest * r =
(XKMSPendingRequest *) (createPendingRequest(prov, &doc, argc, argv, paramCount));
if (r == NULL) {
return -1;
}
if (twoPhase)
r->appendResponseMechanismItem(XKMSConstants::s_tagRepresent);
msg = r;
parmsDone = true;
}
else if ((_stricmp(argv[paramCount], "StatusRequest") == 0) ||
(_stricmp(argv[paramCount], "sr") == 0)) {
paramCount++;
XKMSStatusRequest * r =
(XKMSStatusRequest *) (createStatusRequest(prov, &doc, argc, argv, paramCount));
if (r == NULL) {
return -1;
}
if (twoPhase)
r->appendResponseMechanismItem(XKMSConstants::s_tagRepresent);
msg = r;
parmsDone = true;
}
else if ((_stricmp(argv[paramCount], "CompoundRequest") == 0) ||
(_stricmp(argv[paramCount], "cr") == 0)) {
XKMSCompoundRequest * r =
(XKMSCompoundRequest *) (createCompoundRequest(prov, &doc, argc, argv, paramCount + 1));
if (r == NULL) {
return -1;
}
if (twoPhase)
r->appendResponseMechanismItem(XKMSConstants::s_tagRepresent);
msg = r;
parmsDone = true;
}
else {
printDoRequestUsage();
return -1;
}
}
XKMSMessageFactory * f = prov.getXKMSMessageFactory();
XKMSRequestAbstractType * request = f->toRequestAbstractType(msg);
if (nonce != NULL)
request->setNonce(MAKE_UNICODE_STRING(nonce));
if (originalRequestId != NULL)
request->setOriginalRequestId(MAKE_UNICODE_STRING(originalRequestId));
try {
if (g_txtOut) {
outputDoc(doc);
}
}
catch (...) {
delete msg;
doc->release();
throw;
}
DOMDocument * responseDoc;
try {
XSECSOAPRequestorSimple req(msg->getService());
#if !defined(_WIN32)
struct timeval tv1, tv2;
gettimeofday(&tv1, NULL);
#endif
req.setEnvelopeType(et);
responseDoc = req.doRequest(doc);
#if !defined(_WIN32)
gettimeofday(&tv2, NULL);
long seconds = tv2.tv_sec - tv1.tv_sec;
long useconds;
if (seconds != 0) {
useconds = 1000000 - tv1.tv_usec + tv2.tv_usec;
seconds--;
}
else {
useconds = tv2.tv_usec - tv1.tv_usec;
}
if (useconds >= 1000000) {
useconds -= 1000000;
seconds++;
}
cout << "Time taken for request = " << seconds << " seconds, " << useconds << " useconds" << endl;
#endif
/* If two-phase - re-do the request */
if (twoPhase) {
XKMSResultType * r = f->toResultType(f->newMessageFromDOM(responseDoc->getDocumentElement()));
if (r->getResultMajor() == XKMSResultType::Represent) {
cerr << "Intermediate response of a two phase sequence received\n\n";
if (g_txtOut) {
outputDoc(responseDoc);
}
doParsedMsgDump(responseDoc);
//XKMSRequestAbstractType * request = f->toRequestAbstractType(msg);
for (int k = 0; k < request->getResponseMechanismSize(); ++k) {
if (strEquals(request->getResponseMechanismItemStr(k),
XKMSConstants::s_tagRepresent)) {
request->removeResponseMechanismItem(k);
break;
}
}
request->setNonce(r->getNonce());
request->setOriginalRequestId(request->getId());
XMLCh * myId = generateId();
request->setId(myId);
XSEC_RELEASE_XMLCH(myId);
responseDoc->release();
responseDoc = req.doRequest(doc);
}
delete r;
}
}
catch (const XSECException &e) {
char * m = XMLString::transcode(e.getMsg());
cerr << "Error sending request: " << m << endl;
XSEC_RELEASE_XMLCH(m);
delete msg;
doc->release();
return -1;
}
catch (...) {
delete msg;
doc->release();
throw;
}
// Cleanup request stuff
delete msg;
doc->release();
// Now lets process the result
int ret;
try {
if (g_txtOut) {
outputDoc(responseDoc);
}
ret = doParsedMsgDump(responseDoc);
}
catch (...) {
responseDoc->release();
throw;
}
responseDoc->release();
return ret;
}