15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_info.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/pickle.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/auth.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/x509_certificate.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_cert_request_info.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)X509Certificate::PickleType GetPickleTypeForVersion(int version) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (version) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return X509Certificate::PICKLETYPE_SINGLE_CERTIFICATE; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return X509Certificate::PICKLETYPE_CERTIFICATE_CHAIN_V2; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return X509Certificate::PICKLETYPE_CERTIFICATE_CHAIN_V3; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These values can be bit-wise combined to form the flags field of the 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// serialized HttpResponseInfo. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The version of the response info used when persisting response info. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_VERSION = 3, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The minimum version supported for deserializing response info. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_MINIMUM_VERSION = 1, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We reserve up to 8 bits for the version number. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_VERSION_MASK = 0xFF, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This bit is set if the response info has a cert at the end. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Version 1 serialized only the end-entity certificate, while subsequent 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // versions include the available certificate chain. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_HAS_CERT = 1 << 8, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This bit is set if the response info has a security-bits field (security 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // strength, in bits, of the SSL connection) at the end. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_HAS_SECURITY_BITS = 1 << 9, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This bit is set if the response info has a cert status at the end. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_HAS_CERT_STATUS = 1 << 10, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This bit is set if the response info has vary header data. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_HAS_VARY_DATA = 1 << 11, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This bit is set if the request was cancelled before completion. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_TRUNCATED = 1 << 12, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This bit is set if the response was received via SPDY. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_WAS_SPDY = 1 << 13, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This bit is set if the request has NPN negotiated. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_WAS_NPN = 1 << 14, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This bit is set if the request was fetched via an explicit proxy. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_WAS_PROXY = 1 << 15, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This bit is set if the response info has an SSL connection status field. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This contains the ciphersuite used to fetch the resource as well as the 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // protocol version, compression method and whether SSLv3 fallback was used. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_HAS_SSL_CONNECTION_STATUS = 1 << 16, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This bit is set if the response info has protocol version. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESPONSE_INFO_HAS_NPN_NEGOTIATED_PROTOCOL = 1 << 17, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This bit is set if the response info has connection info. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RESPONSE_INFO_HAS_CONNECTION_INFO = 1 << 18, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This bit is set if the request has http authentication. 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RESPONSE_INFO_USE_HTTP_AUTHENTICATION = 1 << 19, 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(darin): Add other bits to indicate alternate request methods. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For now, we don't support storing those. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpResponseInfo::HttpResponseInfo() 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : was_cached(false), 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) server_data_unavailable(false), 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_accessed(false), 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_fetched_via_spdy(false), 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_npn_negotiated(false), 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) was_fetched_via_proxy(false), 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) did_use_http_auth(false), 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connection_info(CONNECTION_INFO_UNKNOWN) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpResponseInfo::HttpResponseInfo(const HttpResponseInfo& rhs) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : was_cached(rhs.was_cached), 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) server_data_unavailable(rhs.server_data_unavailable), 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_accessed(rhs.network_accessed), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_fetched_via_spdy(rhs.was_fetched_via_spdy), 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_npn_negotiated(rhs.was_npn_negotiated), 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_fetched_via_proxy(rhs.was_fetched_via_proxy), 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) did_use_http_auth(rhs.did_use_http_auth), 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_address(rhs.socket_address), 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) npn_negotiated_protocol(rhs.npn_negotiated_protocol), 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connection_info(rhs.connection_info), 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_time(rhs.request_time), 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_time(rhs.response_time), 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_challenge(rhs.auth_challenge), 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_request_info(rhs.cert_request_info), 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_info(rhs.ssl_info), 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers(rhs.headers), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vary_data(rhs.vary_data), 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metadata(rhs.metadata) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpResponseInfo::~HttpResponseInfo() { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpResponseInfo& HttpResponseInfo::operator=(const HttpResponseInfo& rhs) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_cached = rhs.was_cached; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) server_data_unavailable = rhs.server_data_unavailable; 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_accessed = rhs.network_accessed; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_fetched_via_spdy = rhs.was_fetched_via_spdy; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_npn_negotiated = rhs.was_npn_negotiated; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_fetched_via_proxy = rhs.was_fetched_via_proxy; 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) did_use_http_auth = rhs.did_use_http_auth; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_address = rhs.socket_address; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) npn_negotiated_protocol = rhs.npn_negotiated_protocol; 139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) connection_info = rhs.connection_info; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_time = rhs.request_time; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_time = rhs.response_time; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_challenge = rhs.auth_challenge; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_request_info = rhs.cert_request_info; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_info = rhs.ssl_info; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers = rhs.headers; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vary_data = rhs.vary_data; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metadata = rhs.metadata; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HttpResponseInfo::InitFromPickle(const Pickle& pickle, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* response_truncated) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PickleIterator iter(pickle); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Read flags and verify version 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pickle.ReadInt(&iter, &flags)) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int version = flags & RESPONSE_INFO_VERSION_MASK; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (version < RESPONSE_INFO_MINIMUM_VERSION || 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version > RESPONSE_INFO_VERSION) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "unexpected response info version: " << version; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Read request-time 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 time_val; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pickle.ReadInt64(&iter, &time_val)) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_time = Time::FromInternalValue(time_val); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_cached = true; // Set status to show cache resurrection. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Read response-time 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pickle.ReadInt64(&iter, &time_val)) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_time = Time::FromInternalValue(time_val); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Read response-headers 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers = new HttpResponseHeaders(pickle, &iter); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (headers->response_code() == -1) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Read ssl-info 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & RESPONSE_INFO_HAS_CERT) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) X509Certificate::PickleType type = GetPickleTypeForVersion(version); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_info.cert = X509Certificate::CreateFromPickle(pickle, &iter, type); 187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!ssl_info.cert.get()) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & RESPONSE_INFO_HAS_CERT_STATUS) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertStatus cert_status; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pickle.ReadUInt32(&iter, &cert_status)) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_info.cert_status = cert_status; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & RESPONSE_INFO_HAS_SECURITY_BITS) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int security_bits; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pickle.ReadInt(&iter, &security_bits)) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_info.security_bits = security_bits; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & RESPONSE_INFO_HAS_SSL_CONNECTION_STATUS) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int connection_status; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pickle.ReadInt(&iter, &connection_status)) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_info.connection_status = connection_status; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Read vary-data 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & RESPONSE_INFO_HAS_VARY_DATA) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!vary_data.InitFromPickle(pickle, &iter)) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read socket_address. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string socket_address_host; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pickle.ReadString(&iter, &socket_address_host)) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the host was written, we always expect the port to follow. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16 socket_address_port; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pickle.ReadUInt16(&iter, &socket_address_port)) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_address = HostPortPair(socket_address_host, socket_address_port); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (version > 1) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // socket_address was not always present in version 1 of the response 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // info, so we don't fail if it can't be read. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Read protocol-version. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & RESPONSE_INFO_HAS_NPN_NEGOTIATED_PROTOCOL) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pickle.ReadString(&iter, &npn_negotiated_protocol)) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Read connection info. 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (flags & RESPONSE_INFO_HAS_CONNECTION_INFO) { 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int value; 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!pickle.ReadInt(&iter, &value)) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value > static_cast<int>(CONNECTION_INFO_UNKNOWN) && 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value < static_cast<int>(NUM_OF_CONNECTION_INFOS)) { 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connection_info = static_cast<ConnectionInfo>(value); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_fetched_via_spdy = (flags & RESPONSE_INFO_WAS_SPDY) != 0; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_npn_negotiated = (flags & RESPONSE_INFO_WAS_NPN) != 0; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_fetched_via_proxy = (flags & RESPONSE_INFO_WAS_PROXY) != 0; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *response_truncated = (flags & RESPONSE_INFO_TRUNCATED) != 0; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) did_use_http_auth = (flags & RESPONSE_INFO_USE_HTTP_AUTHENTICATION) != 0; 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpResponseInfo::Persist(Pickle* pickle, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool skip_transient_headers, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool response_truncated) const { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = RESPONSE_INFO_VERSION; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_info.is_valid()) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= RESPONSE_INFO_HAS_CERT; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= RESPONSE_INFO_HAS_CERT_STATUS; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_info.security_bits != -1) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= RESPONSE_INFO_HAS_SECURITY_BITS; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_info.connection_status != 0) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= RESPONSE_INFO_HAS_SSL_CONNECTION_STATUS; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vary_data.is_valid()) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= RESPONSE_INFO_HAS_VARY_DATA; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (response_truncated) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= RESPONSE_INFO_TRUNCATED; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (was_fetched_via_spdy) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= RESPONSE_INFO_WAS_SPDY; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (was_npn_negotiated) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= RESPONSE_INFO_WAS_NPN; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= RESPONSE_INFO_HAS_NPN_NEGOTIATED_PROTOCOL; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (was_fetched_via_proxy) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= RESPONSE_INFO_WAS_PROXY; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (connection_info != CONNECTION_INFO_UNKNOWN) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flags |= RESPONSE_INFO_HAS_CONNECTION_INFO; 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (did_use_http_auth) 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) flags |= RESPONSE_INFO_USE_HTTP_AUTHENTICATION; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle->WriteInt(flags); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle->WriteInt64(request_time.ToInternalValue()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle->WriteInt64(response_time.ToInternalValue()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseHeaders::PersistOptions persist_options = 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseHeaders::PERSIST_RAW; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (skip_transient_headers) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) persist_options = 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseHeaders::PERSIST_SANS_COOKIES | 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseHeaders::PERSIST_SANS_CHALLENGES | 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP | 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE | 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseHeaders::PERSIST_SANS_RANGES | 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseHeaders::PERSIST_SANS_SECURITY_STATE; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers->Persist(pickle, persist_options); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_info.is_valid()) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_info.cert->Persist(pickle); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle->WriteUInt32(ssl_info.cert_status); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_info.security_bits != -1) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle->WriteInt(ssl_info.security_bits); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_info.connection_status != 0) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle->WriteInt(ssl_info.connection_status); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vary_data.is_valid()) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vary_data.Persist(pickle); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle->WriteString(socket_address.host()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle->WriteUInt16(socket_address.port()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (was_npn_negotiated) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle->WriteString(npn_negotiated_protocol); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (connection_info != CONNECTION_INFO_UNKNOWN) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pickle->WriteInt(static_cast<int>(connection_info)); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 331558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochHttpResponseInfo::ConnectionInfo HttpResponseInfo::ConnectionInfoFromNextProto( 332558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NextProto next_proto) { 333558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch switch (next_proto) { 334558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoSPDY2: 335558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return CONNECTION_INFO_SPDY2; 336558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoSPDY3: 337558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoSPDY31: 338558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return CONNECTION_INFO_SPDY3; 339558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoSPDY4a2: 340558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return CONNECTION_INFO_SPDY4A2; 341558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoHTTP2Draft04: 342558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return CONNECTION_INFO_HTTP2_DRAFT_04; 343558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoQUIC1SPDY3: 344558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return CONNECTION_INFO_QUIC1_SPDY3; 345558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 346558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoUnknown: 347558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoHTTP11: 348558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoSPDY1: 349558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case kProtoSPDY21: 350558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch break; 351558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 352558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 353558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NOTREACHED(); 354558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return CONNECTION_INFO_UNKNOWN; 355558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 356558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// static 358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)std::string HttpResponseInfo::ConnectionInfoToString( 359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ConnectionInfo connection_info) { 360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) switch (connection_info) { 361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case CONNECTION_INFO_UNKNOWN: 362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return "unknown"; 363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case CONNECTION_INFO_HTTP1: 364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return "http/1"; 365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case CONNECTION_INFO_SPDY2: 366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return "spdy/2"; 367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case CONNECTION_INFO_SPDY3: 368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return "spdy/3"; 369558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case CONNECTION_INFO_SPDY4A2: 370558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return "spdy/4a2"; 371558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch case CONNECTION_INFO_HTTP2_DRAFT_04: 372558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return "HTTP-draft-04/2.0"; 373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case CONNECTION_INFO_QUIC1_SPDY3: 374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return "quic/1+spdy/3"; 375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case NUM_OF_CONNECTION_INFOS: 376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTREACHED(); 379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return ""; 380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 383