1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/common/resource_messages.h" 6 7 #include "net/base/load_timing_info.h" 8 #include "net/http/http_response_headers.h" 9 10 namespace IPC { 11 12 void ParamTraits<scoped_refptr<net::HttpResponseHeaders> >::Write( 13 Message* m, const param_type& p) { 14 WriteParam(m, p.get() != NULL); 15 if (p.get()) { 16 // Do not disclose Set-Cookie headers over IPC. 17 p->Persist(m, net::HttpResponseHeaders::PERSIST_SANS_COOKIES); 18 } 19 } 20 21 bool ParamTraits<scoped_refptr<net::HttpResponseHeaders> >::Read( 22 const Message* m, PickleIterator* iter, param_type* r) { 23 bool has_object; 24 if (!ReadParam(m, iter, &has_object)) 25 return false; 26 if (has_object) 27 *r = new net::HttpResponseHeaders(*m, iter); 28 return true; 29 } 30 31 void ParamTraits<scoped_refptr<net::HttpResponseHeaders> >::Log( 32 const param_type& p, std::string* l) { 33 l->append("<HttpResponseHeaders>"); 34 } 35 36 void ParamTraits<storage::DataElement>::Write(Message* m, const param_type& p) { 37 WriteParam(m, static_cast<int>(p.type())); 38 switch (p.type()) { 39 case storage::DataElement::TYPE_BYTES: { 40 m->WriteData(p.bytes(), static_cast<int>(p.length())); 41 break; 42 } 43 case storage::DataElement::TYPE_FILE: { 44 WriteParam(m, p.path()); 45 WriteParam(m, p.offset()); 46 WriteParam(m, p.length()); 47 WriteParam(m, p.expected_modification_time()); 48 break; 49 } 50 case storage::DataElement::TYPE_FILE_FILESYSTEM: { 51 WriteParam(m, p.filesystem_url()); 52 WriteParam(m, p.offset()); 53 WriteParam(m, p.length()); 54 WriteParam(m, p.expected_modification_time()); 55 break; 56 } 57 default: { 58 DCHECK(p.type() == storage::DataElement::TYPE_BLOB); 59 WriteParam(m, p.blob_uuid()); 60 WriteParam(m, p.offset()); 61 WriteParam(m, p.length()); 62 break; 63 } 64 } 65 } 66 67 bool ParamTraits<storage::DataElement>::Read(const Message* m, 68 PickleIterator* iter, 69 param_type* r) { 70 int type; 71 if (!ReadParam(m, iter, &type)) 72 return false; 73 switch (type) { 74 case storage::DataElement::TYPE_BYTES: { 75 const char* data; 76 int len; 77 if (!m->ReadData(iter, &data, &len)) 78 return false; 79 r->SetToBytes(data, len); 80 break; 81 } 82 case storage::DataElement::TYPE_FILE: { 83 base::FilePath file_path; 84 uint64 offset, length; 85 base::Time expected_modification_time; 86 if (!ReadParam(m, iter, &file_path)) 87 return false; 88 if (!ReadParam(m, iter, &offset)) 89 return false; 90 if (!ReadParam(m, iter, &length)) 91 return false; 92 if (!ReadParam(m, iter, &expected_modification_time)) 93 return false; 94 r->SetToFilePathRange(file_path, offset, length, 95 expected_modification_time); 96 break; 97 } 98 case storage::DataElement::TYPE_FILE_FILESYSTEM: { 99 GURL file_system_url; 100 uint64 offset, length; 101 base::Time expected_modification_time; 102 if (!ReadParam(m, iter, &file_system_url)) 103 return false; 104 if (!ReadParam(m, iter, &offset)) 105 return false; 106 if (!ReadParam(m, iter, &length)) 107 return false; 108 if (!ReadParam(m, iter, &expected_modification_time)) 109 return false; 110 r->SetToFileSystemUrlRange(file_system_url, offset, length, 111 expected_modification_time); 112 break; 113 } 114 default: { 115 DCHECK(type == storage::DataElement::TYPE_BLOB); 116 std::string blob_uuid; 117 uint64 offset, length; 118 if (!ReadParam(m, iter, &blob_uuid)) 119 return false; 120 if (!ReadParam(m, iter, &offset)) 121 return false; 122 if (!ReadParam(m, iter, &length)) 123 return false; 124 r->SetToBlobRange(blob_uuid, offset, length); 125 break; 126 } 127 } 128 return true; 129 } 130 131 void ParamTraits<storage::DataElement>::Log(const param_type& p, 132 std::string* l) { 133 l->append("<storage::DataElement>"); 134 } 135 136 void ParamTraits<scoped_refptr<content::ResourceDevToolsInfo> >::Write( 137 Message* m, const param_type& p) { 138 WriteParam(m, p.get() != NULL); 139 if (p.get()) { 140 WriteParam(m, p->http_status_code); 141 WriteParam(m, p->http_status_text); 142 WriteParam(m, p->request_headers); 143 WriteParam(m, p->response_headers); 144 WriteParam(m, p->request_headers_text); 145 WriteParam(m, p->response_headers_text); 146 } 147 } 148 149 bool ParamTraits<scoped_refptr<content::ResourceDevToolsInfo> >::Read( 150 const Message* m, PickleIterator* iter, param_type* r) { 151 bool has_object; 152 if (!ReadParam(m, iter, &has_object)) 153 return false; 154 if (!has_object) 155 return true; 156 *r = new content::ResourceDevToolsInfo(); 157 return 158 ReadParam(m, iter, &(*r)->http_status_code) && 159 ReadParam(m, iter, &(*r)->http_status_text) && 160 ReadParam(m, iter, &(*r)->request_headers) && 161 ReadParam(m, iter, &(*r)->response_headers) && 162 ReadParam(m, iter, &(*r)->request_headers_text) && 163 ReadParam(m, iter, &(*r)->response_headers_text); 164 } 165 166 void ParamTraits<scoped_refptr<content::ResourceDevToolsInfo> >::Log( 167 const param_type& p, std::string* l) { 168 l->append("("); 169 if (p.get()) { 170 LogParam(p->request_headers, l); 171 l->append(", "); 172 LogParam(p->response_headers, l); 173 } 174 l->append(")"); 175 } 176 177 void ParamTraits<net::LoadTimingInfo>::Write( 178 Message* m, const param_type& p) { 179 WriteParam(m, p.socket_log_id); 180 WriteParam(m, p.socket_reused); 181 WriteParam(m, p.request_start_time.is_null()); 182 if (p.request_start_time.is_null()) 183 return; 184 WriteParam(m, p.request_start_time); 185 WriteParam(m, p.request_start); 186 WriteParam(m, p.proxy_resolve_start); 187 WriteParam(m, p.proxy_resolve_end); 188 WriteParam(m, p.connect_timing.dns_start); 189 WriteParam(m, p.connect_timing.dns_end); 190 WriteParam(m, p.connect_timing.connect_start); 191 WriteParam(m, p.connect_timing.connect_end); 192 WriteParam(m, p.connect_timing.ssl_start); 193 WriteParam(m, p.connect_timing.ssl_end); 194 WriteParam(m, p.send_start); 195 WriteParam(m, p.send_end); 196 WriteParam(m, p.receive_headers_end); 197 } 198 199 bool ParamTraits<net::LoadTimingInfo>::Read( 200 const Message* m, PickleIterator* iter, param_type* r) { 201 bool has_no_times; 202 if (!ReadParam(m, iter, &r->socket_log_id) || 203 !ReadParam(m, iter, &r->socket_reused) || 204 !ReadParam(m, iter, &has_no_times)) { 205 return false; 206 } 207 if (has_no_times) 208 return true; 209 210 return 211 ReadParam(m, iter, &r->request_start_time) && 212 ReadParam(m, iter, &r->request_start) && 213 ReadParam(m, iter, &r->proxy_resolve_start) && 214 ReadParam(m, iter, &r->proxy_resolve_end) && 215 ReadParam(m, iter, &r->connect_timing.dns_start) && 216 ReadParam(m, iter, &r->connect_timing.dns_end) && 217 ReadParam(m, iter, &r->connect_timing.connect_start) && 218 ReadParam(m, iter, &r->connect_timing.connect_end) && 219 ReadParam(m, iter, &r->connect_timing.ssl_start) && 220 ReadParam(m, iter, &r->connect_timing.ssl_end) && 221 ReadParam(m, iter, &r->send_start) && 222 ReadParam(m, iter, &r->send_end) && 223 ReadParam(m, iter, &r->receive_headers_end); 224 } 225 226 void ParamTraits<net::LoadTimingInfo>::Log(const param_type& p, 227 std::string* l) { 228 l->append("("); 229 LogParam(p.socket_log_id, l); 230 l->append(","); 231 LogParam(p.socket_reused, l); 232 l->append(","); 233 LogParam(p.request_start_time, l); 234 l->append(", "); 235 LogParam(p.request_start, l); 236 l->append(", "); 237 LogParam(p.proxy_resolve_start, l); 238 l->append(", "); 239 LogParam(p.proxy_resolve_end, l); 240 l->append(", "); 241 LogParam(p.connect_timing.dns_start, l); 242 l->append(", "); 243 LogParam(p.connect_timing.dns_end, l); 244 l->append(", "); 245 LogParam(p.connect_timing.connect_start, l); 246 l->append(", "); 247 LogParam(p.connect_timing.connect_end, l); 248 l->append(", "); 249 LogParam(p.connect_timing.ssl_start, l); 250 l->append(", "); 251 LogParam(p.connect_timing.ssl_end, l); 252 l->append(", "); 253 LogParam(p.send_start, l); 254 l->append(", "); 255 LogParam(p.send_end, l); 256 l->append(", "); 257 LogParam(p.receive_headers_end, l); 258 l->append(")"); 259 } 260 261 void ParamTraits<scoped_refptr<content::ResourceRequestBody> >::Write( 262 Message* m, 263 const param_type& p) { 264 WriteParam(m, p.get() != NULL); 265 if (p.get()) { 266 WriteParam(m, *p->elements()); 267 WriteParam(m, p->identifier()); 268 } 269 } 270 271 bool ParamTraits<scoped_refptr<content::ResourceRequestBody> >::Read( 272 const Message* m, 273 PickleIterator* iter, 274 param_type* r) { 275 bool has_object; 276 if (!ReadParam(m, iter, &has_object)) 277 return false; 278 if (!has_object) 279 return true; 280 std::vector<storage::DataElement> elements; 281 if (!ReadParam(m, iter, &elements)) 282 return false; 283 int64 identifier; 284 if (!ReadParam(m, iter, &identifier)) 285 return false; 286 *r = new content::ResourceRequestBody; 287 (*r)->swap_elements(&elements); 288 (*r)->set_identifier(identifier); 289 return true; 290 } 291 292 void ParamTraits<scoped_refptr<content::ResourceRequestBody> >::Log( 293 const param_type& p, std::string* l) { 294 l->append("<ResourceRequestBody>"); 295 } 296 297 } // namespace IPC 298