void AutoConnection::requestFinished(QNetworkReply *reply) { if (status == FinishedWork) return; reply->deleteLater(); if (reply->error() == QNetworkReply::NoError) { requests.remove(reply); mtpBuffer data = HTTPConnection::handleResponse(reply); if (data.size() == 1) { if (status == WaitingBoth) { status = WaitingTcp; } else { emit error(); } } else if (!data.isEmpty()) { if (status == UsingHttp) { receivedQueue.push_back(data); emit receivedData(); } else if (status == WaitingBoth || status == WaitingHttp) { try { auto res_pq = readPQFakeReply(data); const auto &res_pq_data(res_pq.c_resPQ()); if (res_pq_data.vnonce == httpNonce) { if (status == WaitingBoth) { status = HttpReady; httpStartTimer.start(MTPTcpConnectionWaitTimeout); } else { DEBUG_LOG(("Connection Info: HTTP/%1-transport chosen by pq-response, awaited").arg((_flagsHttp & MTPDdcOption::Flag::f_ipv6) ? "IPv6" : "IPv4")); status = UsingHttp; sock.disconnectFromHost(); emit connected(); } } } catch (Exception &e) { DEBUG_LOG(("Connection Error: exception in parsing HTTP fake pq-responce, %1").arg(e.what())); if (status == WaitingBoth) { status = WaitingTcp; } else { emit error(); } } } else if (status == UsingTcp) { DEBUG_LOG(("Connection Info: already using tcp, ignoring http response")); } } } else { if (!requests.remove(reply)) { return; } bool mayBeBadKey = HTTPConnection::handleError(reply) && _sentEncrypted; if (status == WaitingBoth) { status = WaitingTcp; } else if (status == WaitingHttp || status == UsingHttp) { emit error(mayBeBadKey); } else { LOG(("Strange Http Error: status %1").arg(status)); } } }
void AutoConnection::socketPacket(const char *packet, uint32 length) { if (status == FinishedWork) return; mtpBuffer data = AbstractTCPConnection::handleResponse(packet, length); if (data.size() == 1) { if (status == WaitingBoth) { status = WaitingHttp; sock.disconnectFromHost(); } else if (status == HttpReady) { DEBUG_LOG(("Connection Info: HTTP/%1-transport chosen by bad tcp response, ready").arg((_flagsHttp & MTPDdcOption::Flag::f_ipv6) ? "IPv6" : "IPv4")); status = UsingHttp; sock.disconnectFromHost(); emit connected(); } else if (status == WaitingTcp || status == UsingTcp) { bool mayBeBadKey = (data[0] == -410) && _sentEncrypted; emit error(mayBeBadKey); } else { LOG(("Strange Tcp Error; status %1").arg(status)); } } else if (status == UsingTcp) { receivedQueue.push_back(data); emit receivedData(); } else if (status == WaitingBoth || status == WaitingTcp || status == HttpReady) { tcpTimeoutTimer.stop(); try { auto res_pq = readPQFakeReply(data); const auto &res_pq_data(res_pq.c_resPQ()); if (res_pq_data.vnonce == tcpNonce) { DEBUG_LOG(("Connection Info: TCP/%1-transport chosen by pq-response").arg((_flagsTcp & MTPDdcOption::Flag::f_ipv6) ? "IPv6" : "IPv4")); status = UsingTcp; emit connected(); } } catch (Exception &e) { DEBUG_LOG(("Connection Error: exception in parsing TCP fake pq-responce, %1").arg(e.what())); if (status == WaitingBoth) { status = WaitingHttp; sock.disconnectFromHost(); } else if (status == HttpReady) { DEBUG_LOG(("Connection Info: HTTP/%1-transport chosen by bad tcp response, awaited").arg((_flagsHttp & MTPDdcOption::Flag::f_ipv6) ? "IPv6" : "IPv4")); status = UsingHttp; sock.disconnectFromHost(); emit connected(); } else { emit error(); } } } }
void HTTPConnection::requestFinished(QNetworkReply *reply) { if (status == FinishedWork) return; reply->deleteLater(); if (reply->error() == QNetworkReply::NoError) { requests.remove(reply); mtpBuffer data = handleResponse(reply); if (data.size() == 1) { emit error(); } else if (!data.isEmpty()) { if (status == UsingHttp) { receivedQueue.push_back(data); emit receivedData(); } else { try { auto res_pq = readPQFakeReply(data); const auto &res_pq_data(res_pq.c_resPQ()); if (res_pq_data.vnonce == httpNonce) { DEBUG_LOG(("Connection Info: HTTP/%1-transport connected by pq-response").arg((_flags & MTPDdcOption::Flag::f_ipv6) ? "IPv6" : "IPv4")); status = UsingHttp; emit connected(); } } catch (Exception &e) { DEBUG_LOG(("Connection Error: exception in parsing HTTP fake pq-responce, %1").arg(e.what())); emit error(); } } } } else { if (!requests.remove(reply)) { return; } bool mayBeBadKey = handleError(reply) && _sentEncrypted; emit error(mayBeBadKey); } }