Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: src/plugin/PluginWbPassThrough.cpp

Issue 5506777797885952: Issue 1530 - Improve detecting of subrequest issued by flash addon (Closed)
Patch Set: Created Nov. 12, 2014, 8:13 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/plugin/PluginWbPassThrough.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/plugin/PluginWbPassThrough.cpp
===================================================================
--- a/src/plugin/PluginWbPassThrough.cpp
+++ b/src/plugin/PluginWbPassThrough.cpp
@@ -13,7 +13,7 @@
namespace
{
- std::string g_blockedByABPPage = "<!DOCTYPE html>"
+ const std::string g_blockedByABPPage = "<!DOCTYPE html>"
Oleksandr 2014/11/13 04:44:42 Unrelated change
sergei 2014/11/13 08:49:32 removed from here
"<html>"
"<body>"
"<!-- blocked by AdblockPlus -->"
@@ -21,20 +21,21 @@
"</html>";
template <class T>
- T ExtractHttpHeader(const T& allHeaders, const T& targetHeaderNameWithColon, const T& delimiter)
+ std::pair<T, bool> ExtractHttpHeader(const T& allHeaders, const T& targetHeaderNameWithColon, const T& delimiter)
Oleksandr 2014/11/13 04:44:42 Unrelated change. Also, I think was good enough as
sergei 2014/11/13 08:49:32 Right, it's not necessary. Reverted.
{
+ std::pair<T, bool> notFoundHeader;
auto targetHeaderBeginsAt = allHeaders.find(targetHeaderNameWithColon);
if (targetHeaderBeginsAt == T::npos)
{
- return T();
+ return notFoundHeader;
}
targetHeaderBeginsAt += targetHeaderNameWithColon.length();
auto targetHeaderEndsAt = allHeaders.find(delimiter, targetHeaderBeginsAt);
if (targetHeaderEndsAt == T::npos)
{
- return T();
+ return notFoundHeader;
}
- return allHeaders.substr(targetHeaderBeginsAt, targetHeaderEndsAt - targetHeaderBeginsAt);
+ return std::make_pair(allHeaders.substr(targetHeaderBeginsAt, targetHeaderEndsAt - targetHeaderBeginsAt), true);
}
std::string ExtractHttpAcceptHeader(IInternetProtocol* internetProtocol)
@@ -61,7 +62,14 @@
{
return "";
}
- return ExtractHttpHeader<std::string>(buf, "Accept:", "\r\n");
+ auto acceptHeader = ExtractHttpHeader<std::string>(buf, "Accept:", "\r\n");
+ return acceptHeader.first;
+ }
+
+ bool IsXmlHttpRequest(const std::wstring& additionalHeaders)
+ {
+ auto requestedWithHeader = ExtractHttpHeader<std::wstring>(additionalHeaders, L"X-Requested-With: ", L"\n");
Oleksandr 2014/11/13 04:44:42 X-Requested-With is only part of the story, I thin
+ return requestedWithHeader.second && TrimString(requestedWithHeader.first) == L"XMLHttpRequest";
}
}
@@ -243,8 +251,16 @@
// returns quite minimal configuration in comparison with the implementation from Microsofts'
// libraries (see grfBINDF and bindInfo.dwOptions). The impl from MS often includes something
// else.
-bool WBPassthruSink::IsFlashRequest()
+bool WBPassthruSink::IsFlashRequest(const wchar_t* const* additionalHeaders)
{
+ if (additionalHeaders && *additionalHeaders)
+ {
+ auto flashVersionHeader = ExtractHttpHeader<std::wstring>(*additionalHeaders, L"x-flash-version: ", L"\n");
+ if (flashVersionHeader.second)
+ {
+ return true;
+ }
+ }
ATL::CComPtr<IBindStatusCallback> bscb;
if (SUCCEEDED(QueryServiceFromClient(&bscb)) && !!bscb)
{
@@ -264,6 +280,10 @@
STDMETHODIMP WBPassthruSink::BeginningTransaction(LPCWSTR szURL, LPCWSTR szHeaders, DWORD dwReserved, LPWSTR* pszAdditionalHeaders)
{
+ if (!szURL || !szHeaders)
+ {
+ return E_POINTER;
+ }
Oleksandr 2014/11/13 04:44:42 Unrelated change.
sergei 2014/11/13 08:49:32 Removed from here.
std::wstring src = szURL;
DEBUG_GENERAL(ToCString(src));
@@ -281,9 +301,9 @@
// There doesn't seem to be any other way to get this header before the request has been made.
HRESULT nativeHr = httpNegotiate ? httpNegotiate->BeginningTransaction(szURL, szHeaders, dwReserved, pszAdditionalHeaders) : S_OK;
- if (*pszAdditionalHeaders != 0)
+ if (pszAdditionalHeaders && *pszAdditionalHeaders)
{
- m_boundDomain = ExtractHttpHeader<std::wstring>(*pszAdditionalHeaders, L"Referer:", L"\n").c_str();
+ m_boundDomain = ExtractHttpHeader<std::wstring>(*pszAdditionalHeaders, L"Referer:", L"\n").first;
}
m_boundDomain = TrimString(m_boundDomain);
CPluginTab* tab = CPluginClass::GetTab(::GetCurrentThreadId());
@@ -306,9 +326,14 @@
}
}
- if (IsFlashRequest())
+ if (IsFlashRequest(pszAdditionalHeaders))
{
- m_contentType = CFilter::EContentType::contentTypeObjectSubrequest;
+ m_contentType = CFilter::EContentType::contentTypeObjectSubrequest;
+ }
+
+ if (pszAdditionalHeaders && IsXmlHttpRequest(*pszAdditionalHeaders))
+ {
+ m_contentType = CFilter::EContentType::contentTypeXmlHttpRequest;
}
m_blockedInTransaction = client->ShouldBlock(szURL, m_contentType, m_boundDomain, /*debug flag but must be set*/true);
« no previous file with comments | « src/plugin/PluginWbPassThrough.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld