1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_response_info.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h" 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/pickle.h" 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/time.h" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/auth.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/io_buffer.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/net_errors.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/ssl_cert_request_info.h" 143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/x509_certificate.h" 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_response_headers.h" 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing base::Time; 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// These values can be bit-wise combined to form the flags field of the 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// serialized HttpResponseInfo. 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum { 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The version of the response info used when persisting response info. 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RESPONSE_INFO_VERSION = 2, 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The minimum version supported for deserializing response info. 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RESPONSE_INFO_MINIMUM_VERSION = 1, 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We reserve up to 8 bits for the version number. 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RESPONSE_INFO_VERSION_MASK = 0xFF, 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This bit is set if the response info has a cert at the end. 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RESPONSE_INFO_HAS_CERT = 1 << 8, 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This bit is set if the response info has a security-bits field (security 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // strength, in bits, of the SSL connection) at the end. 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RESPONSE_INFO_HAS_SECURITY_BITS = 1 << 9, 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This bit is set if the response info has a cert status at the end. 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RESPONSE_INFO_HAS_CERT_STATUS = 1 << 10, 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This bit is set if the response info has vary header data. 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RESPONSE_INFO_HAS_VARY_DATA = 1 << 11, 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This bit is set if the request was cancelled before completion. 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RESPONSE_INFO_TRUNCATED = 1 << 12, 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This bit is set if the response was received via SPDY. 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RESPONSE_INFO_WAS_SPDY = 1 << 13, 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This bit is set if the request has NPN negotiated. 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RESPONSE_INFO_WAS_NPN = 1 << 14, 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This bit is set if the request was fetched via an explicit proxy. 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RESPONSE_INFO_WAS_PROXY = 1 << 15, 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TODO(darin): Add other bits to indicate alternate request methods. 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // For now, we don't support storing those. 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottHttpResponseInfo::HttpResponseInfo() 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : was_cached(false), 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch was_fetched_via_spdy(false), 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch was_npn_negotiated(false), 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch was_fetched_via_proxy(false) { 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHttpResponseInfo::HttpResponseInfo(const HttpResponseInfo& rhs) 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : was_cached(rhs.was_cached), 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick was_fetched_via_spdy(rhs.was_fetched_via_spdy), 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick was_npn_negotiated(rhs.was_npn_negotiated), 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick was_fetched_via_proxy(rhs.was_fetched_via_proxy), 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen socket_address(rhs.socket_address), 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick request_time(rhs.request_time), 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick response_time(rhs.response_time), 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick auth_challenge(rhs.auth_challenge), 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cert_request_info(rhs.cert_request_info), 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ssl_info(rhs.ssl_info), 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headers(rhs.headers), 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick vary_data(rhs.vary_data), 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick metadata(rhs.metadata) { 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottHttpResponseInfo::~HttpResponseInfo() { 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHttpResponseInfo& HttpResponseInfo::operator=(const HttpResponseInfo& rhs) { 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick was_cached = rhs.was_cached; 903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick was_fetched_via_spdy = rhs.was_fetched_via_spdy; 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick was_npn_negotiated = rhs.was_npn_negotiated; 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick was_fetched_via_proxy = rhs.was_fetched_via_proxy; 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen socket_address = rhs.socket_address; 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick request_time = rhs.request_time; 953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick response_time = rhs.response_time; 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick auth_challenge = rhs.auth_challenge; 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cert_request_info = rhs.cert_request_info; 983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ssl_info = rhs.ssl_info; 993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headers = rhs.headers; 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick vary_data = rhs.vary_data; 1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick metadata = rhs.metadata; 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return *this; 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool HttpResponseInfo::InitFromPickle(const Pickle& pickle, 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool* response_truncated) { 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void* iter = NULL; 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // read flags and verify version 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int flags; 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!pickle.ReadInt(&iter, &flags)) 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int version = flags & RESPONSE_INFO_VERSION_MASK; 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (version < RESPONSE_INFO_MINIMUM_VERSION || 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen version > RESPONSE_INFO_VERSION) { 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DLOG(ERROR) << "unexpected response info version: " << version; 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // read request-time 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 time_val; 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!pickle.ReadInt64(&iter, &time_val)) 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott request_time = Time::FromInternalValue(time_val); 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott was_cached = true; // Set status to show cache resurrection. 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // read response-time 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!pickle.ReadInt64(&iter, &time_val)) 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott response_time = Time::FromInternalValue(time_val); 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // read response-headers 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott headers = new HttpResponseHeaders(pickle, &iter); 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DCHECK_NE(headers->response_code(), -1); 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // read ssl-info 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (flags & RESPONSE_INFO_HAS_CERT) { 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Version 1 only serialized only the end-entity certificate, 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // while subsequent versions include the entire chain. 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen X509Certificate::PickleType type = (version == 1) ? 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen X509Certificate::PICKLETYPE_SINGLE_CERTIFICATE : 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen X509Certificate::PICKLETYPE_CERTIFICATE_CHAIN; 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ssl_info.cert = X509Certificate::CreateFromPickle(pickle, &iter, type); 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (flags & RESPONSE_INFO_HAS_CERT_STATUS) { 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int cert_status; 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!pickle.ReadInt(&iter, &cert_status)) 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ssl_info.cert_status = cert_status; 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (flags & RESPONSE_INFO_HAS_SECURITY_BITS) { 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int security_bits; 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!pickle.ReadInt(&iter, &security_bits)) 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ssl_info.security_bits = security_bits; 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // read vary-data 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (flags & RESPONSE_INFO_HAS_VARY_DATA) { 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!vary_data.InitFromPickle(pickle, &iter)) 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Read socket_address. This was not always present in the response info, 165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // so we don't fail if it can't be read. If additional fields are added in 166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // a future version, then they must only be read if this operation succeeds. 167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string socket_address_host; 168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (pickle.ReadString(&iter, &socket_address_host)) { 169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // If the host was written, we always expect the port to follow. 170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen uint16 socket_address_port; 171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!pickle.ReadUInt16(&iter, &socket_address_port)) 172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return false; 173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen socket_address = HostPortPair(socket_address_host, socket_address_port); 174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott was_fetched_via_spdy = (flags & RESPONSE_INFO_WAS_SPDY) != 0; 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch was_npn_negotiated = (flags & RESPONSE_INFO_WAS_NPN) != 0; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch was_fetched_via_proxy = (flags & RESPONSE_INFO_WAS_PROXY) != 0; 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *response_truncated = (flags & RESPONSE_INFO_TRUNCATED) ? true : false; 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return true; 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid HttpResponseInfo::Persist(Pickle* pickle, 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool skip_transient_headers, 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool response_truncated) const { 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int flags = RESPONSE_INFO_VERSION; 1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (ssl_info.is_valid()) { 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott flags |= RESPONSE_INFO_HAS_CERT; 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott flags |= RESPONSE_INFO_HAS_CERT_STATUS; 1944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (ssl_info.security_bits != -1) 1954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch flags |= RESPONSE_INFO_HAS_SECURITY_BITS; 1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // TODO(wtc): we should persist ssl_info.connection_status. 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (vary_data.is_valid()) 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott flags |= RESPONSE_INFO_HAS_VARY_DATA; 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (response_truncated) 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott flags |= RESPONSE_INFO_TRUNCATED; 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (was_fetched_via_spdy) 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott flags |= RESPONSE_INFO_WAS_SPDY; 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (was_npn_negotiated) 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flags |= RESPONSE_INFO_WAS_NPN; 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (was_fetched_via_proxy) 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flags |= RESPONSE_INFO_WAS_PROXY; 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pickle->WriteInt(flags); 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pickle->WriteInt64(request_time.ToInternalValue()); 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pickle->WriteInt64(response_time.ToInternalValue()); 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott net::HttpResponseHeaders::PersistOptions persist_options = 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott net::HttpResponseHeaders::PERSIST_RAW; 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (skip_transient_headers) { 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott persist_options = 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott net::HttpResponseHeaders::PERSIST_SANS_COOKIES | 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott net::HttpResponseHeaders::PERSIST_SANS_CHALLENGES | 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP | 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE | 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott net::HttpResponseHeaders::PERSIST_SANS_RANGES; 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott headers->Persist(pickle, persist_options); 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (ssl_info.is_valid()) { 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ssl_info.cert->Persist(pickle); 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pickle->WriteInt(ssl_info.cert_status); 2304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (ssl_info.security_bits != -1) 2314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch pickle->WriteInt(ssl_info.security_bits); 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (vary_data.is_valid()) 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vary_data.Persist(pickle); 236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen pickle->WriteString(socket_address.host()); 238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen pickle->WriteUInt16(socket_address.port()); 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 242