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