diff --git a/mythtv/libs/libmythbase/mythsingledownload.cpp b/mythtv/libs/libmythbase/mythsingledownload.cpp
index 95db42d..0ade2f3 100644
|
a
|
b
|
|
| 9 | 9 | */ |
| 10 | 10 | |
| 11 | 11 | bool MythSingleDownload::DownloadURL(const QString &url, QByteArray *buffer, |
| 12 | | uint timeout) |
| | 12 | uint timeout, uint redirs) |
| 13 | 13 | { |
| 14 | | QMutexLocker lock(&m_lock); |
| | 14 | m_lock.lock(); |
| 15 | 15 | |
| 16 | 16 | // create custom temporary event loop on stack |
| 17 | 17 | QEventLoop event_loop; |
| … |
… |
bool MythSingleDownload::DownloadURL(const QString &url, QByteArray *buffer,
|
| 43 | 43 | LOG(VB_GENERAL, LOG_ERR, QString("MythSingleDownload evenloop failed")); |
| 44 | 44 | } |
| 45 | 45 | |
| 46 | | QMutexLocker replylock(&m_replylock); |
| | 46 | m_replylock.lock(); |
| 47 | 47 | if (m_timer.isActive()) |
| 48 | 48 | { |
| 49 | 49 | m_timer.stop(); |
| 50 | 50 | m_errorcode = m_reply->error(); |
| | 51 | |
| | 52 | QString redir = m_reply->attribute( |
| | 53 | QNetworkRequest::RedirectionTargetAttribute).toUrl().toString(); |
| | 54 | |
| | 55 | if (redir.length()) |
| | 56 | { |
| | 57 | if (redirs > 3) |
| | 58 | { |
| | 59 | LOG(VB_GENERAL, LOG_ERR, QString("%1: too many redirects").arg(url)); |
| | 60 | ret = false; |
| | 61 | } |
| | 62 | else |
| | 63 | { |
| | 64 | LOG(VB_GENERAL, LOG_INFO, QString("%1 -> %2").arg(url).arg(redir)); |
| | 65 | m_replylock.unlock(); |
| | 66 | m_lock.unlock(); |
| | 67 | return DownloadURL(redir, buffer, timeout, redirs + 1); |
| | 68 | } |
| | 69 | } |
| | 70 | |
| 51 | 71 | if (m_errorcode == QNetworkReply::NoError) |
| 52 | 72 | { |
| 53 | 73 | *buffer += m_reply->readAll(); |
| 54 | 74 | delete m_reply; |
| 55 | 75 | m_reply = NULL; |
| 56 | 76 | m_errorstring.clear(); |
| 57 | | return true; |
| | 77 | ret = true; |
| 58 | 78 | } |
| 59 | 79 | else |
| 60 | 80 | { |
| 61 | 81 | m_errorstring = m_reply->errorString(); |
| 62 | 82 | delete m_reply; |
| 63 | 83 | m_reply = NULL; |
| 64 | | return false; |
| | 84 | ret = false; |
| 65 | 85 | } |
| 66 | 86 | } |
| 67 | 87 | else |
| … |
… |
bool MythSingleDownload::DownloadURL(const QString &url, QByteArray *buffer,
|
| 71 | 91 | m_reply->abort(); |
| 72 | 92 | delete m_reply; |
| 73 | 93 | m_reply = NULL; |
| 74 | | return false; |
| | 94 | ret = false; |
| 75 | 95 | } |
| | 96 | m_replylock.unlock(); |
| | 97 | m_lock.unlock(); |
| | 98 | return ret; |
| 76 | 99 | } |
| 77 | 100 | |
| 78 | 101 | void MythSingleDownload::Cancel(void) |
diff --git a/mythtv/libs/libmythbase/mythsingledownload.h b/mythtv/libs/libmythbase/mythsingledownload.h
index d43f083..4b3d92b 100644
|
a
|
b
|
class MBASE_PUBLIC MythSingleDownload : public QObject
|
| 29 | 29 | ~MythSingleDownload(void) { ; } |
| 30 | 30 | |
| 31 | 31 | bool DownloadURL(const QString &url, QByteArray *buffer, |
| 32 | | uint timeout = 30000); |
| | 32 | uint timeout = 30000, uint redirs = 0); |
| 33 | 33 | void Cancel(void); |
| 34 | 34 | QString ErrorString(void) const { return m_errorstring; } |
| 35 | 35 | QNetworkReply::NetworkError ErrorCode(void) const { return m_errorcode; } |