Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3421)

Unified Diff: content/renderer/render_view_impl.cc

Issue 11193051: To fix the cross-site post submission bug. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Structure and Tests Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/render_view_impl.cc
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 47656382cd878faa2d2d0e146d5c3e8a25f17a09..a429a80108d0d95614be26837ba6c5bef22b7cac 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -185,6 +185,7 @@
#include "webkit/glue/alt_error_page_resource_fetcher.h"
#include "webkit/glue/dom_operations.h"
#include "webkit/glue/glue_serialize.h"
+#include "webkit/glue/resource_request_body.h"
#include "webkit/glue/web_intent_service_data.h"
#include "webkit/glue/webdropdata.h"
#include "webkit/glue/webkit_constants.h"
@@ -320,6 +321,7 @@ using base::TimeDelta;
using webkit_glue::AltErrorPageResourceFetcher;
using webkit_glue::ResourceFetcher;
+using webkit_glue::ResourceRequestBody;
using webkit_glue::WebPreferences;
using webkit_glue::WebURLResponseExtraDataImpl;
@@ -1132,22 +1134,48 @@ void RenderViewImpl::OnNavigate(const ViewMsg_Navigate_Params& params) {
}
}
- if (params.is_post) {
- request.setHTTPMethod(WebString::fromUTF8("POST"));
-
- // Set post data.
+ // Deal With Cross-Process Post Submission
michaeln 2012/11/05 23:38:29 Since this isn't always for cross-process post han
irobert 2012/11/06 05:39:20 Done.
+ if(params.is_post) {
WebHTTPBody http_body;
http_body.initialize();
- http_body.appendData(WebData(
- reinterpret_cast<const char*>(
- &params.browser_initiated_post_data.front()),
- params.browser_initiated_post_data.size()));
+ const std::vector<ResourceRequestBody::Element>* uploads =
+ params.browser_initiated_post_data->elements();
+ std::vector<ResourceRequestBody::Element>::const_iterator iter;
+ for (iter = uploads->begin(); iter != uploads->end(); ++iter) {
+ switch (iter->type()) {
+ case ResourceRequestBody::Element::TYPE_BYTES: {
+ http_body.appendData(WebData(iter->bytes(),
+ static_cast<int>(iter->length())));
+ break;
+ }
+ case ResourceRequestBody::Element::TYPE_FILE: {
+ http_body.appendFileRange(
+ WebString::fromUTF8(iter->path().value()),
+ static_cast<long long>(iter->offset()),
+ static_cast<long long>(iter->length()),
+ iter->expected_modification_time().ToDoubleT());
+ break;
+ }
+ case ResourceRequestBody::Element::TYPE_FILE_FILESYSTEM: {
+ CHECK(false);
+ break;
+ }
+ case ResourceRequestBody::Element:: TYPE_BLOB: {
+ CHECK(false);
+ break;
+ }
+ default:
+ NOTREACHED();
+ }
+ }
request.setHTTPBody(http_body);
+ request.setHTTPMethod(WebString::fromUTF8("POST"));
michaeln 2012/11/05 23:38:29 If it's OK to assume POST as the method here, grea
irobert 2012/11/06 05:39:20 We can assume this from the original code, this pi
michaeln 2012/11/06 22:18:41 Not sure i follow. If content shows up that looks
irobert 2012/11/06 22:25:45 PUT method submission will not end up in this bloc
+ request.setHTTPHeaderField(
+ WebString::fromUTF8("Content-Type"),
+ WebString::fromUTF8(params.extra_headers));
}
-
main_frame->loadRequest(request);
}
-
// In case LoadRequest failed before DidCreateDataSource was called.
pending_navigation_params_.reset();
}
@@ -1664,6 +1692,22 @@ void RenderViewImpl::OpenURL(WebFrame* frame,
frame->identifier()));
}
+// Handle cross-process Post submit Navigation.
+void RenderViewImpl::OpenPostURL(
+ WebFrame* frame,
+ const GURL& url,
+ const Referrer& referrer,
+ WebNavigationPolicy policy,
+ const ViewMsg_PostRequest_Params& request) {
+ Send(new ViewHostMsg_OpenPostURL(
+ routing_id_,
+ url,
+ referrer,
+ NavigationPolicyToDisposition(policy),
+ frame->identifier(),
+ request));
+}
+
// WebViewDelegate ------------------------------------------------------------
void RenderViewImpl::LoadNavigationErrorPage(
@@ -2727,7 +2771,58 @@ WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation(
if (!net::RegistryControlledDomainService::SameDomainOrHost(frame_url,
url) ||
frame_url.scheme() != url.scheme()) {
- OpenURL(frame, url, referrer, default_policy);
+ WebString method = request.httpMethod();
+ if(method != WebString("POST")) {
+ OpenURL(frame, url, referrer, default_policy);
+ } else {
+ scoped_refptr<ResourceRequestBody> request_body =
+ new ResourceRequestBody();
+ WebHTTPBody body = request.httpBody();
+ WebKit::WebHTTPBody::Element element;
+ for (int i=0; body.elementAt(i, element); i++) {
+ switch (element.type) {
+ case WebHTTPBody::Element::TypeData:
+ if (!element.data.isEmpty())
+ request_body->AppendBytes(
+ element.data.data(), static_cast<int>(element.data.size()));
+ break;
+ case WebHTTPBody::Element::TypeFile: {
+ if (element.fileLength == -1) {
+ request_body->AppendFileRange(
+ FilePath(element.filePath.utf8()),
+ 0, kuint64max, base::Time());
+ } else {
+ request_body->AppendFileRange(
+ FilePath(element.filePath.utf8()),
+ static_cast<uint64>(element.fileStart),
+ static_cast<uint64>(element.fileLength),
+ base::Time::FromDoubleT(element.modificationTime));
+ }
+ break;
+ }
+ case WebHTTPBody::Element::TypeURL: {
+ CHECK(false);
+ break;
+ }
+ case WebHTTPBody::Element::TypeBlob:
+ CHECK(false);
+ break;
+ default:
+ NOTREACHED();
+ }
+ }
+
+ // Extract Header Info.
+ WebString ContentType =
+ request.httpHeaderField(WebString::fromUTF8("Content-Type"));
+ std::string ContentTypeStr (ContentType.utf8().data(),
+ ContentType.utf8().length());
+
+ ViewMsg_PostRequest_Params params;
+ params.extra_header = ContentTypeStr;
+ params.request_body = request_body;
+ OpenPostURL(frame, url, referrer, default_policy, params);
+ }
return WebKit::WebNavigationPolicyIgnore;
}
}
« content/public/common/frame_navigate_params.h ('K') | « content/renderer/render_view_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698