PolicyAction FrameLoaderClientBlackBerry::decidePolicyForExternalLoad(const ResourceRequest& request, bool isFragmentScroll) { #if 0 // FIXME: Enable these commented out when WebPageClient::handleStringPattern is implemented // and exposed to client. Before that, don't return PolicyIgnore so we can continue to // create new window and get to dispatchDecidePolicyForNavigationAction() where the client // is given a chance to decide how to handle patterns such as 'mailto:'. const KURL& url = request.url(); String pattern = m_webPagePrivate->findPatternStringForUrl(url); if (!pattern.isEmpty()) { m_webPagePrivate->m_client->handleStringPattern(pattern.characters(), pattern.length()); return PolicyIgnore; } #endif if (m_webPagePrivate->m_webSettings->areLinksHandledExternally() && isMainFrame() && !request.mustHandleInternally() && !isFragmentScroll) { NetworkRequest platformRequest; request.initializePlatformRequest(platformRequest, cookiesEnabled()); if (platformRequest.getTargetType() == NetworkRequest::TargetIsUnknown) platformRequest.setTargetType(isMainFrame() ? NetworkRequest::TargetIsMainFrame : NetworkRequest::TargetIsSubframe); m_webPagePrivate->m_client->handleExternalLink(platformRequest, request.anchorText().characters(), request.anchorText().length(), m_clientRedirectIsPending); return PolicyIgnore; } return PolicyUse; }
void Repository::requestLibraryList(const QUrl& url) const noexcept { NetworkRequest* request = new NetworkRequest(url); request->setHeaderField("Accept", "application/json;charset=UTF-8"); request->setHeaderField("Accept-Charset", "UTF-8"); connect(request, &NetworkRequest::errored, this, &Repository::errorWhileFetchingLibraryList, Qt::QueuedConnection); connect(request, &NetworkRequest::dataReceived, this, &Repository::requestedDataReceived, Qt::QueuedConnection); request->start(); }
void FrameLoaderClientBlackBerry::dispatchWillSendRequest(DocumentLoader* docLoader, long unsigned int, ResourceRequest& request, const ResourceResponse&) { // If the request is being loaded by the provisional document loader, then // it is a new top level request which has not been commited. bool isMainResourceLoad = docLoader && docLoader == docLoader->frameLoader()->provisionalDocumentLoader(); // TargetType for subresource loads should have been set in CachedResource::load(). if (isMainResourceLoad && request.targetType() == ResourceRequest::TargetIsUnspecified) request.setTargetType(isMainFrame() ? ResourceRequest::TargetIsMainFrame : ResourceRequest::TargetIsSubframe); // Any processing which is done for all loads (both main and subresource) should go here. NetworkRequest platformRequest; request.initializePlatformRequest(platformRequest, cookiesEnabled()); m_webPagePrivate->m_client->populateCustomHeaders(platformRequest); const NetworkRequest::HeaderList& headerLists = platformRequest.getHeaderListRef(); for (NetworkRequest::HeaderList::const_iterator it = headerLists.begin(); it != headerLists.end(); ++it) { std::string headerString = it->first; std::string headerValueString = it->second; request.setHTTPHeaderField(String::fromUTF8WithLatin1Fallback(headerString.data(), headerString.length()), String::fromUTF8WithLatin1Fallback(headerValueString.data(), headerValueString.length())); } if (!isMainResourceLoad) { // Do nothing for now. // Any processing which is done only for subresources should go here. return; } // All processing beyond this point is done only for main resource loads. if (m_clientRedirectIsPending && isMainFrame()) { String originalUrl = m_frame->document()->url().string(); String finalUrl = request.url().string(); m_webPagePrivate->m_client->notifyClientRedirect(originalUrl.characters(), originalUrl.length(), finalUrl.characters(), finalUrl.length()); } FrameLoader* loader = m_frame->loader(); ASSERT(loader); if (isBackForwardLoadType(loader->loadType())) { // Do not use the passed DocumentLoader because it is the loader that // will be used for the new request (the DESTINATION of the history // navigation - we want to use the current DocumentLoader to record the // SOURCE). DocumentLoader* docLoader = m_frame->loader()->documentLoader(); ASSERT(docLoader); m_historyNavigationSourceURLs.add(docLoader->url()); m_historyNavigationSourceURLs.add(docLoader->originalURL()); } }
void FrameLoaderClientBlackBerry::dispatchDecidePolicyForNavigationAction(FramePolicyFunction function, const NavigationAction& action, const ResourceRequest& request, PassRefPtr<FormState>) { PolicyAction decision = PolicyIgnore; const KURL& url = request.url(); if (!url.isNull()) { // Fragment scrolls on the same page should always be handled internally. // (Only count as a fragment scroll if we are scrolling to a #fragment url, not back to the top, and reloading // the same url is not a fragment scroll even if it has a #fragment.) const KURL& currentUrl = m_frame->document()->url(); bool isFragmentScroll = url.hasFragmentIdentifier() && url != currentUrl && equalIgnoringFragmentIdentifier(currentUrl, url); decision = decidePolicyForExternalLoad(request, isFragmentScroll); // Let the client have a chance to say whether this navigation should // be ignored or not. NetworkRequest platformRequest; request.initializePlatformRequest(platformRequest, cookiesEnabled()); if (platformRequest.getTargetType() == NetworkRequest::TargetIsUnknown) platformRequest.setTargetType(isMainFrame() ? NetworkRequest::TargetIsMainFrame : NetworkRequest::TargetIsSubframe); if (isMainFrame() && !m_webPagePrivate->m_client->acceptNavigationRequest( platformRequest, BlackBerry::Platform::NavigationType(action.type()))) { if (action.type() == NavigationTypeFormSubmitted || action.type() == NavigationTypeFormResubmitted) m_frame->loader()->resetMultipleFormSubmissionProtection(); if (action.type() == NavigationTypeLinkClicked && url.hasFragmentIdentifier()) { ResourceRequest emptyRequest; m_frame->loader()->activeDocumentLoader()->setLastCheckedRequest(emptyRequest); } decision = PolicyIgnore; } } // If we abort here, dispatchDidCancelClientRedirect will not be called. // So call it by hand. if (decision == PolicyIgnore) dispatchDidCancelClientRedirect(); (m_frame->loader()->policyChecker()->*function)(decision); if (m_webPagePrivate->m_dumpRenderTree) m_webPagePrivate->m_dumpRenderTree->didDecidePolicyForNavigationAction(action, request); }
static void setAuthCredentials(NetworkRequest& platformRequest, const AuthenticationChallenge& challenge) { if (challenge.isNull()) return; Credential credential = challenge.proposedCredential(); const ProtectionSpace& protectionSpace = challenge.protectionSpace(); String username = credential.user(); String password = credential.password(); NetworkRequest::AuthType authType; NetworkRequest::AuthProtocol authProtocol; NetworkRequest::AuthScheme authScheme; protectionSpaceToPlatformAuth(protectionSpace, authType, authProtocol, authScheme); if (authType != NetworkRequest::AuthTypeNone && authProtocol != NetworkRequest::AuthProtocolNone && authScheme != NetworkRequest::AuthSchemeNone) platformRequest.setCredentials(authType, authProtocol, authScheme, username.utf8().data(), password.utf8().data()); }
TEST_P(NetworkRequestTest, testDownload) { const NetworkRequestTestData& data = GetParam(); // start the request NetworkRequest* request = new NetworkRequest(data.url); if (!data.accept.isEmpty()) { request->setHeaderField("Accept", data.accept); } QObject::connect(request, &NetworkRequest::progressState, &mSignalReceiver, &NetworkRequestBaseSignalReceiver::progressState); QObject::connect(request, &NetworkRequest::progressPercent, &mSignalReceiver, &NetworkRequestBaseSignalReceiver::progressPercent); QObject::connect(request, &NetworkRequest::progress, &mSignalReceiver, &NetworkRequestBaseSignalReceiver::progress); QObject::connect(request, &NetworkRequest::aborted, &mSignalReceiver, &NetworkRequestBaseSignalReceiver::aborted); QObject::connect(request, &NetworkRequest::succeeded, &mSignalReceiver, &NetworkRequestBaseSignalReceiver::succeeded); QObject::connect(request, &NetworkRequest::errored, &mSignalReceiver, &NetworkRequestBaseSignalReceiver::errored); QObject::connect(request, &NetworkRequest::finished, &mSignalReceiver, &NetworkRequestBaseSignalReceiver::finished); QObject::connect(request, &NetworkRequest::dataReceived, &mSignalReceiver, &NetworkRequestBaseSignalReceiver::dataReceived); QObject::connect(request, &NetworkRequest::destroyed, &mSignalReceiver, &NetworkRequestBaseSignalReceiver::destroyed); request->start(); // wait until request finished (with timeout) qint64 start = QDateTime::currentDateTime().toMSecsSinceEpoch(); auto currentTime = []() { return QDateTime::currentDateTime().toMSecsSinceEpoch(); }; while ((!mSignalReceiver.mDestroyed) && (currentTime() - start < 30000)) { QThread::msleep(100); qApp->processEvents(); } // check count and parameters of emited signals EXPECT_TRUE(mSignalReceiver.mDestroyed) << "Request timed out!"; EXPECT_GT(mSignalReceiver.mProgressStateCallCount, 0); EXPECT_EQ(mSignalReceiver.mAdvancedProgressCallCount, mSignalReceiver.mSimpleProgressCallCount); EXPECT_EQ(0, mSignalReceiver.mAbortedCallCount); EXPECT_EQ(1, mSignalReceiver.mFinishedCallCount); EXPECT_EQ(0, mSignalReceiver.mFileDownloadedCallCount); EXPECT_EQ(0, mSignalReceiver.mZipFileExtractedCallCount); if (data.success) { EXPECT_GE(mSignalReceiver.mSimpleProgressCallCount, 1); EXPECT_EQ(1, mSignalReceiver.mSucceededCallCount); EXPECT_EQ(0, mSignalReceiver.mErroredCallCount); EXPECT_EQ(1, mSignalReceiver.mDataReceivedCallCount); EXPECT_TRUE(mSignalReceiver.mErrorMessage.isNull()) << qPrintable(mSignalReceiver.mErrorMessage); EXPECT_TRUE(mSignalReceiver.mFinishedSuccess); EXPECT_FALSE(mSignalReceiver.mReceivedData.isEmpty()); } else { EXPECT_GE(mSignalReceiver.mSimpleProgressCallCount, 0); EXPECT_EQ(0, mSignalReceiver.mSucceededCallCount); EXPECT_EQ(1, mSignalReceiver.mErroredCallCount); EXPECT_EQ(0, mSignalReceiver.mDataReceivedCallCount); EXPECT_FALSE(mSignalReceiver.mErrorMessage.isEmpty()) << qPrintable(mSignalReceiver.mErrorMessage); EXPECT_FALSE(mSignalReceiver.mFinishedSuccess); EXPECT_TRUE(mSignalReceiver.mReceivedData.isEmpty()); } EXPECT_TRUE( mSignalReceiver.mReceivedData.trimmed().startsWith(data.contentStart)) << qPrintable(mSignalReceiver.mReceivedData); }
void ResourceRequest::initializePlatformRequest(NetworkRequest& platformRequest, bool cookiesEnabled, bool isInitial, bool isRedirect) const { // If this is the initial load, skip the request body and headers. if (isInitial) platformRequest.setRequestInitial(timeoutInterval()); else { ReadOnlyLatin1String latin1URL(url().string()); ReadOnlyLatin1String latin1HttpMethod(httpMethod()); platformRequest.setRequestUrl(latin1URL.data(), latin1URL.length(), latin1HttpMethod.data(), latin1HttpMethod.length(), platformCachePolicyForRequest(*this), platformTargetTypeForRequest(*this), timeoutInterval()); platformRequest.setConditional(isConditional()); platformRequest.setSuggestedSaveName(suggestedSaveName().utf8().data()); if (httpBody() && !httpBody()->isEmpty()) { const Vector<FormDataElement>& elements = httpBody()->elements(); // Use setData for simple forms because it is slightly more efficient. if (elements.size() == 1 && elements[0].m_type == FormDataElement::data) platformRequest.setData(elements[0].m_data.data(), elements[0].m_data.size()); else { for (unsigned i = 0; i < elements.size(); ++i) { const FormDataElement& element = elements[i]; if (element.m_type == FormDataElement::data) platformRequest.addMultipartData(element.m_data.data(), element.m_data.size()); else if (element.m_type == FormDataElement::encodedFile) platformRequest.addMultipartFilename(element.m_filename.characters(), element.m_filename.length()); #if ENABLE(BLOB) else if (element.m_type == FormDataElement::encodedBlob) { RefPtr<BlobStorageData> blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(KURL(ParsedURLString, element.m_url)); if (blobData) { for (size_t j = 0; j < blobData->items().size(); ++j) { const BlobDataItem& blobItem = blobData->items()[j]; if (blobItem.type == BlobDataItem::Data) platformRequest.addMultipartData(blobItem.data->data() + static_cast<int>(blobItem.offset), static_cast<int>(blobItem.length)); else { ASSERT(blobItem.type == BlobDataItem::File); platformRequest.addMultipartFilename(blobItem.path.characters(), blobItem.path.length(), blobItem.offset, blobItem.length, blobItem.expectedModificationTime); } } } } #endif else ASSERT_NOT_REACHED(); // unknown type } } } // When ResourceRequest is reused by CacheResourceLoader, page refreshing or redirection, its cookies may be dirtied. We won't use these cookies any more. bool cookieHeaderMayBeDirty = isRedirect || cachePolicy() == WebCore::ReloadIgnoringCacheData || cachePolicy() == WebCore::ReturnCacheDataElseLoad; for (HTTPHeaderMap::const_iterator it = httpHeaderFields().begin(); it != httpHeaderFields().end(); ++it) { String key = it->first; String value = it->second; if (!key.isEmpty()) { if (equalIgnoringCase(key, "Cookie")) { // We won't use the old cookies of resourceRequest for new location because these cookies may be changed by redirection. if (cookieHeaderMayBeDirty) continue; // We need to check the encoding and encode the cookie's value using latin1 or utf8 to support unicode data. if (!value.containsOnlyLatin1()) { platformRequest.addHeader("Cookie", value.utf8().data()); continue; } } ReadOnlyLatin1String latin1Key(key); ReadOnlyLatin1String latin1Value(value); platformRequest.addHeader(latin1Key.data(), latin1Key.length(), latin1Value.data(), latin1Value.length()); } } // If request's cookies may be dirty, they must be set again. // If there aren't cookies in the header list, we need trying to add cookies. if (cookiesEnabled && (cookieHeaderMayBeDirty || !httpHeaderFields().contains("Cookie")) && !url().isNull()) { // Prepare a cookie header if there are cookies related to this url. String cookiePairs = cookieManager().getCookie(url(), WithHttpOnlyCookies); if (!cookiePairs.isEmpty()) platformRequest.addHeader("Cookie", cookiePairs.containsOnlyLatin1() ? cookiePairs.latin1().data() : cookiePairs.utf8().data()); } if (!httpHeaderFields().contains("Accept-Language")) platformRequest.addAcceptLanguageHeader(); } }
void ResourceRequest::initializePlatformRequest(NetworkRequest& platformRequest, bool cookiesEnabled, bool isInitial, bool isRedirect) const { // If this is the initial load, skip the request body and headers. if (isInitial) platformRequest.setRequestInitial(timeoutInterval()); else { platformRequest.setRequestUrl(url().string().utf8().data(), httpMethod().latin1().data(), platformCachePolicyForRequest(*this), platformTargetTypeForRequest(*this), timeoutInterval()); platformRequest.setConditional(isConditional()); if (httpBody() && !httpBody()->isEmpty()) { const Vector<FormDataElement>& elements = httpBody()->elements(); // Use setData for simple forms because it is slightly more efficient. if (elements.size() == 1 && elements[0].m_type == FormDataElement::data) platformRequest.setData(elements[0].m_data.data(), elements[0].m_data.size()); else { for (unsigned i = 0; i < elements.size(); ++i) { const FormDataElement& element = elements[i]; if (element.m_type == FormDataElement::data) platformRequest.addMultipartData(element.m_data.data(), element.m_data.size()); else if (element.m_type == FormDataElement::encodedFile) platformRequest.addMultipartFilename(element.m_filename.characters(), element.m_filename.length()); #if ENABLE(BLOB) else if (element.m_type == FormDataElement::encodedBlob) { RefPtr<BlobStorageData> blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(KURL(ParsedURLString, element.m_blobURL)); if (blobData) { for (size_t j = 0; j < blobData->items().size(); ++j) { const BlobDataItem& blobItem = blobData->items()[j]; if (blobItem.type == BlobDataItem::Data) platformRequest.addMultipartData(blobItem.data->data() + static_cast<int>(blobItem.offset), static_cast<int>(blobItem.length)); else { ASSERT(blobItem.type == BlobDataItem::File); platformRequest.addMultipartFilename(blobItem.path.characters(), blobItem.path.length(), blobItem.offset, blobItem.length, blobItem.expectedModificationTime); } } } } #endif else ASSERT_NOT_REACHED(); // unknown type } } } for (HTTPHeaderMap::const_iterator it = httpHeaderFields().begin(); it != httpHeaderFields().end(); ++it) { String key = it->first; String value = it->second; if (!key.isEmpty() && !value.isEmpty()) { // We need to check the encoding and encode the cookie's value using latin1 or utf8 to support unicode characters. if (equalIgnoringCase(key, "Cookie")) platformRequest.addHeader(key.latin1().data(), value.containsOnlyLatin1() ? value.latin1().data() : value.utf8().data()); else platformRequest.addHeader(key.latin1().data(), value.latin1().data()); } } // Redirection's response may contain new cookies, so add cookies again. // If there aren't cookies in the header list, we need trying to add cookies. if (cookiesEnabled && (isRedirect || !httpHeaderFields().contains("Cookie")) && !url().isNull()) { // Prepare a cookie header if there are cookies related to this url. String cookiePairs = cookieManager().getCookie(url(), WithHttpOnlyCookies); if (!cookiePairs.isEmpty()) platformRequest.addHeader("Cookie", cookiePairs.containsOnlyLatin1() ? cookiePairs.latin1().data() : cookiePairs.utf8().data()); } // Locale has the form "en-US". Construct accept language like "en-US, en;q=0.8". std::string locale = BlackBerry::Platform::Client::get()->getLocale(); // POSIX locale has '_' instead of '-'. // Replace to conform to HTTP spec. size_t underscore = locale.find('_'); if (underscore != std::string::npos) locale.replace(underscore, 1, "-"); std::string acceptLanguage = locale + ", " + locale.substr(0, 2) + ";q=0.8"; platformRequest.addHeader("Accept-Language", acceptLanguage.c_str()); } }
void ResourceRequest::initializePlatformRequest(NetworkRequest& platformRequest, bool cookiesEnabled, bool isInitial, bool isRedirect) const { // If this is the initial load, skip the request body and headers. if (isInitial) platformRequest.setRequestInitial(timeoutInterval()); else { platformRequest.setRequestUrl(url().string(), httpMethod(), platformCachePolicyForRequest(*this), platformTargetTypeForRequest(*this), timeoutInterval()); platformRequest.setConditional(isConditional()); platformRequest.setSuggestedSaveName(suggestedSaveName()); if (httpBody() && !httpBody()->isEmpty()) { RefPtr<FormData> formData = httpBody(); #if ENABLE(BLOB) formData = formData->resolveBlobReferences(); #endif const Vector<FormDataElement>& elements = formData->elements(); // Use setData for simple forms because it is slightly more efficient. if (elements.size() == 1 && elements[0].m_type == FormDataElement::data) platformRequest.setData(elements[0].m_data.data(), elements[0].m_data.size()); else { for (unsigned i = 0; i < elements.size(); ++i) { const FormDataElement& element = elements[i]; if (element.m_type == FormDataElement::data) platformRequest.addMultipartData(element.m_data.data(), element.m_data.size()); else if (element.m_type == FormDataElement::encodedFile) platformRequest.addMultipartFilename(element.m_filename.characters(), element.m_filename.length()); else ASSERT_NOT_REACHED(); // Blobs should be resolved at this point. } } } // When ResourceRequest is reused by CacheResourceLoader, page refreshing or redirection, its cookies may be dirtied. We won't use these cookies any more. bool cookieHeaderMayBeDirty = isRedirect || cachePolicy() == WebCore::ReloadIgnoringCacheData || cachePolicy() == WebCore::ReturnCacheDataElseLoad; for (HTTPHeaderMap::const_iterator it = httpHeaderFields().begin(); it != httpHeaderFields().end(); ++it) { String key = it->key; String value = it->value; if (!key.isEmpty()) { if (equalIgnoringCase(key, "Cookie")) { // We won't use the old cookies of resourceRequest for new location because these cookies may be changed by redirection. if (cookieHeaderMayBeDirty) continue; // We need to check the encoding and encode the cookie's value using latin1 or utf8 to support unicode data. if (!value.containsOnlyLatin1()) { platformRequest.addHeader("Cookie", value.utf8().data()); continue; } } platformRequest.addHeader(key, value); } } // If request's cookies may be dirty, they must be set again. // If there aren't cookies in the header list, we need trying to add cookies. if (cookiesEnabled && (cookieHeaderMayBeDirty || !httpHeaderFields().contains("Cookie")) && !url().isNull()) { // Prepare a cookie header if there are cookies related to this url. String cookiePairs = cookieManager().getCookie(url(), WithHttpOnlyCookies); if (!cookiePairs.isEmpty()) platformRequest.addHeader("Cookie", cookiePairs.containsOnlyLatin1() ? cookiePairs.latin1().data() : cookiePairs.utf8().data()); } if (!httpHeaderFields().contains("Accept-Language")) platformRequest.addAcceptLanguageHeader(); } }