void XMLHttpRequest::onReplyFinished() { const QString redirect = QString::fromUtf8(m_reply->rawHeader("Location")); if (!redirect.isEmpty()) { Logger::log("XMLHttpRequest::onReplyFinished(): Redirect: " + redirect); if (m_redirects < MAX_REDIRECTS) { QUrl url(redirect); if (url.scheme().isEmpty()) { url.setScheme(m_reply->url().scheme()); } if (url.authority().isEmpty()) { url.setAuthority(m_reply->url().authority()); } m_reply->deleteLater(); m_reply = 0; followRedirect(url); return; } } if (m_reply->bytesAvailable() > 0) { m_response += m_reply->readAll(); } setStatus(m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()); setStatusText(m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()); setReadyState(DONE); m_reply->deleteLater(); m_reply = 0; }
void PublishToMePlugin::checkDownloadLink() { QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); if (!reply) { emit error(tr("Network error")); return; } const QString redirect = getRedirect(reply); if (!redirect.isEmpty()) { if (FILE_REGEXP.indexIn(redirect) == 0) { emit downloadRequest(QNetworkRequest(redirect)); } else if (m_redirects < MAX_REDIRECTS) { followRedirect(redirect, SLOT(checkDownloadLink())); } else { emit error(tr("Maximum redirects reached")); } reply->deleteLater(); return; } switch (reply->error()) { case QNetworkReply::NoError: break; case QNetworkReply::OperationCanceledError: reply->deleteLater(); return; default: emit error(reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()); reply->deleteLater(); return; } const QString response = QString::fromUtf8(reply->readAll()); if (FILE_REGEXP.indexIn(response) != -1) { QString url = FILE_REGEXP.cap(); if (url.startsWith("/")) { url.prepend(reply->url().scheme() + "://" + reply->url().authority()); } emit downloadRequest(QNetworkRequest(url)); } else { emit error(tr("Unknown error")); } reply->deleteLater(); }
void PublishToMePlugin::checkUrlIsValid() { QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); if (!reply) { emit error(tr("Network error")); return; } const QString redirect = getRedirect(reply); if (!redirect.isEmpty()) { if (FILE_REGEXP.indexIn(redirect) == 0) { emit urlChecked(UrlResult(reply->request().url().toString(), redirect.mid(redirect.lastIndexOf("/") + 1))); } else if (m_redirects < MAX_REDIRECTS) { followRedirect(redirect, SLOT(checkUrlIsValid())); } else { emit error(tr("Maximum redirects reached")); } reply->deleteLater(); return; } switch (reply->error()) { case QNetworkReply::NoError: break; case QNetworkReply::OperationCanceledError: reply->deleteLater(); return; default: emit error(reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()); reply->deleteLater(); return; } const QString response = QString::fromUtf8(reply->readAll()); const QString fileName = response.section("icon-download-alt\" style=\"\"></i>", 1, 1) .section("</div>", 0, 0).trimmed(); if (fileName.isEmpty()) { emit error(tr("File not found")); } else { emit urlChecked(UrlResult(reply->request().url().toString(), fileName)); } reply->deleteLater(); }
void MybbFeedRequest::checkLogin() { QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); if (!reply) { setErrorString(tr("Network error")); setStatus(Error); emit finished(this); return; } QString redirect = getRedirect(reply); if (!redirect.isEmpty()) { reply->deleteLater(); if (m_redirects < MAX_REDIRECTS) { followRedirect(redirect, SLOT(checkLogin())); } else { setErrorString(tr("Maximum redirects reached")); setStatus(Error); emit finished(this); } return; } switch (reply->error()) { case QNetworkReply::NoError: #ifdef MYBB_DEBUG qDebug() << "MybbFeedRequest::checkLogin(). OK"; #endif getPage(m_settings.value("url").toString()); reply->deleteLater(); break; case QNetworkReply::OperationCanceledError: setErrorString(QString()); setStatus(Canceled); emit finished(this); break; default: #ifdef MYBB_DEBUG qDebug() << "MybbFeedRequest::checkLogin(). Error"; #endif setErrorString(reply->errorString()); setStatus(Error); emit finished(this); break; } }
void _q_onReplyFinished() { if (!reply) { return; } Q_Q(StreamsRequest); if (redirects < MAX_REDIRECTS) { QUrl redirect = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toString(); if (redirect.isEmpty()) { redirect = reply->header(QNetworkRequest::LocationHeader).toString(); } if (!redirect.isEmpty()) { reply->deleteLater(); reply = 0; followRedirect(redirect); return; } } QString response = QString::fromUtf8(reply->readAll()); QNetworkReply::NetworkError e = reply->error(); QString es = reply->errorString(); reply->deleteLater(); reply = 0; switch (e) { case QNetworkReply::NoError: break; case QNetworkReply::OperationCanceledError: setStatus(Request::Canceled); setError(Request::NoError); setErrorString(QString()); emit q->finished(); return; case QNetworkReply::AuthenticationRequiredError: if (refreshToken.isEmpty()) { setStatus(Request::Failed); setError(Request::Error(e)); setErrorString(es); emit q->finished(); } else { refreshAccessToken(); } return; default: setStatus(Request::Failed); setError(Request::Error(e)); setErrorString(es); emit q->finished(); return; } bool ok = true; track = QtJson::Json::parse(response, ok).toMap(); formats.clear(); if (ok) { if (track.value("downloadable").toBool()) { getRedirect(track.value("download_url").toString(), SLOT(_q_onDownloadRedirect())); return; } if (track.value("streamable").toBool()) { getRedirect(track.value("stream_url").toString(), SLOT(_q_onStreamRedirect())); return; } setResult(formats); setStatus(Request::Ready); setError(Request::NoError); setErrorString(QString()); } else { setStatus(Request::Failed); setError(Request::ParseError); setErrorString(Request::tr("Unable to parse response")); } emit q->finished(); }
void Rss::parseTracks(QNetworkReply *reply) { if (!reply) { std::cout << qPrintable(QString("{\"error\": \"%1\"}").arg(tr("Network error"))); QCoreApplication::exit(1); return; } if (reply->error() != QNetworkReply::NoError) { reply->deleteLater(); std::cout << qPrintable(QString("{\"error\": \"%1: %2\"}").arg(tr("Network error")).arg(reply->errorString())); QCoreApplication::exit(1); return; } QVariant redirect = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (!redirect.isNull()) { reply->deleteLater(); if (m_redirects < MAX_REDIRECTS) { followRedirect(redirect.toString()); } else { std::cout << qPrintable(QString("{\"error\": \"%1: %2\"}").arg(tr("Network error")) .arg(tr("Maximum redirects reached"))); QCoreApplication::exit(1); } return; } QDomDocument doc; if (!doc.setContent(reply->readAll(), true)) { reply->deleteLater(); std::cout << qPrintable(QString("{\"error\": \"%1\"}").arg(tr("Unable to parse XML"))); QCoreApplication::exit(1); return; } QDomElement docElem = doc.documentElement(); QDomNodeList items = docElem.elementsByTagName("item"); QDomNode channelElem = docElem.firstChildElement("channel"); QString thumbnailUrl = channelElem.firstChildElement("image").attribute("href"); QString genre = channelElem.firstChildElement("category").attribute("text"); for (int i = 0; i < items.size(); i++) { QDomElement item = items.at(i).toElement(); QDateTime dt = QDateTime::fromString(item.firstChildElement("pubDate").text().section(' ', 0, -2), "ddd, dd MMM yyyy hh:mm:ss"); QString streamUrl = item.firstChildElement("enclosure").attribute("url"); QVariantMap result; result["_dt"] = dt; result["artist"] = item.firstChildElement("author").text(); result["date"] = dt.toString("dd MMM yyyy"); result["description"] = item.firstChildElement("description").text(); result["duration"] = item.firstChildElement("duration").text(); result["format"] = streamUrl.mid(streamUrl.lastIndexOf('.') + 1).toUpper(); result["genre"] = genre; result["id"] = reply->url(); result["largeThumbnailUrl"] = thumbnailUrl; result["streamUrl"] = streamUrl; result["thumbnailUrl"] = thumbnailUrl; result["title"] = item.firstChildElement("title").text(); result["url"] = item.firstChildElement("link").text(); m_results << result; } reply->deleteLater(); if (m_urls.isEmpty()) { printResult(); } else { listTracks(m_urls.takeFirst()); } }
void PublishToMePlugin::checkCaptcha() { QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); if (!reply) { emit error(tr("Network error")); return; } const QString redirect = getRedirect(reply); if (!redirect.isEmpty()) { if (FILE_REGEXP.indexIn(redirect) == 0) { emit downloadRequest(QNetworkRequest(redirect)); } else if (m_redirects < MAX_REDIRECTS) { followRedirect(redirect, SLOT(checkCaptcha())); } else { emit error(tr("Maximum redirects reached")); } reply->deleteLater(); return; } switch (reply->error()) { case QNetworkReply::NoError: break; case QNetworkReply::OperationCanceledError: reply->deleteLater(); return; default: emit error(reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()); reply->deleteLater(); return; } const QString response = QString::fromUtf8(reply->readAll()); if (FILE_REGEXP.indexIn(response) != -1) { QString url = FILE_REGEXP.cap(); if (url.startsWith("/")) { url.prepend(reply->url().scheme() + "://" + reply->url().authority()); } emit downloadRequest(QNetworkRequest(url)); } else if (response.contains("verification code is incorrect")) { QString recaptchaKey = response.section("/file/captcha.html?v=", 1, 1).section('"', 0, 0); if (recaptchaKey.isEmpty()) { emit error(tr("No captcha key found")); } else { recaptchaKey.prepend(QString("http://%1/file/captcha.html?v=").arg(reply->url().host())); emit captchaRequest(RECAPTCHA_PLUGIN_ID, CaptchaType::Image, recaptchaKey, "submitCaptchaResponse"); } } else { const int secs = response.section("tik-tak\" >", 1, 1).section('<', 0, 0).toInt(); if (secs > 0) { startWaitTimer(secs * 1000, SLOT(getDownloadLink())); } else { emit error(tr("Unknown error")); } } reply->deleteLater(); }
void PublishToMePlugin::checkWaitTime() { QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); if (!reply) { emit error(tr("Network error")); return; } const QString redirect = getRedirect(reply); if (!redirect.isEmpty()) { if (FILE_REGEXP.indexIn(redirect) == 0) { emit downloadRequest(QNetworkRequest(redirect)); } else if (m_redirects < MAX_REDIRECTS) { followRedirect(redirect, SLOT(checkWaitTime())); } else { emit error(tr("Maximum redirects reached")); } reply->deleteLater(); return; } switch (reply->error()) { case QNetworkReply::NoError: break; case QNetworkReply::OperationCanceledError: reply->deleteLater(); return; default: emit error(reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()); reply->deleteLater(); return; } const QString response = QString::fromUtf8(reply->readAll()); if (FILE_REGEXP.indexIn(response) != -1) { QString url = FILE_REGEXP.cap(); if (url.startsWith("/")) { url.prepend(reply->url().scheme() + "://" + reply->url().authority()); } emit downloadRequest(QNetworkRequest(url)); } else if (response.contains("Downloading is not possible")) { const QTime time = QTime::fromString(response.section("Please wait", 1, 1).section("to download", 0, 0) .trimmed(), "hh:mm:ss"); if (time.isValid()) { emit waitRequest(QTime(0, 0).msecsTo(time), true); } else { emit error(tr("Unknown error")); } } else { QString recaptchaKey = response.section("/file/captcha.html?v=", 1, 1).section('"', 0, 0); if (recaptchaKey.isEmpty()) { emit error(tr("No captcha key found")); } else { recaptchaKey.prepend(QString("http://%1/file/captcha.html?v=").arg(reply->url().host())); emit captchaRequest(RECAPTCHA_PLUGIN_ID, CaptchaType::Image, recaptchaKey, "submitCaptchaResponse"); } } reply->deleteLater(); }
void MybbFeedRequest::checkPage() { QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); if (!reply) { setErrorString(tr("Network error")); setStatus(Error); emit finished(this); return; } QString redirect = getRedirect(reply); if (!redirect.isEmpty()) { reply->deleteLater(); if (m_redirects < MAX_REDIRECTS) { followRedirect(redirect, SLOT(checkPage())); } else { setErrorString(tr("Maximum redirects reached")); setStatus(Error); emit finished(this); } return; } switch (reply->error()) { case QNetworkReply::NoError: break; case QNetworkReply::OperationCanceledError: setErrorString(QString()); setStatus(Canceled); emit finished(this); return; default: setErrorString(reply->errorString()); setStatus(Error); emit finished(this); return; } const QUrl url = reply->url(); const QString baseUrl = url.scheme() + "://" + url.authority(); QString page = QString::fromUtf8(reply->readAll()); reply->deleteLater(); fixRelativeUrls(page, baseUrl); const QHtmlDocument document(page); const QHtmlElement html = document.htmlElement(); if (m_results == 0) { QString redirect = getLatestPageUrl(html); if (!redirect.isEmpty()) { if (m_redirects < MAX_REDIRECTS) { followRedirect(redirect, SLOT(checkPage())); } else { setErrorString(tr("Maximum redirects reached")); setStatus(Error); emit finished(this); } return; } #ifdef MYBB_DEBUG qDebug() << "MybbFeedRequest::checkPage(). Writing start of feed"; #endif writeStartFeed(); writeFeedTitle(html); writeFeedUrl(baseUrl); } const QHtmlElementList items = getItems(html); if (items.isEmpty()) { #ifdef MYBB_DEBUG qDebug() << "MybbFeedRequest::checkPage(). No items found. Writing end of feed"; #endif writeEndFeed(); setErrorString(QString()); setStatus(Ready); emit finished(this); return; } const int max = m_settings.value("maxResults", 20).toInt(); int i = items.size() - 1; while ((i >= 0) && (m_results < max)) { const QHtmlElement &item = items.at(i); --i; ++m_results; #ifdef MYBB_DEBUG qDebug() << "MybbFeedRequest::checkPage(). Writing item" << m_results << "of" << max; #endif writeStartItem(); writeItemAuthor(item); writeItemBody(item); writeItemDate(item); writeItemTitle(item); writeItemUrl(item); writeEndItem(); } if (m_results < max) { const QString next = getNextPageUrl(html); if (!next.isEmpty()) { getPage(next); return; } } #ifdef MYBB_DEBUG qDebug() << "MybbFeedRequest::checkPage(). Writing end of feed"; #endif writeEndFeed(); setErrorString(QString()); setStatus(Ready); emit finished(this); }
void RequestPrivate::_q_onReplyFinished() { if (!reply) { return; } Q_Q(Request); if (redirects < MAX_REDIRECTS) { QUrl redirect = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (redirect.isEmpty()) { redirect = reply->header(QNetworkRequest::LocationHeader).toUrl(); } if (!redirect.isEmpty()) { reply->deleteLater(); reply = 0; followRedirect(redirect); return; } } bool ok = true; const QString response = QString::fromUtf8(reply->readAll()); setResult(response.isEmpty() ? response : QtJson::Json::parse(response, ok)); const QNetworkReply::NetworkError e = reply->error(); const QString es = reply->errorString(); reply->deleteLater(); reply = 0; switch (e) { case QNetworkReply::NoError: break; case QNetworkReply::OperationCanceledError: setStatus(Request::Canceled); setError(Request::NoError); setErrorString(QString()); emit q->finished(); return; case QNetworkReply::AuthenticationRequiredError: if (refreshToken.isEmpty()) { setStatus(Request::Failed); setError(Request::Error(e)); setErrorString(es); emit q->finished(); } else { refreshAccessToken(); } return; default: setStatus(Request::Failed); setError(Request::Error(e)); setErrorString(es); emit q->finished(); return; } if (ok) { setStatus(Request::Ready); setError(Request::NoError); setErrorString(QString()); } else { setStatus(Request::Failed); setError(Request::ParseError); setErrorString(Request::tr("Unable to parse response")); } emit q->finished(); }