Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index d45cdaae73337a466a57500d384aa5f935f24aee..ff52fb7d07d9514ef2a137df1dd82a5a4c385429 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -150,6 +150,7 @@ |
#include "net/base/net_errors.h" |
#include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
#include "net/http/http_util.h" |
+#include "storage/common/data_element.h" |
#include "third_party/WebKit/public/platform/URLConversion.h" |
#include "third_party/WebKit/public/platform/WebCachePolicy.h" |
#include "third_party/WebKit/public/platform/WebData.h" |
@@ -759,6 +760,36 @@ bool IsContentWithCertificateErrorsRelevantToUI( |
ssl_status.connection_status); |
} |
+WebHTTPBody CreateWebHttpBodyFromResourceRequestBody( |
+ const scoped_refptr<ResourceRequestBody> body) { |
+ WebHTTPBody result; |
+ result.initialize(); |
+ for (const ResourceRequestBody::Element& elem : *body->elements()) { |
+ switch (elem.type()) { |
+ case ResourceRequestBody::Element::TYPE_BYTES: |
+ result.appendData(WebData(elem.bytes(), elem.length())); |
+ break; |
+ case ResourceRequestBody::Element::TYPE_FILE: |
+ result.appendFileRange(WebString::fromUTF8(elem.path().AsUTF8Unsafe()), |
+ elem.offset(), elem.length(), |
+ elem.expected_modification_time().ToDoubleT()); |
+ break; |
+ case ResourceRequestBody::Element::TYPE_FILE_FILESYSTEM: |
+ result.appendFileSystemURLRange( |
+ elem.filesystem_url(), elem.offset(), elem.length(), |
+ elem.expected_modification_time().ToDoubleT()); |
+ break; |
+ case ResourceRequestBody::Element::TYPE_BLOB: |
+ result.appendBlob(WebString::fromUTF8(elem.blob_uuid())); |
+ break; |
+ default: |
+ NOTIMPLEMENTED(); |
+ break; |
+ } |
+ } |
+ return result; |
+} |
+ |
#if defined(OS_ANDROID) |
// Returns true if WMPI should be used for playback, false otherwise. |
// |
@@ -5399,16 +5430,8 @@ void RenderFrameImpl::NavigateInternal( |
if (common_params.method == "POST" && !browser_side_navigation) { |
// Set post data. |
- WebHTTPBody http_body; |
- http_body.initialize(); |
- const char* data = nullptr; |
- if (start_params.browser_initiated_post_data.size()) { |
- data = reinterpret_cast<const char*>( |
- &start_params.browser_initiated_post_data.front()); |
- } |
- http_body.appendData( |
- WebData(data, start_params.browser_initiated_post_data.size())); |
- request.setHTTPBody(http_body); |
+ request.setHTTPBody( |
+ CreateWebHttpBodyFromResourceRequestBody(start_params.post_data)); |
} |
// A session history navigation should have been accompanied by state. |