15 #include <QNetworkReply>
17 static void debugHelper(
const QByteArray &data,
const QList<QNetworkReply::RawHeaderPair> &headerList)
19 const QByteArray doDebug = qgetenv(
"KDSOAP_DEBUG");
20 const QList<QByteArray> options = doDebug.toLower().split(
',');
21 const bool optEscape = options.contains(
"escape");
22 const bool optHttp = options.contains(
"http") || options.contains(
"https");
23 const bool optReformat = options.contains(
"reformat");
24 quint8 indentation = 4;
25 for (
const QByteArray &opt : qAsConst(options)) {
26 if (opt.startsWith(
"indent=")) {
27 indentation = opt.mid(7).toUShort();
33 for (
const QNetworkReply::RawHeaderPair &header : qAsConst(headerList)) {
34 if (!header.first.isEmpty()) {
35 toOutput += header.first +
": ";
37 toOutput += header.second +
"\n";
43 QByteArray reformatted;
44 QXmlStreamReader reader(data);
45 QXmlStreamWriter writer(&reformatted);
46 writer.setAutoFormatting(
true);
47 writer.setAutoFormattingIndent(indentation);
49 while (!reader.atEnd()) {
51 if (!reader.hasError() && !reader.isWhitespace()) {
52 writer.writeCurrentToken(reader);
56 toOutput += reader.hasError() ? data : reformatted;
64 qDebug().noquote() << toOutput;
71 const QByteArray doDebug = qgetenv(
"KDSOAP_DEBUG");
72 if (doDebug.trimmed().isEmpty() || doDebug ==
"0") {
81 void maybeDebugRequest(
const QByteArray &data,
const QNetworkRequest &request, QNetworkReply *reply)
83 const QByteArray doDebug = qgetenv(
"KDSOAP_DEBUG");
84 if (doDebug.trimmed().isEmpty() || doDebug ==
"0") {
88 QList<QNetworkReply::RawHeaderPair> headerList;
91 switch (reply->operation()) {
94 case QNetworkAccessManager::GetOperation:
97 case QNetworkAccessManager::HeadOperation:
100 case QNetworkAccessManager::PutOperation:
103 case QNetworkAccessManager::PostOperation:
106 case QNetworkAccessManager::DeleteOperation:
110 if (!method.isEmpty()) {
111 QByteArray output = method +
" " + reply->url().toString().toUtf8();
112 headerList << QNetworkReply::RawHeaderPair {{}, std::move(output)};
115 const auto rawHeaders = request.rawHeaderList();
116 for (
const QByteArray &h : rawHeaders) {
117 headerList << QNetworkReply::RawHeaderPair {h, request.rawHeader(h)};
126 QObject::disconnect(
reply.data(), &QNetworkReply::finished,
nullptr,
nullptr);
134 : d(new
Private(reply, buffer))
155 return d->reply.data()->isFinished();
161 return d->replyMessage;
167 return d->replyHeaders;
173 if (!d->replyMessage.childValues().isEmpty()) {
174 return d->replyMessage.childValues().first().value();
184 QNetworkReply *
reply = this->reply.data();
185 if (!
reply->isFinished()) {
186 qWarning(
"KDSoap: Parsing reply before it finished!");
192 const QByteArray data =
reply->isOpen() ?
reply->readAll() : QByteArray();
195 if (!data.isEmpty()) {
200 if (reply->error()) {
203 if (
reply->error() == QNetworkReply::OperationCanceledError
204 &&
reply->property(
"kdsoap_reply_timed_out").toBool()) {
static void debugHelper(const QByteArray &data, const QList< QNetworkReply::RawHeaderPair > &headerList)
void maybeDebugRequest(const QByteArray &data, const QNetworkRequest &request, QNetworkReply *reply)
static void maybeDebugResponse(const QByteArray &data, QNetworkReply *reply)
XmlError xmlToMessage(const QByteArray &data, KDSoapMessage *pParsedMessage, QString *pMessageNamespace, KDSoapHeaders *pRequestHeaders, KDSoap::SoapVersion soapVersion) const
void createFaultMessage(const QString &faultCode, const QString &faultText, KDSoap::SoapVersion soapVersion)
QPointer< QNetworkReply > reply
KDSoapHeaders replyHeaders
KDSoapMessage replyMessage
KDSoap::SoapVersion soapVersion
KDSoapPendingCall(const KDSoapPendingCall &other)
KDSoapHeaders returnHeaders() const
QVariant returnValue() const
KDSoapPendingCall & operator=(const KDSoapPendingCall &other)
KDSoapMessage returnMessage() const