int HLR2::_exec(const char *url, const char *payload, unsigned short timeout, pugi::xml_document& doc, std::string& headers) { const short maxTry = 3; short retry = 0; if (!url || !*url) { LOG_ERROR("%s::%s: Invalid URL!", __class__, __func__); return -1; } while (maxTry >= ++retry) { short status = _hc.httpPost(url, payload, "text/xml", timeout); LOG_INFO("%s::%s: url: %s, payload: %s, timeout: %d, status: %d, headers: %s, body: %s", __class__, __func__, url, payload, timeout, status, _hc.getResponseHeaders(), _hc.getResponseBody()); if (200 != status && 307 != status) { return -1; } headers = _hc.getResponseHeaders(); std::string body = _hc.getResponseBody(); if (!doc.load(body.c_str())) { LOG_ERROR("%s::%s: Malformed XML response!: %s", __class__, __func__, body.c_str()); return -1; } pugi::xml_node result = doc.find_node(_isResult); int resultCode = atoi(result.child("ResultCode").child_value()); switch (resultCode) { case 0: case 3016: case 3810: //-- success, exit... return 0; case 5004: //-- invalid session, retry... LOG_INFO("%s::%s: Will retry: %d", __class__, __func__, retry); break; default: LOG_ERROR("%s::%s: ResultCode: %s, ResultDesc: %s", __class__, __func__, result.child("ResultCode").child_value(), result.child("ResultDesc").child_value()); return -1; } //-- wait for a while... sys_msleep(1000); } return -1; }