В процессе портирования программы VKMM сделал давно актуальный фикс — ВКонтакте уже довольно давно присылает 302 редирект на страницу ошибки, вместо прямого кода ошибки HTTP 404. С точки зрения QNetworkReply разумеется редирект не считается ошибкой, что приводило к зависаниям стрима, если плейлист был открыт давно (и ссылки протухли).
Обработка редиректа в Qt выполняется достаточно просто:
1. Присоединяемся к QNetworkReply::finished
connect(netReply, &QNetworkReply::finished, this, &mStream::onNetResult);
2. В слоте проверяем код статуса HTTP на редирект:
void mStream::onNetResult()
{
QNetworkReply* reply = qobject_cast(sender());
Q_CHECK_PTR(reply);
if (!reply) return;
switch (reply->error())
{
case QNetworkReply::NoError:
{
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
switch (statusCode) {
case 301:
case 302:
case 307:
qDebug() << "redirected: " << reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
onNetError(QNetworkReply::ContentNotFoundError);
break;
default:
break;
}
} break;
case QNetworkReply::ContentNotFoundError:
// 404 Not found
MSTREAM_DEBUG("Error 404!")
break;
}
}
В идеале конечно надо проверять все коды и содержимое адреса в Location, но в данном случае такой проверки вполне достаточно.
Скачать сборки а так же исходный код можно на домашней странице программы.