void NetworkJob::handleNotifyDataReceived(const char* buf, size_t len) { // Check for messages out of order or after cancel. if ((!m_isFile && !m_statusReceived) || m_cancelled) return; if (!buf || !len) return; m_dataReceived = true; // Protect against reentrancy. updateDeferLoadingCount(1); if (shouldSendClientData()) { sendResponseIfNeeded(); sendMultipartResponseIfNeeded(); if (isClientAvailable()) { RecursionGuard guard(m_callingClient); m_handle->client()->didReceiveData(m_handle.get(), buf, len, len); } } updateDeferLoadingCount(-1); }
void NetworkJob::handleNotifyClose(int status) { #ifndef NDEBUG m_isRunning = false; #endif if (!m_cancelled) { if (!m_statusReceived) { // Connection failed before sending notifyStatusReceived: use generic NetworkError. notifyStatusReceived(BlackBerry::Platform::FilterStream::StatusNetworkError, 0); } // If an HTTP authentication-enabled request is successful, save // the credentials for later reuse. If the request fails, delete // the saved credentials. if (!isError(m_extendedStatusCode)) storeCredentials(); else if (isUnauthorized(m_extendedStatusCode)) purgeCredentials(); if (shouldNotifyClientFinished()) { if (isRedirect(m_extendedStatusCode) && (m_redirectCount >= s_redirectMaximum)) m_extendedStatusCode = BlackBerry::Platform::FilterStream::StatusTooManyRedirects; sendResponseIfNeeded(); if (isClientAvailable()) { RecursionGuard guard(m_callingClient); if (isError(m_extendedStatusCode) && !m_dataReceived) { String domain = m_extendedStatusCode < 0 ? ResourceError::platformErrorDomain : ResourceError::httpErrorDomain; ResourceError error(domain, m_extendedStatusCode, m_response.url().string(), m_response.httpStatusText()); m_handle->client()->didFail(m_handle.get(), error); } else m_handle->client()->didFinishLoading(m_handle.get(), 0); } } } // Whoever called notifyClose still have a reference to the job, so // schedule the deletion with a timer. m_deleteJobTimer.startOneShot(0); // Detach from the ResourceHandle in any case. m_handle = 0; m_multipartResponse = nullptr; }
void QNetworkReplyHandler::finish() { m_shouldFinish = (m_loadMode != LoadNormal); if (m_shouldFinish) return; sendResponseIfNeeded(); if (!m_resourceHandle) return; ResourceHandleClient* client = m_resourceHandle->client(); if (!client) { m_reply->deleteLater(); m_reply = 0; return; } QNetworkReply* oldReply = m_reply; if (m_redirected) { resetState(); start(); } else if (!m_reply->error() || ignoreHttpError(m_reply, m_responseDataSent)) { client->didFinishLoading(m_resourceHandle); } else { QUrl url = m_reply->url(); int httpStatusCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (httpStatusCode) { ResourceError error("HTTP", httpStatusCode, url.toString(), m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()); client->didFail(m_resourceHandle, error); } else { ResourceError error("QtNetwork", m_reply->error(), url.toString(), m_reply->errorString()); client->didFail(m_resourceHandle, error); } } oldReply->deleteLater(); if (oldReply == m_reply) m_reply = 0; }