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;
}