Ticket #12255: mythtv-mythsingledownload-redirect-master.patch

File mythtv-mythsingledownload-redirect-master.patch, 3.1 KB (added by myth@…, 5 years ago)

Patch for master

  • mythtv/libs/libmythbase/mythsingledownload.cpp

    diff --git a/mythtv/libs/libmythbase/mythsingledownload.cpp b/mythtv/libs/libmythbase/mythsingledownload.cpp
    index 95db42d..0ade2f3 100644
    a b  
    99 */
    1010
    1111bool MythSingleDownload::DownloadURL(const QString &url, QByteArray *buffer,
    12                                      uint timeout)
     12                                     uint timeout, uint redirs)
    1313{
    14     QMutexLocker  lock(&m_lock);
     14    m_lock.lock();
    1515
    1616    // create custom temporary event loop on stack
    1717    QEventLoop   event_loop;
    bool MythSingleDownload::DownloadURL(const QString &url, QByteArray *buffer, 
    4343        LOG(VB_GENERAL, LOG_ERR, QString("MythSingleDownload evenloop failed"));
    4444    }
    4545
    46     QMutexLocker  replylock(&m_replylock);
     46    m_replylock.lock();
    4747    if (m_timer.isActive())
    4848    {
    4949        m_timer.stop();
    5050        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
    5171        if (m_errorcode == QNetworkReply::NoError)
    5272        {
    5373            *buffer += m_reply->readAll();
    5474            delete m_reply;
    5575            m_reply = NULL;
    5676            m_errorstring.clear();
    57             return true;
     77            ret = true;
    5878        }
    5979        else
    6080        {
    6181            m_errorstring = m_reply->errorString();
    6282            delete m_reply;
    6383            m_reply = NULL;
    64             return false;
     84            ret = false;
    6585        }
    6686    }
    6787    else
    bool MythSingleDownload::DownloadURL(const QString &url, QByteArray *buffer, 
    7191        m_reply->abort();
    7292        delete m_reply;
    7393        m_reply = NULL;
    74         return false;
     94        ret = false;
    7595    }
     96    m_replylock.unlock();
     97    m_lock.unlock();
     98    return ret;
    7699}
    77100
    78101void MythSingleDownload::Cancel(void)
  • mythtv/libs/libmythbase/mythsingledownload.h

    diff --git a/mythtv/libs/libmythbase/mythsingledownload.h b/mythtv/libs/libmythbase/mythsingledownload.h
    index af7144d..7c4e38d 100644
    a b class MBASE_PUBLIC MythSingleDownload : public QObject 
    2828   MythSingleDownload(void) : m_reply(NULL), m_errorcode(QNetworkReply::NoError) { ; }
    2929   ~MythSingleDownload(void) { ; }
    3030
    31    bool DownloadURL(const QString &url, QByteArray *buffer, uint timeout = 30000);
     31   bool DownloadURL(const QString &url, QByteArray *buffer, uint timeout = 30000,
     32                    uint redirs = 0);
    3233   void Cancel(void);
    3334   QString ErrorString(void) const { return m_errorstring; }
    3435   QNetworkReply::NetworkError ErrorCode(void) const { return m_errorcode; }