TEST_F(CachingCorrectnessTest, FreshWithStaleRedirect) { KURL redirectUrl(ParsedURLString, kResourceURL); const char redirectTargetUrlString[] = "http://redirect-target.com"; KURL redirectTargetUrl(ParsedURLString, redirectTargetUrlString); ResourcePtr<Resource> firstResource = new Resource(ResourceRequest(redirectUrl), Resource::Raw); ResourceResponse stale301Response; stale301Response.setURL(redirectUrl); stale301Response.setHTTPStatusCode(301); stale301Response.setHTTPHeaderField(HTTPNames::Date, kOriginalRequestDateAsString); stale301Response.setHTTPHeaderField(HTTPNames::Location, redirectTargetUrlString); // Add the redirect to our request. ResourceRequest redirectRequest = ResourceRequest(redirectTargetUrl); firstResource->willFollowRedirect(redirectRequest, stale301Response); // Add the final response to our request. ResourceResponse fresh200Response; fresh200Response.setURL(redirectTargetUrl); fresh200Response.setHTTPStatusCode(200); fresh200Response.setHTTPHeaderField(HTTPNames::Date, kOriginalRequestDateAsString); fresh200Response.setHTTPHeaderField(HTTPNames::Expires, kOneDayAfterOriginalRequest); firstResource->setResponse(fresh200Response); memoryCache()->add(firstResource.get()); advanceClock(500.); ResourcePtr<Resource> fetched = fetch(); EXPECT_NE(firstResource, fetched); }
void RSSEditPopup::slotCheckRedirect(QNetworkReply* reply) { QVariant possibleRedirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); QUrl urlRedirectedTo = redirectUrl(possibleRedirectUrl.toUrl(), urlRedirectedTo); if(!urlRedirectedTo.isEmpty()) { m_urlEdit->SetText(urlRedirectedTo.toString()); m_manager->get(QNetworkRequest(urlRedirectedTo)); } else { // urlRedirectedTo.clear(); slotSave(reply); } reply->deleteLater(); }
void WizUpgradeChecker::_check(const QString& strUrl) { QNetworkReply* reply = m_net->get(QNetworkRequest(strUrl)); WizAutoTimeOutEventLoop loop(reply); loop.exec(); QUrl possibleRedirectedUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); m_redirectedUrl = redirectUrl(possibleRedirectedUrl, m_redirectedUrl); if (!m_redirectedUrl.isEmpty()) { // redirect to download server. QString strVersion; QRegExp regexp("(\\d{4}-\\d{2}-\\d{2})"); if (regexp.indexIn(m_redirectedUrl.toString()) == -1) { Q_EMIT checkFinished(false); return; } strVersion = regexp.cap(0); int y = strVersion.split("-").at(0).toInt(); int m = strVersion.split("-").at(1).toInt(); int d = strVersion.split("-").at(2).toInt(); QDate dateUpgrade(y, m, d); QFileInfo fi(::WizGetAppFileName()); QDate dateLocal = fi.created().date(); if (dateUpgrade > dateLocal) { TOLOG(QObject::tr("INFO: Upgrade is avaliable, version time: %1").arg(dateUpgrade.toString())); Q_EMIT checkFinished(true); } else { TOLOG(QObject::tr("INFO: Local version is up to date")); Q_EMIT checkFinished(false); } } else { TOLOG(QObject::tr("ERROR: Check upgrade failed")); Q_EMIT checkFinished(false); } }
QUrl ImdbParser::Parse( const QByteArray& data ) { DebugPrintFunc( "ImdbParser::Parse", data.size() ); QString foundedPage( data ); RegExpTools::SimplifyText( foundedPage ); QRegExp reRedirect( "class=\"number\">1.</td><td class=\"title\"><a href=\"(.*)\">"); QString redirectUrl( RegExpTools::ParseItem( foundedPage, reRedirect ) ); QUrl posterUrl; if( !redirectUrl.isEmpty() ) { redirectUrl = "http://www.imdb.com" + redirectUrl; QString str( request.runSync( QUrl( redirectUrl ) ) ); RegExpTools::SimplifyText( str ); DebugPrint( QString( "Simpified to: %1 bytes" ).arg( str.size() ) ); // Title QRegExp reTitle( "h1 itemprop=\"name\".*>(.*)<span" ); film.SetColumnData( FilmItem::TitleColumn, RegExpTools::ParseItem( str, reTitle ) ); // Original title QRegExp reOriginalTitle( "div class=\"originalTitle\">(.*)<span" ); film.SetColumnData( FilmItem::OriginalTitleColumn, RegExpTools::ParseItem( str, reOriginalTitle ) ); // Tagline QRegExp reTagline( "Taglines:</h4>(.*)<" ); film.SetColumnData( FilmItem::TaglineColumn, RegExpTools::ParseItem( str, reTagline ) ); // Year QRegExp reYear( "Release Date:</h4>.*([0-9]{4})" ); film.SetColumnData( FilmItem::YearColumn, RegExpTools::ParseItem( str, reYear ).toInt() ); // Budget QRegExp reBudget( "Budget:</h4> \\$(.*)<span" ); film.SetColumnData( FilmItem::BudgetColumn, RegExpTools::ParseItem( str, reBudget ).replace( " ", "" ).toDouble() ); // Rating QRegExp reRating( "itemprop=\"ratingValue\">(.*)</span>" ); film.SetColumnData( FilmItem::RatingColumn, RegExpTools::ParseItem( str, reRating ).replace( ",", "." ).toDouble() ); // Country QRegExp reCountryList( "Countr.*</h4>(.*)</div>" ); QRegExp reCountry( "href=\"/country/.*>(.*)</a>" ); film.SetColumnData( FilmItem::CountryColumn, RegExpTools::ParseList( str, reCountryList, reCountry ) ); // Genre QRegExp reGenreList( "Genres:</h4>(.*)</div>" ); QRegExp reGenre( "href=\"/genre/.*>(.*)</a>" ); film.SetColumnData( FilmItem::GenreColumn, RegExpTools::ParseList( str, reGenreList, reGenre ) ); // Description QRegExp reDescription( "Storyline</h2><.*><p>(.*)<em class=\"nobr\">" ); film.SetColumnData( FilmItem::DescriptionColumn, RegExpTools::ParseItem( str, reDescription ).replace( "<br><br>", "<br>\n" ) ); // Advanced information QRegExp reName( "itemprop=\"name\">(.*)</span>" ); if( AlexandraSettings::GetInstance()->GetParsersLoadAdvancedInfo() ) { QString str( request.runSync( QUrl( redirectUrl + "fullcredits" ) ) ); RegExpTools::SimplifyText( str ); DebugPrint( QString( "Simpified to: %1 bytes" ).arg( str.size() ) ); // Starring QRegExp reStarringList( "Cast <span>(.*)Produced by" ); film.SetColumnData( FilmItem::StarringColumn, RegExpTools::ParseList( str, reStarringList, reName, 20 ) ); // 20 first actors // Director QRegExp reDirectorList( "Directed by(.*)Writing Credits" ); reName = QRegExp( "href=\"/name/.*>(.*)</a>" ); film.SetColumnData( FilmItem::DirectorColumn, RegExpTools::ParseList( str, reDirectorList, reName, 10 ) ); // 10 first directors // Screenwriter QRegExp reScreenwriterList( "Writing Credits(.*)Cast" ); film.SetColumnData( FilmItem::ScreenwriterColumn, RegExpTools::ParseList( str, reScreenwriterList, reName, 10 ) ); // 10 first writers // Producer QRegExp reProducerList( "Produced by(.*)Music by" ); film.SetColumnData( FilmItem::ProducerColumn, RegExpTools::ParseList( str, reProducerList, reName, 10 ) ); // 10 first producers // Composer QRegExp reComposerList( "Music by(.*)Film Editing by" ); film.SetColumnData( FilmItem::ComposerColumn, RegExpTools::ParseList( str, reComposerList, reName ) ); } else { // Starring QRegExp reStarringList( "Cast</h2>(.*)</table>" ); film.SetColumnData( FilmItem::StarringColumn, RegExpTools::ParseList( str, reStarringList, reName ) ); // Director QRegExp reDirectorList( "Director.*</h4>(.*)</div>" ); QRegExp reName( "itemprop=\"name\">(.*)</span>" ); film.SetColumnData( FilmItem::DirectorColumn, RegExpTools::ParseList( str, reDirectorList, reName ) ); // Screenwriter QRegExp reScreenwriterList( "Writer.*</h4>(.*)</div>" ); film.SetColumnData( FilmItem::ScreenwriterColumn, RegExpTools::ParseList( str, reScreenwriterList, reName ) ); } // Poster if( AlexandraSettings::GetInstance()->GetParsersLoadBigPoster() ) { QRegExp rePoster( "div class=\"poster\"><a href=\"(.*)\"" ); QString s = QString( request.runSync( QUrl( "http://www.imdb.com" + RegExpTools::ParseItem( str, rePoster ) ) ) ); RegExpTools::SimplifyText( s ); DebugPrint( QString( "Simpified to: %1 bytes" ).arg( s.size() ) ); rePoster = QRegExp( "id=\"primary-img\".*src=\"(.*)\"" ); posterUrl = RegExpTools::ParseItem( s, rePoster ); } if( posterUrl.isEmpty() ) // Small poster { QRegExp rePoster( "div class=\"poster\"><.*><img.*src=\"(.*)\"" ); posterUrl = RegExpTools::ParseItem( str, rePoster ); } DebugPrint( "Text parsed!" ); emit Loaded( film, posterUrl ); } else { emit Error( "Movie not found!" ); } return( posterUrl ); }
// // There have been problems with the finish-signal coming from the networkmanager. // To avoid that, the reply-signals were connected and the data is taken from the // sender() method. // void ownCloudInfo::slotReplyFinished() { QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender()); if( ! reply ) { qDebug() << "ownCloudInfo: Reply empty!"; return; } // Detect redirect url QVariant possibleRedirUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); /* We'll deduct if the redirection is valid in the redirectUrl function */ _urlRedirectedTo = redirectUrl( possibleRedirUrl.toUrl(), _urlRedirectedTo ); if(!_urlRedirectedTo.isEmpty()) { QString configHandle; qDebug() << "Redirected to " << possibleRedirUrl; // We'll do another request to the redirection url. // an empty config handle is ok for the default config. if( _configHandleMap.contains(reply) ) { configHandle = _configHandleMap[reply]; qDebug() << "Redirect: Have a custom config handle: " << configHandle; } QString path = _directories[reply]; qDebug() << "This path was redirected: " << path; MirallConfigFile cfgFile( configHandle ); QString newUrl = _urlRedirectedTo.toString(); if( newUrl.endsWith( path )) { // cut off the trailing path newUrl.chop( path.length() ); cfgFile.setOwnCloudUrl( _connection, newUrl ); qDebug() << "Update the config file url to " << newUrl; getRequest( path, false ); // FIXME: Redirect for webdav! reply->deleteLater(); return; } else { qDebug() << "WRN: Path is not part of the redirect URL. NO redirect."; } } _urlRedirectedTo.clear(); // TODO: check if this is always the correct encoding const QString version = QString::fromUtf8( reply->readAll() ); const QString url = reply->url().toString(); QString plainUrl(url); plainUrl.remove( QLatin1String("/status.php")); QString info( version ); if( url.endsWith( QLatin1String("status.php")) ) { // it was a call to status.php if( reply->error() == QNetworkReply::NoError && info.isEmpty() ) { // This seems to be a bit strange behaviour of QNetworkAccessManager. // It calls the finised slot multiple times but only the first read wins. // That happend when the code connected the finished signal of the manager. // It did not happen when the code connected to the reply finish signal. qDebug() << "WRN: NetworkReply with not content but also no error! " << reply; reply->deleteLater(); return; } qDebug() << "status.php returns: " << info << " " << reply->error() << " Reply: " << reply; if( info.contains(QLatin1String("installed")) && info.contains(QLatin1String("version")) && info.contains(QLatin1String("versionstring")) ) { info.remove(0,1); // remove first char which is a "{" info.remove(-1,1); // remove the last char which is a "}" QStringList li = info.split( QLatin1Char(',') ); QString versionStr; QString version; QString edition; foreach ( const QString& infoString, li ) { QStringList touple = infoString.split( QLatin1Char(':')); QString key = touple[0]; key.remove(QLatin1Char('"')); QString val = touple[1]; val.remove(QLatin1Char('"')); if( key == QLatin1String("versionstring") ) { // get the versionstring out. versionStr = val; } else if( key == QLatin1String( "version") ) { // get version out version = val; } else if( key == QLatin1String( "edition") ) { // get version out edition = val; } else { qDebug() << "Unknown info from ownCloud status.php: "<< key << "=" << val; } } emit ownCloudInfoFound( plainUrl, versionStr, version, edition ); } else {
void Pulsars::downloadComplete(QNetworkReply *reply) { if (reply == Q_NULLPTR) return; disconnect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(downloadComplete(QNetworkReply*))); #if QT_VERSION < 0x050600 int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (statusCode == 301 || statusCode == 302 || statusCode == 307) { QUrl rawUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); QUrl redirectUrl(rawUrl.toString(QUrl::RemoveQuery)); qDebug() << "[Pulsars] The query has been redirected to" << redirectUrl.toString(); updateUrl = redirectUrl.toString(); conf->setValue("Pulsars/url", updateUrl); reply->deleteLater(); downloadReply = Q_NULLPTR; startDownload(redirectUrl.toString()); return; } #endif deleteDownloadProgressBar(); if (reply->error() || reply->bytesAvailable()==0) { qWarning() << "[Pulsars] Download error: While trying to access" << reply->url().toString() << "the following error occured:" << reply->errorString(); reply->deleteLater(); downloadReply = Q_NULLPTR; return; } // download completed successfully. try { QString jsonFilePath = StelFileMgr::findFile("modules/Pulsars", StelFileMgr::Flags(StelFileMgr::Writable|StelFileMgr::Directory)) + "/pulsars.json"; QFile jsonFile(jsonFilePath); if (jsonFile.exists()) jsonFile.remove(); if (jsonFile.open(QIODevice::WriteOnly | QIODevice::Text)) { jsonFile.write(reply->readAll()); jsonFile.close(); } updateState = Pulsars::CompleteUpdates; lastUpdate = QDateTime::currentDateTime(); conf->setValue("Pulsars/last_update", lastUpdate.toString(Qt::ISODate)); } catch (std::runtime_error &e) { qWarning() << "[Pulsars] Cannot write JSON data to file:" << e.what(); updateState = Pulsars::DownloadError; } emit(updateStateChanged(updateState)); emit(jsonUpdateComplete()); reply->deleteLater(); downloadReply = Q_NULLPTR; readJsonFile(); }