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