11 #include <QCoreApplication> 12 #include <QDomDocument> 13 #include <QNetworkAccessManager> 24 QByteArray GetChallengeRequestBody ()
26 return R
"(<?xml version="1.0"?> 28 <methodName>LJ.XMLRPC.getchallenge</methodName> 33 std::optional<QString> GetChallenge (const QDomDocument& doc)
35 const auto& replyStruct = doc.documentElement ()
36 .firstChildElement (
"params"_qs)
37 .firstChildElement (
"param"_qs)
38 .firstChildElement (
"value"_qs)
39 .firstChildElement (
"struct"_qs);
41 if (member.firstChildElement (
"name"_qs).text () ==
"challenge")
43 .firstChildElement (
"value"_qs)
44 .firstChildElement (
"string"_qs)
52 Q_DECLARE_TR_FUNCTIONS (
"LC::Util::LJ")
58 QNetworkRequest request { QUrl {
"http://www.livejournal.com/interface/xmlrpc"_qs } };
59 request.setRawHeader (
"User-Agent", config.
UserAgent_);
60 request.setHeader (QNetworkRequest::ContentTypeHeader,
"text/xml");
62 const auto reply = config.
NAM_.post (request, GetChallengeRequestBody ());
63 const auto response = co_await *reply;
64 if (
const auto err = response.IsError ())
67 co_return
Left { Tr::tr (
"Network error: %1").arg (err->ErrorText_) };
70 const auto& data = response.GetReplyData ();
73 if (!doc.setContent (data))
75 qWarning () <<
"failed to parse response from" << data;
76 co_return
Left { Tr::tr (
"Failed to parse response") };
79 const auto& challenge = GetChallenge (doc);
82 qWarning () <<
"failed to get challenge from\n" << doc.toByteArray (1).constData ();
83 co_return
Left { Tr::tr (
"Failed to parse response") };
QNetworkAccessManager & NAM_
auto DomChildren(const QDomNode &parent, const QString &tag)
Creates a range iterating over direct children named tag.
Task< RequestChallengeResult > RequestChallenge(RequestChallengeConfig config)