Index: webkit/plugins/ppapi/url_request_info_util.cc |
diff --git a/webkit/plugins/ppapi/url_request_info_util.cc b/webkit/plugins/ppapi/url_request_info_util.cc |
index a99c8f4a4d7adc2a7c2ee31172538930a4af35fc..edf83220dd0ea6fbc57c69cdf98c8da8cf745edb 100644 |
--- a/webkit/plugins/ppapi/url_request_info_util.cc |
+++ b/webkit/plugins/ppapi/url_request_info_util.cc |
@@ -21,7 +21,9 @@ |
#include "webkit/base/file_path_string_conversions.h" |
#include "webkit/glue/weburlrequest_extradata_impl.h" |
#include "webkit/plugins/ppapi/common.h" |
+#include "webkit/plugins/ppapi/host_globals.h" |
#include "webkit/plugins/ppapi/plugin_module.h" |
+#include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
#include "webkit/plugins/ppapi/ppb_file_ref_impl.h" |
#include "webkit/plugins/ppapi/ppb_file_system_impl.h" |
#include "webkit/plugins/ppapi/resource_helper.h" |
@@ -118,11 +120,56 @@ bool EnsureFileRefObjectsPopulated(::ppapi::URLRequestInfoData* data) { |
return true; |
} |
+std::string FilterStringForXRequestedWithValue(const std::string& s) { |
+ std::string rv; |
+ rv.reserve(s.length()); |
+ for (size_t i = 0; i < s.length(); i++) { |
+ char c = s[i]; |
+ // Allow ASCII digits, letters, periods, commas, and underscores. (Ignore |
+ // all other characters.) |
+ if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || |
+ (c >= 'a' && c <= 'z') || (c == '.') || (c == ',') || (c == '_')) |
+ rv.push_back(c); |
+ } |
+ return rv; |
+} |
+ |
+// Makes an appropriate value for the X-Requested-With header. We produce a |
+// user-agent-like string (eating spaces and other undesired characters) like |
+// "ShockwaveFlash/11.5.31.135" from the plugin name and version. |
+std::string MakeXRequestedWithValue(const std::string& name, |
+ const std::string& version) { |
+ std::string rv = FilterStringForXRequestedWithValue(name); |
+ if (rv.empty()) |
+ rv = "unknown_plugin"; |
+ |
+ std::string filtered_version = FilterStringForXRequestedWithValue(version); |
+ if (!filtered_version.empty()) |
+ rv += "/" + filtered_version; |
+ |
+ return rv; |
+} |
+ |
} // namespace |
-bool CreateWebURLRequest(::ppapi::URLRequestInfoData* data, |
+bool CreateWebURLRequest(PP_Instance pp_instance, |
+ ::ppapi::URLRequestInfoData* data, |
WebFrame* frame, |
WebURLRequest* dest) { |
+ std::string name_version; |
+ |
+ // Allow null instances for testing purposes. |
+ if (pp_instance) { |
+ PluginInstance* instance = HostGlobals::Get()->GetInstance(pp_instance); |
+ if (!instance) |
+ return false; |
+ |
+ name_version = MakeXRequestedWithValue(instance->module()->name(), |
+ instance->module()->version()); |
+ } else { |
+ name_version = "internal_testing_only"; |
+ } |
+ |
// In the out-of-process case, we've received the URLRequestInfoData |
// from the untrusted plugin and done no validation on it. We need to be |
// sure it's not being malicious by checking everything for consistency. |
@@ -185,11 +232,11 @@ bool CreateWebURLRequest(::ppapi::URLRequestInfoData* data, |
WebString::fromUTF8(data->custom_content_transfer_encoding)); |
} |
- if (data->has_custom_user_agent) { |
- dest->setExtraData(new webkit_glue::WebURLRequestExtraDataImpl( |
- WebKit::WebReferrerPolicyDefault, // Ignored. |
- WebString::fromUTF8(data->custom_user_agent))); |
- } |
+ dest->setExtraData(new webkit_glue::WebURLRequestExtraDataImpl( |
+ WebKit::WebReferrerPolicyDefault, // Ignored. |
+ data->has_custom_user_agent ? |
+ WebString::fromUTF8(data->custom_user_agent) : WebString(), |
+ WebString::fromUTF8(name_version))); |
return true; |
} |