// https://github.com/owncloud/core/pull/27473/files
_ocWizard->account()->setServerVersion(serverVersion);
- QString p = url.path();
- if (p.endsWith("/status.php")) {
+ if (url != _ocWizard->account()->url()) {
// We might be redirected, update the account
- QUrl redirectedUrl = url;
- redirectedUrl.setPath(url.path().left(url.path().length() - 11));
- _ocWizard->account()->setUrl(redirectedUrl);
- qCInfo(lcWizard) << " was redirected to" << redirectedUrl.toString();
+ _ocWizard->account()->setUrl(url);
+ qCInfo(lcWizard) << " was redirected to" << url.toString();
}
DetermineAuthTypeJob *job = new DetermineAuthTypeJob(_ocWizard->account(), this);
} else if (verb.isEmpty()) {
qCWarning(lcNetworkJob) << this << "cannot redirect request: could not detect original verb";
} else {
+ emit redirected(_reply, redirectUrl, _redirectCount - 1);
+
// Create the redirected request and send it
qCInfo(lcNetworkJob) << "Redirecting" << verb << requestedUrl << redirectUrl;
resetTimeout();
void networkError(QNetworkReply *reply);
void networkActivity();
+ /** Emitted when a redirect is followed.
+ *
+ * \a reply The "please redirect" reply
+ * \a targetUrl Where to redirect to
+ * \a redirectCount Counts redirect hops, first is 0.
+ */
+ void redirected(QNetworkReply *reply, const QUrl &targetUrl, int redirectCount);
+
protected:
void setupConnections(QNetworkReply *reply);
<< CheckServerJob::versionString(info)
<< "(" << serverVersion << ")";
+ // Update server url in case of redirection
+ if (_account->url() != url) {
+ qCInfo(lcConnectionValidator()) << "status.php was redirected to" << url.toString();
+ _account->setUrl(url);
+ _account->wantsAccountSaved(_account.data());
+ }
+
if (!serverVersion.isEmpty() && !setAndCheckServerVersion(serverVersion)) {
return;
}
CheckServerJob::CheckServerJob(AccountPtr account, QObject *parent)
: AbstractNetworkJob(account, QLatin1String(statusphpC), parent)
, _subdirFallback(false)
+ , _permanentRedirects(0)
{
setIgnoreCredentialFailure(true);
+ connect(this, SIGNAL(redirected(QNetworkReply *, QUrl, int)),
+ SLOT(slotRedirected(QNetworkReply *, QUrl, int)));
}
void CheckServerJob::start()
{
- sendRequest("GET", makeAccountUrl(path()));
+ _serverUrl = account()->url();
+ sendRequest("GET", Utility::concatUrlPath(_serverUrl, path()));
connect(reply(), SIGNAL(metaDataChanged()), this, SLOT(metaDataChangedSlot()));
connect(reply(), SIGNAL(encrypted()), this, SLOT(encryptedSlot()));
AbstractNetworkJob::start();
mergeSslConfigurationForSslButton(reply()->sslConfiguration(), account());
}
+void CheckServerJob::slotRedirected(QNetworkReply *reply, const QUrl &targetUrl, int redirectCount)
+{
+ QByteArray slashStatusPhp("/");
+ slashStatusPhp.append(statusphpC);
+
+ int httpCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+ QString path = targetUrl.path();
+ if ((httpCode == 301 || httpCode == 308) // permanent redirection
+ && redirectCount == _permanentRedirects // don't apply permanent redirects after a temporary one
+ && path.endsWith(slashStatusPhp)) {
+ _serverUrl = targetUrl;
+ _serverUrl.setPath(path.left(path.size() - slashStatusPhp.size()));
+ qCInfo(lcCheckServerJob) << "status.php was permanently redirected to"
+ << targetUrl << "new server url is" << _serverUrl;
+ ++_permanentRedirects;
+ }
+}
+
void CheckServerJob::metaDataChangedSlot()
{
account()->setSslConfiguration(reply()->sslConfiguration());
qCInfo(lcCheckServerJob) << "status.php returns: " << status << " " << reply()->error() << " Reply: " << reply();
if (status.object().contains("installed")) {
- emit instanceFound(reply()->url(), status.object());
+ emit instanceFound(_serverUrl, status.object());
} else {
qCWarning(lcCheckServerJob) << "No proper answer on " << reply()->url();
emit instanceNotFound(reply());
static bool installed(const QJsonObject &info);
signals:
+ /** Emitted when a status.php was successfully read.
+ *
+ * \a url see _serverStatusUrl (does not include "/status.php")
+ * \a info The status.php reply information
+ */
void instanceFound(const QUrl &url, const QJsonObject &info);
/** Emitted on invalid status.php reply.
* \a reply is never null
*/
void instanceNotFound(QNetworkReply *reply);
+
+ /** A timeout occurred.
+ *
+ * \a url The specific url where the timeout happened.
+ */
void timeout(const QUrl &url);
private:
private slots:
virtual void metaDataChangedSlot();
virtual void encryptedSlot();
+ void slotRedirected(QNetworkReply *reply, const QUrl &targetUrl, int redirectCount);
private:
bool _subdirFallback;
+
+ /** The permanent-redirect adjusted account url.
+ *
+ * Note that temporary redirects or a permanent redirect behind a temporary
+ * one do not affect this url.
+ */
+ QUrl _serverUrl;
+
+ /** Keep track of how many permanent redirect were applied. */
+ int _permanentRedirects;
};