// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/common/resource_messages.h" #include "net/base/load_timing_info.h" #include "net/http/http_response_headers.h" namespace IPC { void ParamTraits >::Write( Message* m, const param_type& p) { WriteParam(m, p.get() != NULL); if (p.get()) { // Do not disclose Set-Cookie headers over IPC. p->Persist(m, net::HttpResponseHeaders::PERSIST_SANS_COOKIES); } } bool ParamTraits >::Read( const Message* m, PickleIterator* iter, param_type* r) { bool has_object; if (!ReadParam(m, iter, &has_object)) return false; if (has_object) *r = new net::HttpResponseHeaders(*m, iter); return true; } void ParamTraits >::Log( const param_type& p, std::string* l) { l->append(""); } void ParamTraits::Write( Message* m, const param_type& p) { WriteParam(m, static_cast(p.type())); switch (p.type()) { case webkit_common::DataElement::TYPE_BYTES: { m->WriteData(p.bytes(), static_cast(p.length())); break; } case webkit_common::DataElement::TYPE_FILE: { WriteParam(m, p.path()); WriteParam(m, p.offset()); WriteParam(m, p.length()); WriteParam(m, p.expected_modification_time()); break; } case webkit_common::DataElement::TYPE_FILE_FILESYSTEM: { WriteParam(m, p.filesystem_url()); WriteParam(m, p.offset()); WriteParam(m, p.length()); WriteParam(m, p.expected_modification_time()); break; } default: { DCHECK(p.type() == webkit_common::DataElement::TYPE_BLOB); WriteParam(m, p.blob_uuid()); WriteParam(m, p.blob_url()); WriteParam(m, p.offset()); WriteParam(m, p.length()); break; } } } bool ParamTraits::Read( const Message* m, PickleIterator* iter, param_type* r) { int type; if (!ReadParam(m, iter, &type)) return false; switch (type) { case webkit_common::DataElement::TYPE_BYTES: { const char* data; int len; if (!m->ReadData(iter, &data, &len)) return false; r->SetToBytes(data, len); break; } case webkit_common::DataElement::TYPE_FILE: { base::FilePath file_path; uint64 offset, length; base::Time expected_modification_time; if (!ReadParam(m, iter, &file_path)) return false; if (!ReadParam(m, iter, &offset)) return false; if (!ReadParam(m, iter, &length)) return false; if (!ReadParam(m, iter, &expected_modification_time)) return false; r->SetToFilePathRange(file_path, offset, length, expected_modification_time); break; } case webkit_common::DataElement::TYPE_FILE_FILESYSTEM: { GURL file_system_url; uint64 offset, length; base::Time expected_modification_time; if (!ReadParam(m, iter, &file_system_url)) return false; if (!ReadParam(m, iter, &offset)) return false; if (!ReadParam(m, iter, &length)) return false; if (!ReadParam(m, iter, &expected_modification_time)) return false; r->SetToFileSystemUrlRange(file_system_url, offset, length, expected_modification_time); break; } default: { DCHECK(type == webkit_common::DataElement::TYPE_BLOB); std::string blob_uuid; GURL blob_url; uint64 offset, length; if (!ReadParam(m, iter, &blob_uuid)) return false; if (!ReadParam(m, iter, &blob_url)) return false; if (!ReadParam(m, iter, &offset)) return false; if (!ReadParam(m, iter, &length)) return false; if (!blob_uuid.empty()) r->SetToBlobRange(blob_uuid, offset, length); else r->SetToBlobUrlRange(blob_url, offset, length); break; } } return true; } void ParamTraits::Log( const param_type& p, std::string* l) { l->append(""); } void ParamTraits >::Write( Message* m, const param_type& p) { WriteParam(m, p.get() != NULL); if (p.get()) { WriteParam(m, p->http_status_code); WriteParam(m, p->http_status_text); WriteParam(m, p->request_headers); WriteParam(m, p->response_headers); WriteParam(m, p->request_headers_text); WriteParam(m, p->response_headers_text); } } bool ParamTraits >::Read( const Message* m, PickleIterator* iter, param_type* r) { bool has_object; if (!ReadParam(m, iter, &has_object)) return false; if (!has_object) return true; *r = new webkit_glue::ResourceDevToolsInfo(); return ReadParam(m, iter, &(*r)->http_status_code) && ReadParam(m, iter, &(*r)->http_status_text) && ReadParam(m, iter, &(*r)->request_headers) && ReadParam(m, iter, &(*r)->response_headers) && ReadParam(m, iter, &(*r)->request_headers_text) && ReadParam(m, iter, &(*r)->response_headers_text); } void ParamTraits >::Log( const param_type& p, std::string* l) { l->append("("); if (p.get()) { LogParam(p->request_headers, l); l->append(", "); LogParam(p->response_headers, l); } l->append(")"); } void ParamTraits::Write( Message* m, const param_type& p) { WriteParam(m, p.socket_log_id); WriteParam(m, p.socket_reused); WriteParam(m, p.request_start_time.is_null()); if (p.request_start_time.is_null()) return; WriteParam(m, p.request_start_time); WriteParam(m, p.request_start); WriteParam(m, p.proxy_resolve_start); WriteParam(m, p.proxy_resolve_end); WriteParam(m, p.connect_timing.dns_start); WriteParam(m, p.connect_timing.dns_end); WriteParam(m, p.connect_timing.connect_start); WriteParam(m, p.connect_timing.connect_end); WriteParam(m, p.connect_timing.ssl_start); WriteParam(m, p.connect_timing.ssl_end); WriteParam(m, p.send_start); WriteParam(m, p.send_end); WriteParam(m, p.receive_headers_end); } bool ParamTraits::Read( const Message* m, PickleIterator* iter, param_type* r) { bool has_no_times; if (!ReadParam(m, iter, &r->socket_log_id) || !ReadParam(m, iter, &r->socket_reused) || !ReadParam(m, iter, &has_no_times)) { return false; } if (has_no_times) return true; return ReadParam(m, iter, &r->request_start_time) && ReadParam(m, iter, &r->request_start) && ReadParam(m, iter, &r->proxy_resolve_start) && ReadParam(m, iter, &r->proxy_resolve_end) && ReadParam(m, iter, &r->connect_timing.dns_start) && ReadParam(m, iter, &r->connect_timing.dns_end) && ReadParam(m, iter, &r->connect_timing.connect_start) && ReadParam(m, iter, &r->connect_timing.connect_end) && ReadParam(m, iter, &r->connect_timing.ssl_start) && ReadParam(m, iter, &r->connect_timing.ssl_end) && ReadParam(m, iter, &r->send_start) && ReadParam(m, iter, &r->send_end) && ReadParam(m, iter, &r->receive_headers_end); } void ParamTraits::Log(const param_type& p, std::string* l) { l->append("("); LogParam(p.socket_log_id, l); l->append(","); LogParam(p.socket_reused, l); l->append(","); LogParam(p.request_start_time, l); l->append(", "); LogParam(p.request_start, l); l->append(", "); LogParam(p.proxy_resolve_start, l); l->append(", "); LogParam(p.proxy_resolve_end, l); l->append(", "); LogParam(p.connect_timing.dns_start, l); l->append(", "); LogParam(p.connect_timing.dns_end, l); l->append(", "); LogParam(p.connect_timing.connect_start, l); l->append(", "); LogParam(p.connect_timing.connect_end, l); l->append(", "); LogParam(p.connect_timing.ssl_start, l); l->append(", "); LogParam(p.connect_timing.ssl_end, l); l->append(", "); LogParam(p.send_start, l); l->append(", "); LogParam(p.send_end, l); l->append(", "); LogParam(p.receive_headers_end, l); l->append(")"); } void ParamTraits >::Write( Message* m, const param_type& p) { WriteParam(m, p.get() != NULL); if (p.get()) { WriteParam(m, *p->elements()); WriteParam(m, p->identifier()); } } bool ParamTraits >::Read( const Message* m, PickleIterator* iter, param_type* r) { bool has_object; if (!ReadParam(m, iter, &has_object)) return false; if (!has_object) return true; std::vector elements; if (!ReadParam(m, iter, &elements)) return false; int64 identifier; if (!ReadParam(m, iter, &identifier)) return false; *r = new webkit_glue::ResourceRequestBody; (*r)->swap_elements(&elements); (*r)->set_identifier(identifier); return true; } void ParamTraits >::Log( const param_type& p, std::string* l) { l->append(""); } } // namespace IPC