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

Unified Diff: src/plugin/PluginWbPassThrough.cpp

Issue 5921969115496448: Issue 1115 - Some yahoo page not correctly shown on IE8 when ABP enabled (Closed)
Patch Set: x Created Jan. 29, 2015, 3:23 p.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
Index: src/plugin/PluginWbPassThrough.cpp
diff --git a/src/plugin/PluginWbPassThrough.cpp b/src/plugin/PluginWbPassThrough.cpp
index 9069adf80a833d0bde42587ce55df2b2b75e0065..24d9c9fecdb197414f58877110e6f82544567142 100644
--- a/src/plugin/PluginWbPassThrough.cpp
+++ b/src/plugin/PluginWbPassThrough.cpp
@@ -87,6 +87,40 @@ namespace
auto requestedWithHeader = ExtractHttpHeader<std::wstring>(additionalHeaders, L"X-Requested-With:", L"\n");
return TrimString(requestedWithHeader) == L"XMLHttpRequest";
}
+
+ int GetContentTypeFromString(const std::wstring& value)
+ {
+ auto lastDotIt = std::find(value.rbegin(), value.rend(), L'.').base();
Eric 2015/02/02 18:41:58 It's much clearer just to call 'rfind': auto
sergei 2015/02/12 14:44:06 Good point! fixed
+ if (lastDotIt == value.end())
+ return CFilter::contentTypeAny;
+
+ std::wstring ext(lastDotIt, value.end());
+ if (ext == L"jpg" || ext == L"gif" || ext == L"png" || ext == L"jpeg")
+ {
+ return CFilter::contentTypeImage;
+ }
+ else if (ext == L"css")
+ {
+ return CFilter::contentTypeStyleSheet;
+ }
+ else if (ext == L"js")
+ {
+ return CFilter::contentTypeScript;
+ }
+ else if (ext == L"xml")
+ {
+ return CFilter::contentTypeXmlHttpRequest;
+ }
+ else if (ext == L"swf")
+ {
+ return CFilter::contentTypeObject;
+ }
+ else if (ext == L"jsp" || ext == L"php" || ext == L"html")
+ {
+ return CFilter::contentTypeSubdocument;
+ }
+ return CFilter::contentTypeAny;
+ }
}
WBPassthruSink::WBPassthruSink()
@@ -129,44 +163,39 @@ int WBPassthruSink::GetContentTypeFromMimeType(const CString& mimeType)
int WBPassthruSink::GetContentTypeFromURL(const std::wstring& src)
{
- CString srcLegacy = ToCString(src);
- CString srcExt = srcLegacy;
-
- int pos = 0;
- if ((pos = srcLegacy.Find('?')) > 0)
- {
- srcExt = srcLegacy.Left(pos);
- }
-
- int lastDotIndex = srcExt.ReverseFind('.');
- if (lastDotIndex < 0)
- return CFilter::contentTypeAny;
- CString ext = srcExt.Mid(lastDotIndex);
- if (ext == L".jpg" || ext == L".gif" || ext == L".png" || ext == L".jpeg")
- {
- return CFilter::contentTypeImage;
- }
- else if (ext == L".css")
- {
- return CFilter::contentTypeStyleSheet;
- }
- else if (ext.Right(3) == L".js")
- {
- return CFilter::contentTypeScript;
- }
- else if (ext == L".xml")
+ // http://en.wikipedia.org/wiki/URI_scheme
+ auto schemeAndHierarchicalPartEndsAt = src.find(L'?');
+ if (schemeAndHierarchicalPartEndsAt == std::wstring::npos)
{
- return CFilter::contentTypeXmlHttpRequest;
+ schemeAndHierarchicalPartEndsAt = src.find(L'#');
}
- else if (ext == L".swf")
+ std::wstring schemeAndHierarchicalPart = src.substr(0, schemeAndHierarchicalPartEndsAt);
+ auto contentType = GetContentTypeFromString(schemeAndHierarchicalPart);
+ if (contentType != CFilter::contentTypeAny)
{
Eric 2015/02/02 18:41:58 As it's already been mentioned in the comments, it
sergei 2015/02/12 14:44:06 Actually, I'm not sure that it's a problem of only
- return CFilter::contentTypeObject;
+ return contentType;
}
- else if (ext == L".jsp" || ext == L".php" || ext == L".html")
- {
- return CFilter::contentTypeSubdocument;
- }
- return CFilter::contentTypeAny;
+
+ ProcessQueryStringParameters(GetQueryString(src),
+ [&contentType](const std::wstring& name, const std::wstring& value)->bool
+ {
+ if (!value.empty())
+ {
+ contentType = GetContentTypeFromString(value);
+ if (contentType != CFilter::contentTypeAny)
+ {
+ return false;
+ }
+ }
+ contentType = GetContentTypeFromString(name);
+ if (contentType != CFilter::contentTypeAny)
+ {
+ return false;
+ }
+ return true;
+ });
+
+ return contentType;
}
int WBPassthruSink::GetContentType(const CString& mimeType, const std::wstring& domain, const std::wstring& src)

Powered by Google App Engine
This is Rietveld