diff options
author | Kitsune Ral <Kitsune-Ral@users.sf.net> | 2020-12-23 17:21:01 +0100 |
---|---|---|
committer | Kitsune Ral <Kitsune-Ral@users.sf.net> | 2020-12-23 17:27:06 +0100 |
commit | 374377c37e8b82f1503fbb259e529f6551716df3 (patch) | |
tree | a5a52dac1d215eeafcac0376eed5828c8110a88f /lib/jobs | |
parent | 3ef036cd5936df4c0324ef54aa2bc11d745bd4c7 (diff) | |
download | libquotient-374377c37e8b82f1503fbb259e529f6551716df3.tar.gz libquotient-374377c37e8b82f1503fbb259e529f6551716df3.zip |
BaseJob: tolerate unexpected error payloads
Proxy servers may return arbitrary HTML, for one example; so don't
expect to find a valid JSON object in whatever non-empty payload
next to a non-2xx HTTP code. Fixes #421.
(cherry picked from commit 9ef83e044ed4f8409156b19d529dfc7e45f565c1)
Diffstat (limited to 'lib/jobs')
-rw-r--r-- | lib/jobs/basejob.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/lib/jobs/basejob.cpp b/lib/jobs/basejob.cpp index b757854a..e16ba4ef 100644 --- a/lib/jobs/basejob.cpp +++ b/lib/jobs/basejob.cpp @@ -510,14 +510,15 @@ BaseJob::Status BaseJob::prepareResult() { return Success; } BaseJob::Status BaseJob::prepareError() { - if (!d->rawResponse.isEmpty()) { - if (const auto status = d->parseJson(); !status.good()) - return status; // If there's anything there, it should be JSON - if (d->jsonResponse.isArray()) // ...specifically, a JSON object - return { IncorrectResponse, - tr("Malformed error JSON: an array instead of an object") }; - } - + // Try to make sense of the error payload but be prepared for all kinds + // of unexpected stuff (raw HTML, plain text, foreign JSON among those) + if (!d->rawResponse.isEmpty() + && reply()->rawHeader("Content-Type") == "application/json") + d->parseJson(); + + // By now, if d->parseJson() above succeeded then jsonData() will return + // a valid JSON object - or an empty object otherwise (in which case most + // of if's below will fall through to `return NoError` at the end const auto& errorJson = jsonData(); const auto errCode = errorJson.value("errcode"_ls).toString(); if (error() == TooManyRequestsError || errCode == "M_LIMIT_EXCEEDED") { |