Improved error handling.
This commit is contained in:
+2
-1
@@ -40,7 +40,8 @@ public:
|
|||||||
SERVICE_CERT_ERROR,
|
SERVICE_CERT_ERROR,
|
||||||
INVALID_SIGNATURE,
|
INVALID_SIGNATURE,
|
||||||
SSL_ERROR,
|
SSL_ERROR,
|
||||||
TIMEDOUT
|
TIMEDOUT,
|
||||||
|
OFFLINE
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit EetResult(QObject *parent = 0);
|
explicit EetResult(QObject *parent = 0);
|
||||||
|
|||||||
+82
-42
@@ -7,6 +7,7 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QXmlQuery>
|
#include <QXmlQuery>
|
||||||
#include <QXmlResultItems>
|
#include <QXmlResultItems>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
const QString EetSender::ms_nsDef = "declare namespace eet = \"http://fs.mfcr.cz/eet/schema/v3\";\n"
|
const QString EetSender::ms_nsDef = "declare namespace eet = \"http://fs.mfcr.cz/eet/schema/v3\";\n"
|
||||||
"declare namespace ds = \"http://www.w3.org/2000/09/xmldsig#\";\n"
|
"declare namespace ds = \"http://www.w3.org/2000/09/xmldsig#\";\n"
|
||||||
@@ -15,6 +16,8 @@ const QString EetSender::ms_nsDef = "declare namespace eet = \"http://fs.mfcr.cz
|
|||||||
"declare namespace senc = \"http://schemas.xmlsoap.org/soap/encoding/\";\n"
|
"declare namespace senc = \"http://schemas.xmlsoap.org/soap/encoding/\";\n"
|
||||||
"declare namespace senv = \"http://schemas.xmlsoap.org/soap/envelope/\";\n";
|
"declare namespace senv = \"http://schemas.xmlsoap.org/soap/envelope/\";\n";
|
||||||
|
|
||||||
|
bool EetSender::m_online = true;
|
||||||
|
|
||||||
EetSender::EetSender(QObject *parent) : QObject(parent)
|
EetSender::EetSender(QObject *parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
m_signer = nullptr;
|
m_signer = nullptr;
|
||||||
@@ -27,11 +30,14 @@ EetSender::EetSender(QObject *parent) : QObject(parent)
|
|||||||
connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
|
connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
|
||||||
connect(m_manager, &QNetworkAccessManager::sslErrors, [this](QNetworkReply *rep, QList<QSslError>){
|
connect(m_manager, &QNetworkAccessManager::sslErrors, [this](QNetworkReply *rep, QList<QSslError>){
|
||||||
m_resut->setStatus(EetResult::SSL_ERROR);
|
m_resut->setStatus(EetResult::SSL_ERROR);
|
||||||
emit sendFinished(m_resut);
|
emit sendFinished();
|
||||||
rep->deleteLater();
|
rep->deleteLater();
|
||||||
});
|
});
|
||||||
|
|
||||||
m_serviceUrl = PRODUCTION_URL;
|
m_serviceUrl = PRODUCTION_URL;
|
||||||
|
m_timer = new QTimer(this);
|
||||||
|
m_timer->setInterval(1000);
|
||||||
|
m_timer->setSingleShot(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EetSender::sendRequest(EetRequest *request)
|
void EetSender::sendRequest(EetRequest *request)
|
||||||
@@ -39,7 +45,7 @@ void EetSender::sendRequest(EetRequest *request)
|
|||||||
if (m_signer == nullptr)
|
if (m_signer == nullptr)
|
||||||
{
|
{
|
||||||
m_resut->setStatus(EetResult::USER_CERT_ERROR);
|
m_resut->setStatus(EetResult::USER_CERT_ERROR);
|
||||||
emit sendFinished(m_resut);
|
emit sendFinished();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +71,24 @@ void EetSender::sendRequest(EetRequest *request)
|
|||||||
QString strRequest = tempRequest.fillTemplate(val);
|
QString strRequest = tempRequest.fillTemplate(val);
|
||||||
|
|
||||||
QNetworkRequest req(QUrl(m_serviceUrl.toStdString().c_str()));
|
QNetworkRequest req(QUrl(m_serviceUrl.toStdString().c_str()));
|
||||||
m_manager->post(req, strRequest.toUtf8());
|
|
||||||
|
qDebug() << strRequest;
|
||||||
|
|
||||||
|
if (m_online)
|
||||||
|
{
|
||||||
|
QNetworkReply *rep = m_manager->post(req, strRequest.toUtf8());
|
||||||
|
m_timer->start();
|
||||||
|
connect(m_timer, &QTimer::timeout, [this, rep](){
|
||||||
|
rep->abort();
|
||||||
|
m_resut->setStatus(EetResult::TIMEDOUT);
|
||||||
|
emit sendFinished();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_resut->setStatus(EetResult::OFFLINE);
|
||||||
|
emit sendFinished();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EetSender::setupSigner(const QString &certPath, const QString &passwd)
|
void EetSender::setupSigner(const QString &certPath, const QString &passwd)
|
||||||
@@ -91,7 +114,7 @@ bool EetSender::checkSignature() const
|
|||||||
|
|
||||||
void EetSender::setPlayground(bool pg)
|
void EetSender::setPlayground(bool pg)
|
||||||
{
|
{
|
||||||
m_serviceUrl = pg ? PLAYGROUND_URL : PRODUCTION_URL;
|
m_serviceUrl = (pg ? PLAYGROUND_URL : PRODUCTION_URL);
|
||||||
}
|
}
|
||||||
|
|
||||||
EetResult *EetSender::resut() const
|
EetResult *EetSender::resut() const
|
||||||
@@ -99,6 +122,11 @@ EetResult *EetSender::resut() const
|
|||||||
return m_resut;
|
return m_resut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EetSender::setTimeout(int timeout)
|
||||||
|
{
|
||||||
|
m_timer->setInterval(timeout);
|
||||||
|
}
|
||||||
|
|
||||||
bool EetSender::verifySignature(const QByteArray &repData)
|
bool EetSender::verifySignature(const QByteArray &repData)
|
||||||
{
|
{
|
||||||
QString queryString("//senv:Envelope/senv:Header/wsse:Security/ds:Signature/ds:SignedInfo");
|
QString queryString("//senv:Envelope/senv:Header/wsse:Security/ds:Signature/ds:SignedInfo");
|
||||||
@@ -159,27 +187,62 @@ bool EetSender::verifySignature(const QByteArray &repData)
|
|||||||
|
|
||||||
void EetSender::replyFinished(QNetworkReply *reply)
|
void EetSender::replyFinished(QNetworkReply *reply)
|
||||||
{
|
{
|
||||||
|
m_timer->stop();
|
||||||
if (reply->error() != QNetworkReply::NoError)
|
if (reply->error() != QNetworkReply::NoError)
|
||||||
{
|
{
|
||||||
m_resut->setStatus(EetResult::SERVER_ERROR);
|
m_resut->setStatus(EetResult::SERVER_ERROR);
|
||||||
emit sendFinished(m_resut);
|
emit sendFinished();
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray repData = reply->readAll();
|
QByteArray repData = reply->readAll();
|
||||||
|
|
||||||
if (m_checkSignature && !verifySignature(repData))
|
qDebug() << QString(repData);
|
||||||
{
|
|
||||||
emit sendFinished(m_resut);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QXmlQuery q;
|
QXmlQuery q;
|
||||||
q.setFocus(QString(repData));
|
q.setFocus(QString(repData));
|
||||||
|
|
||||||
|
QXmlResultItems items;
|
||||||
QString result;
|
QString result;
|
||||||
QString queryString("//senv:Envelope/senv:Body/eet:Odpoved/eet:Hlavicka/@uuid_zpravy/data(.)");
|
QString queryString = "//senv:Envelope/senv:Body/eet:Odpoved/eet:Chyba";
|
||||||
|
q.setQuery(ms_nsDef + queryString);
|
||||||
|
q.evaluateTo(&items);
|
||||||
|
|
||||||
|
EetMessageList errors;
|
||||||
|
QXmlItem item = items.next();
|
||||||
|
while (!item.isNull())
|
||||||
|
{
|
||||||
|
EetMessage *mesg = new EetMessage(m_resut);
|
||||||
|
queryString = "./@kod/data(.)";
|
||||||
|
q.setQuery(ms_nsDef + queryString);
|
||||||
|
q.setFocus(item);
|
||||||
|
q.evaluateTo(&result);
|
||||||
|
result = result.trimmed();
|
||||||
|
|
||||||
|
mesg->setCode(result.toInt());
|
||||||
|
|
||||||
|
queryString = "./text(.)";
|
||||||
|
q.setQuery(ms_nsDef + queryString);
|
||||||
|
q.setFocus(item);
|
||||||
|
q.evaluateTo(&result);
|
||||||
|
result = result.trimmed();
|
||||||
|
|
||||||
|
mesg->setMessage(result);
|
||||||
|
errors.append(mesg);
|
||||||
|
|
||||||
|
item = items.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_resut->setErrors(errors);
|
||||||
|
|
||||||
|
if (m_checkSignature && errors.isEmpty() && !verifySignature(repData))
|
||||||
|
{
|
||||||
|
emit sendFinished();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
queryString = "//senv:Envelope/senv:Body/eet:Odpoved/eet:Hlavicka/@uuid_zpravy/data(.)";
|
||||||
q.setQuery(ms_nsDef + queryString);
|
q.setQuery(ms_nsDef + queryString);
|
||||||
q.evaluateTo(&result);
|
q.evaluateTo(&result);
|
||||||
result = result.trimmed();
|
result = result.trimmed();
|
||||||
@@ -198,13 +261,12 @@ void EetSender::replyFinished(QNetworkReply *reply)
|
|||||||
result = result.trimmed();
|
result = result.trimmed();
|
||||||
m_resut->setFik(result);
|
m_resut->setFik(result);
|
||||||
|
|
||||||
QXmlResultItems items;
|
|
||||||
queryString = "//senv:Envelope/senv:Body/eet:Odpoved/eet:Varovani";
|
queryString = "//senv:Envelope/senv:Body/eet:Odpoved/eet:Varovani";
|
||||||
q.setQuery(ms_nsDef + queryString);
|
q.setQuery(ms_nsDef + queryString);
|
||||||
q.evaluateTo(&items);
|
q.evaluateTo(&items);
|
||||||
|
|
||||||
EetMessageList warnings;
|
EetMessageList warnings;
|
||||||
QXmlItem item = items.next();
|
item = items.next();
|
||||||
while (!item.isNull())
|
while (!item.isNull())
|
||||||
{
|
{
|
||||||
EetMessage *mesg = new EetMessage(m_resut);
|
EetMessage *mesg = new EetMessage(m_resut);
|
||||||
@@ -230,38 +292,16 @@ void EetSender::replyFinished(QNetworkReply *reply)
|
|||||||
|
|
||||||
m_resut->setWarnings(warnings);
|
m_resut->setWarnings(warnings);
|
||||||
|
|
||||||
queryString = "//senv:Envelope/senv:Body/eet:Odpoved/eet:Chyba";
|
if (errors.isEmpty())
|
||||||
q.setQuery(ms_nsDef + queryString);
|
|
||||||
q.evaluateTo(&items);
|
|
||||||
|
|
||||||
EetMessageList errors;
|
|
||||||
item = items.next();
|
|
||||||
while (!item.isNull())
|
|
||||||
{
|
{
|
||||||
EetMessage *mesg = new EetMessage(m_resut);
|
m_resut->setReciveDate(QDateTime::currentDateTime());
|
||||||
queryString = "./@kod/data(.)";
|
}
|
||||||
q.setQuery(ms_nsDef + queryString);
|
else
|
||||||
q.setFocus(item);
|
{
|
||||||
q.evaluateTo(&result);
|
m_resut->setStatus(EetResult::DATA_ERROR);
|
||||||
result = result.trimmed();
|
|
||||||
|
|
||||||
mesg->setCode(result.toInt());
|
|
||||||
|
|
||||||
queryString = "./text(.)";
|
|
||||||
q.setQuery(ms_nsDef + queryString);
|
|
||||||
q.setFocus(item);
|
|
||||||
q.evaluateTo(&result);
|
|
||||||
result = result.trimmed();
|
|
||||||
|
|
||||||
mesg->setMessage(result);
|
|
||||||
errors.append(mesg);
|
|
||||||
|
|
||||||
item = items.next();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_resut->setErrors(errors);
|
emit sendFinished();
|
||||||
m_resut->setReciveDate(QDateTime::currentDateTime());
|
|
||||||
emit sendFinished(m_resut);
|
|
||||||
|
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-1
@@ -2,6 +2,7 @@
|
|||||||
#define EETSENDER_H
|
#define EETSENDER_H
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
#include "eetcpp_global.h"
|
#include "eetcpp_global.h"
|
||||||
#include "eetrequest.h"
|
#include "eetrequest.h"
|
||||||
@@ -58,10 +59,15 @@ public:
|
|||||||
*/
|
*/
|
||||||
EetResult *resut() const;
|
EetResult *resut() const;
|
||||||
|
|
||||||
|
void setTimeout(int timeout);
|
||||||
|
|
||||||
|
static bool m_online;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const QString ms_nsDef;
|
static const QString ms_nsDef;
|
||||||
EetSigner *m_signer;
|
EetSigner *m_signer;
|
||||||
QNetworkAccessManager *m_manager;
|
QNetworkAccessManager *m_manager;
|
||||||
|
QTimer *m_timer;
|
||||||
bool m_checkSignature;
|
bool m_checkSignature;
|
||||||
EetResult *m_resut;
|
EetResult *m_resut;
|
||||||
QString m_serviceUrl;
|
QString m_serviceUrl;
|
||||||
@@ -72,7 +78,7 @@ private slots:
|
|||||||
void replyFinished(QNetworkReply *reply);
|
void replyFinished(QNetworkReply *reply);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void sendFinished(EetResult *result);
|
void sendFinished();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user