diff options
-rw-r--r-- | chrome/browser/renderer_host/resource_dispatcher_host.cc | 26 | ||||
-rw-r--r-- | chrome/common/render_messages.h | 41 | ||||
-rw-r--r-- | chrome/common/resource_dispatcher.cc | 19 | ||||
-rw-r--r-- | webkit/glue/glue_serialize.cc | 27 | ||||
-rw-r--r-- | webkit/glue/resource_handle_impl.cc | 1 | ||||
-rw-r--r-- | webkit/glue/resource_loader_bridge.h | 5 | ||||
-rw-r--r-- | webkit/glue/weburlrequest_impl.cc | 4 | ||||
-rw-r--r-- | webkit/tools/test_shell/simple_resource_loader_bridge.cc | 7 |
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_); |