HRESULT STDMETHODCALLTYPE ResourceLoadDelegate::willSendRequest( /* [in] */ IWebView* webView, /* [in] */ unsigned long identifier, /* [in] */ IWebURLRequest* request, /* [in] */ IWebURLResponse* redirectResponse, /* [in] */ IWebDataSource* dataSource, /* [retval][out] */ IWebURLRequest **newRequest) { if (!done && gTestRunner->dumpResourceLoadCallbacks()) { printf("%S - willSendRequest %S redirectResponse %S\n", descriptionSuitableForTestResult(identifier).c_str(), descriptionSuitableForTestResult(request).c_str(), descriptionSuitableForTestResult(redirectResponse).c_str()); } if (!done && !gTestRunner->deferMainResourceDataLoad()) { COMPtr<IWebDataSourcePrivate> dataSourcePrivate(Query, dataSource); if (!dataSourcePrivate) return E_FAIL; dataSourcePrivate->setDeferMainResourceDataLoad(FALSE); } if (!done && gTestRunner->willSendRequestReturnsNull()) { *newRequest = 0; return S_OK; } if (!done && gTestRunner->willSendRequestReturnsNullOnRedirect() && redirectResponse) { printf("Returning null for this redirect\n"); *newRequest = 0; return S_OK; } IWebMutableURLRequest* requestCopy = 0; request->mutableCopy(&requestCopy); const set<string>& clearHeaders = gTestRunner->willSendRequestClearHeaders(); for (set<string>::const_iterator header = clearHeaders.begin(); header != clearHeaders.end(); ++header) { BSTR bstrHeader = BSTRFromString(*header); requestCopy->setValue(0, bstrHeader); SysFreeString(bstrHeader); } *newRequest = requestCopy; return S_OK; }
HRESULT ResourceLoadDelegate::willSendRequest(IWebView* webView, unsigned long identifier, IWebURLRequest* request, IWebURLResponse* redirectResponse, IWebDataSource* dataSource, IWebURLRequest** newRequest) { if (!done && gTestRunner->dumpResourceLoadCallbacks()) { printf("%S - willSendRequest %S redirectResponse %S\n", descriptionSuitableForTestResult(identifier).c_str(), descriptionSuitableForTestResult(request).c_str(), descriptionSuitableForTestResult(redirectResponse).c_str()); } if (!done && !gTestRunner->deferMainResourceDataLoad()) { COMPtr<IWebDataSourcePrivate> dataSourcePrivate(Query, dataSource); if (!dataSourcePrivate) { *newRequest = nullptr; return E_FAIL; } dataSourcePrivate->setDeferMainResourceDataLoad(FALSE); } if (!done && gTestRunner->willSendRequestReturnsNull()) { *newRequest = nullptr; return S_OK; } if (!done && gTestRunner->willSendRequestReturnsNullOnRedirect() && redirectResponse) { printf("Returning null for this redirect\n"); *newRequest = nullptr; return S_OK; } _bstr_t urlBstr; if (FAILED(request->URL(&urlBstr.GetBSTR()))) { printf("Request has no URL\n"); *newRequest = nullptr; return E_FAIL; } RetainPtr<CFStringRef> str = adoptCF(CFStringCreateWithCString(0, static_cast<const char*>(urlBstr), kCFStringEncodingWindowsLatin1)); RetainPtr<CFURLRef> url = adoptCF(CFURLCreateWithString(kCFAllocatorDefault, str.get(), nullptr)); if (url) { RetainPtr<CFStringRef> host = adoptCF(CFURLCopyHostName(url.get())); RetainPtr<CFStringRef> scheme = adoptCF(CFURLCopyScheme(url.get())); if (host && ((kCFCompareEqualTo == CFStringCompare(scheme.get(), CFSTR("http"), kCFCompareCaseInsensitive)) || (kCFCompareEqualTo == CFStringCompare(scheme.get(), CFSTR("https"), kCFCompareCaseInsensitive)))) { RetainPtr<CFStringRef> testURL = adoptCF(CFStringCreateWithCString(kCFAllocatorDefault, gTestRunner->testURL().c_str(), kCFStringEncodingWindowsLatin1)); RetainPtr<CFMutableStringRef> lowercaseTestURL = adoptCF(CFStringCreateMutableCopy(kCFAllocatorDefault, CFStringGetLength(testURL.get()), testURL.get())); RetainPtr<CFLocaleRef> locale = CFLocaleCopyCurrent(); CFStringLowercase(lowercaseTestURL.get(), locale.get()); RetainPtr<CFStringRef> testHost; if (CFStringHasPrefix(lowercaseTestURL.get(), CFSTR("http:")) || CFStringHasPrefix(lowercaseTestURL.get(), CFSTR("https:"))) { RetainPtr<CFURLRef> testPathURL = adoptCF(CFURLCreateWithString(kCFAllocatorDefault, lowercaseTestURL.get(), nullptr)); testHost = adoptCF(CFURLCopyHostName(testPathURL.get())); } if (!isLocalhost(host.get()) && !hostIsUsedBySomeTestsToGenerateError(host.get()) && (!testHost || isLocalhost(testHost.get()))) { printf("Blocked access to external URL %s\n", static_cast<const char*>(urlBstr)); *newRequest = nullptr; return S_OK; } } } IWebMutableURLRequest* requestCopy = 0; request->mutableCopy(&requestCopy); const set<string>& clearHeaders = gTestRunner->willSendRequestClearHeaders(); for (set<string>::const_iterator header = clearHeaders.begin(); header != clearHeaders.end(); ++header) { _bstr_t bstrHeader(header->data()); requestCopy->setValue(0, bstrHeader); } *newRequest = requestCopy; return S_OK; }