В процессе портирования программы 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, но в данном случае такой проверки вполне достаточно.
Скачать сборки а так же исходный код можно на домашней странице программы.