summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/renderer_host/resource_dispatcher_host.cc26
-rw-r--r--chrome/common/render_messages.h41
-rw-r--r--chrome/common/resource_dispatcher.cc19
-rw-r--r--webkit/glue/glue_serialize.cc27
-rw-r--r--webkit/glue/resource_handle_impl.cc1
-rw-r--r--webkit/glue/resource_loader_bridge.h5
-rw-r--r--webkit/glue/weburlrequest_impl.cc4
-rw-r--r--webkit/tools/test_shell/simple_resource_loader_bridge.cc7
8 files changed, 101 insertions, 29 deletions
diff --git a/chrome/browser/renderer_host/resource_dispatcher_host.cc b/chrome/browser/renderer_host/resource_dispatcher_host.cc
index e8e8d3b..9d4f7bd 100644
--- a/chrome/browser/renderer_host/resource_dispatcher_host.cc
+++ b/chrome/browser/renderer_host/resource_dispatcher_host.cc
@@ -116,14 +116,16 @@ bool ShouldServiceRequest(ChildProcessInfo::ProcessType process_type,
}
// Check if the renderer is permitted to upload the requested files.
- const std::vector<net::UploadData::Element>& uploads =
- request_data.upload_content;
- std::vector<net::UploadData::Element>::const_iterator iter;
- for (iter = uploads.begin(); iter != uploads.end(); ++iter) {
- if (iter->type() == net::UploadData::TYPE_FILE &&
- !policy->CanUploadFile(process_id, iter->file_path())) {
- NOTREACHED() << "Denied unauthorized upload of " << iter->file_path();
- return false;
+ if (request_data.upload_data) {
+ const std::vector<net::UploadData::Element>& uploads =
+ request_data.upload_data->elements();
+ std::vector<net::UploadData::Element>::const_iterator iter;
+ for (iter = uploads.begin(); iter != uploads.end(); ++iter) {
+ if (iter->type() == net::UploadData::TYPE_FILE &&
+ !policy->CanUploadFile(process_id, iter->file_path())) {
+ NOTREACHED() << "Denied unauthorized upload of " << iter->file_path();
+ return false;
+ }
}
}
@@ -330,11 +332,9 @@ void ResourceDispatcherHost::BeginRequest(
// Set upload data.
uint64 upload_size = 0;
- if (!request_data.upload_content.empty()) {
- scoped_refptr<net::UploadData> upload = new net::UploadData();
- upload->set_elements(request_data.upload_content); // Deep copy.
- request->set_upload(upload);
- upload_size = upload->GetContentLength();
+ if (request_data.upload_data) {
+ request->set_upload(request_data.upload_data);
+ upload_size = request_data.upload_data->GetContentLength();
}
// Install a CrossSiteResourceHandler if this request is coming from a
diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h
index 9c4af43..5f5bb6b 100644
--- a/chrome/common/render_messages.h
+++ b/chrome/common/render_messages.h
@@ -266,8 +266,8 @@ struct ViewHostMsg_Resource_Request {
// Used by plugin->browser requests to get the correct URLRequestContext.
uint32 request_context;
- // Optional upload data (may be empty).
- std::vector<net::UploadData::Element> upload_content;
+ // Optional upload data (may be null).
+ scoped_refptr<net::UploadData> upload_data;
};
// Parameters for a render request.
@@ -1161,6 +1161,39 @@ struct ParamTraits<net::UploadData::Element> {
}
};
+// Traits for net::UploadData.
+template <>
+struct ParamTraits<scoped_refptr<net::UploadData> > {
+ typedef scoped_refptr<net::UploadData> param_type;
+ static void Write(Message* m, const param_type& p) {
+ WriteParam(m, p.get() != NULL);
+ if (p) {
+ WriteParam(m, p->elements());
+ WriteParam(m, p->identifier());
+ }
+ }
+ static bool Read(const Message* m, void** iter, param_type* r) {
+ bool has_object;
+ if (!ReadParam(m, iter, &has_object))
+ return false;
+ if (!has_object)
+ return true;
+ std::vector<net::UploadData::Element> elements;
+ if (!ReadParam(m, iter, &elements))
+ return false;
+ int identifier;
+ if (!ReadParam(m, iter, &identifier))
+ return false;
+ *r = new net::UploadData;
+ (*r)->swap_elements(&elements);
+ (*r)->set_identifier(identifier);
+ return true;
+ }
+ static void Log(const param_type& p, std::wstring* l) {
+ l->append(L"<net::UploadData>");
+ }
+};
+
// Traits for WebKit::WebCache::UsageStats
template <>
struct ParamTraits<WebKit::WebCache::UsageStats> {
@@ -1304,7 +1337,7 @@ struct ParamTraits<ViewHostMsg_Resource_Request> {
WriteParam(m, p.origin_pid);
WriteParam(m, p.resource_type);
WriteParam(m, p.request_context);
- WriteParam(m, p.upload_content);
+ WriteParam(m, p.upload_data);
}
static bool Read(const Message* m, void** iter, param_type* r) {
return
@@ -1319,7 +1352,7 @@ struct ParamTraits<ViewHostMsg_Resource_Request> {
ReadParam(m, iter, &r->origin_pid) &&
ReadParam(m, iter, &r->resource_type) &&
ReadParam(m, iter, &r->request_context) &&
- ReadParam(m, iter, &r->upload_content);
+ ReadParam(m, iter, &r->upload_data);
}
static void Log(const param_type& p, std::wstring* l) {
l->append(L"(");
diff --git a/chrome/common/resource_dispatcher.cc b/chrome/common/resource_dispatcher.cc
index e5c398b..1af4ab1 100644
--- a/chrome/common/resource_dispatcher.cc
+++ b/chrome/common/resource_dispatcher.cc
@@ -61,6 +61,7 @@ class IPCResourceLoaderBridge : public ResourceLoaderBridge {
virtual void AppendDataToUpload(const char* data, int data_len);
virtual void AppendFileRangeToUpload(const std::wstring& path,
uint64 offset, uint64 length);
+ virtual void SetUploadIdentifier(int64 identifier);
virtual bool Start(Peer* peer);
virtual void Cancel();
virtual void SetDefersLoading(bool value);
@@ -147,16 +148,26 @@ void IPCResourceLoaderBridge::AppendDataToUpload(const char* data,
if (data_len == 0)
return;
- request_.upload_content.push_back(net::UploadData::Element());
- request_.upload_content.back().SetToBytes(data, data_len);
+ if (!request_.upload_data)
+ request_.upload_data = new net::UploadData();
+ request_.upload_data->AppendBytes(data, data_len);
}
void IPCResourceLoaderBridge::AppendFileRangeToUpload(
const std::wstring& path, uint64 offset, uint64 length) {
DCHECK(request_id_ == -1) << "request already started";
- request_.upload_content.push_back(net::UploadData::Element());
- request_.upload_content.back().SetToFilePathRange(path, offset, length);
+ if (!request_.upload_data)
+ request_.upload_data = new net::UploadData();
+ request_.upload_data->AppendFileRange(path, offset, length);
+}
+
+void IPCResourceLoaderBridge::SetUploadIdentifier(int64 identifier) {
+ DCHECK(request_id_ == -1) << "request already started";
+
+ if (!request_.upload_data)
+ request_.upload_data = new net::UploadData();
+ request_.upload_data->set_identifier(identifier);
}
// Writes a footer on the message and sends it
diff --git a/webkit/glue/glue_serialize.cc b/webkit/glue/glue_serialize.cc
index ecf6879..15f82c5 100644
--- a/webkit/glue/glue_serialize.cc
+++ b/webkit/glue/glue_serialize.cc
@@ -45,8 +45,9 @@ struct SerializeObject {
// data, but not vice versa.
// 3: Version 2 was broken, it stored number of UChars, not number of bytes.
// This version checks and reads v1 and v2 correctly.
+// 4: Adds support for storing FormData::identifier().
// Should be const, but unit tests may modify it.
-int kVersion = 3;
+int kVersion = 4;
// A bunch of convenience functions to read/write to SerializeObjects.
// The serializers assume the input data is in the correct format and so does
@@ -76,11 +77,21 @@ inline void WriteInteger(int data, SerializeObject* obj) {
}
inline int ReadInteger(const SerializeObject* obj) {
- int tmp;
+ int tmp = 0;
obj->pickle.ReadInt(&obj->iter, &tmp);
return tmp;
}
+inline void WriteInteger64(int64 data, SerializeObject* obj) {
+ obj->pickle.WriteInt64(data);
+}
+
+inline int64 ReadInteger64(const SerializeObject* obj) {
+ int64 tmp = 0;
+ obj->pickle.ReadInt64(&obj->iter, &tmp);
+ return tmp;
+}
+
inline void WriteReal(double data, SerializeObject* obj) {
WriteData(&data, sizeof(double), obj);
}
@@ -124,8 +135,8 @@ inline void WriteString(const String& data, SerializeObject* obj) {
data.length() * sizeof(UChar));
}
break;
- case 3:
- // Version 3 writes <length in bytes><string data>.
+ default:
+ // Version 3+ writes <length in bytes><string data>.
// It uses -1 in the length field to mean String().
if (data.isNull()) {
obj->pickle.WriteInt(-1);
@@ -135,9 +146,6 @@ inline void WriteString(const String& data, SerializeObject* obj) {
data.length() * sizeof(UChar));
}
break;
- default:
- NOTREACHED();
- break;
}
}
@@ -199,6 +207,7 @@ static void WriteFormData(const FormData* form_data, SerializeObject* obj) {
WriteString(e.m_filename, obj);
}
}
+ WriteInteger64(form_data->identifier(), obj);
}
static PassRefPtr<FormData> ReadFormData(const SerializeObject* obj) {
@@ -219,6 +228,8 @@ static PassRefPtr<FormData> ReadFormData(const SerializeObject* obj) {
form_data->appendFile(ReadString(obj));
}
}
+ if (obj->version >= 4)
+ form_data->setIdentifier(ReadInteger64(obj));
return form_data.release();
}
@@ -264,7 +275,7 @@ static PassRefPtr<HistoryItem> ReadHistoryItem(const SerializeObject* obj) {
// See note in WriteHistoryItem. on this.
obj->version = ReadInteger(obj);
- if (obj->version > kVersion)
+ if (obj->version > kVersion || obj->version < 1)
return NULL;
RefPtr<HistoryItem> item = HistoryItem::create();
diff --git a/webkit/glue/resource_handle_impl.cc b/webkit/glue/resource_handle_impl.cc
index 99290d3..fbf6379 100644
--- a/webkit/glue/resource_handle_impl.cc
+++ b/webkit/glue/resource_handle_impl.cc
@@ -451,6 +451,7 @@ bool ResourceHandleInternal::Start(
webkit_glue::StringToStdWString(e.m_filename));
}
}
+ bridge_->SetUploadIdentifier(request_.httpBody()->identifier());
}
if (sync_load_response) {
diff --git a/webkit/glue/resource_loader_bridge.h b/webkit/glue/resource_loader_bridge.h
index 161c237..0740f54 100644
--- a/webkit/glue/resource_loader_bridge.h
+++ b/webkit/glue/resource_loader_bridge.h
@@ -200,6 +200,11 @@ class ResourceLoaderBridge {
virtual void AppendFileRangeToUpload(const std::wstring& file_path,
uint64 offset, uint64 length) = 0;
+ // Call this method before calling Start() to assign an upload identifier to
+ // this request. This is used to enable caching of POST responses. A value
+ // of 0 implies the unspecified identifier.
+ virtual void SetUploadIdentifier(int64 identifier) = 0;
+
// Call this method to initiate the request. If this method succeeds, then
// the peer's methods will be called asynchronously to report various events.
virtual bool Start(Peer* peer) = 0;
diff --git a/webkit/glue/weburlrequest_impl.cc b/webkit/glue/weburlrequest_impl.cc
index 9a06f92..cf30f7e3 100644
--- a/webkit/glue/weburlrequest_impl.cc
+++ b/webkit/glue/weburlrequest_impl.cc
@@ -177,6 +177,8 @@ void WebRequestImpl::GetUploadData(net::UploadData* data) const {
NOTREACHED();
}
}
+
+ data->set_identifier(formdata->identifier());
}
void WebRequestImpl::SetUploadData(const net::UploadData& data)
@@ -199,6 +201,8 @@ void WebRequestImpl::SetUploadData(const net::UploadData& data)
}
}
+ formdata->setIdentifier(data.identifier());
+
request_.resourceRequest().setHTTPBody(formdata);
}
diff --git a/webkit/tools/test_shell/simple_resource_loader_bridge.cc b/webkit/tools/test_shell/simple_resource_loader_bridge.cc
index a714c10..79420ba 100644
--- a/webkit/tools/test_shell/simple_resource_loader_bridge.cc
+++ b/webkit/tools/test_shell/simple_resource_loader_bridge.cc
@@ -464,6 +464,13 @@ class ResourceLoaderBridgeImpl : public ResourceLoaderBridge {
params_->upload->AppendFileRange(file_path, offset, length);
}
+ virtual void SetUploadIdentifier(int64 identifier) {
+ DCHECK(params_.get());
+ if (!params_->upload)
+ params_->upload = new net::UploadData();
+ params_->upload->set_identifier(identifier);
+ }
+
virtual bool Start(Peer* peer) {
DCHECK(!proxy_);