OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/http/http_response_info.h" | 5 #include "net/http/http_response_info.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/pickle.h" | 8 #include "base/pickle.h" |
9 #include "base/time.h" | 9 #include "base/time.h" |
10 #include "net/base/auth.h" | 10 #include "net/base/auth.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 // This bit is set if the request has NPN negotiated. | 49 // This bit is set if the request has NPN negotiated. |
50 RESPONSE_INFO_WAS_NPN = 1 << 14, | 50 RESPONSE_INFO_WAS_NPN = 1 << 14, |
51 | 51 |
52 // This bit is set if the request was fetched via an explicit proxy. | 52 // This bit is set if the request was fetched via an explicit proxy. |
53 RESPONSE_INFO_WAS_PROXY = 1 << 15, | 53 RESPONSE_INFO_WAS_PROXY = 1 << 15, |
54 | 54 |
55 // This bit is set if response could use alternate protocol. However, browser | 55 // This bit is set if response could use alternate protocol. However, browser |
56 // will ingore the alternate protocol if spdy is not enabled. | 56 // will ingore the alternate protocol if spdy is not enabled. |
57 RESPONSE_INFO_WAS_ALTERNATE_PROTOCOL_AVAILABLE = 1 << 16, | 57 RESPONSE_INFO_WAS_ALTERNATE_PROTOCOL_AVAILABLE = 1 << 16, |
58 | 58 |
| 59 // This bit is set if the response info has a TLS username. |
| 60 RESPONSE_INFO_HAS_TLS_USERNAME = 1 << 17, |
| 61 |
59 // TODO(darin): Add other bits to indicate alternate request methods. | 62 // TODO(darin): Add other bits to indicate alternate request methods. |
60 // For now, we don't support storing those. | 63 // For now, we don't support storing those. |
61 }; | 64 }; |
62 | 65 |
63 HttpResponseInfo::HttpResponseInfo() | 66 HttpResponseInfo::HttpResponseInfo() |
64 : was_cached(false), | 67 : was_cached(false), |
65 was_fetched_via_spdy(false), | 68 was_fetched_via_spdy(false), |
66 was_npn_negotiated(false), | 69 was_npn_negotiated(false), |
67 was_alternate_protocol_available(false), | 70 was_alternate_protocol_available(false), |
68 was_fetched_via_proxy(false) { | 71 was_fetched_via_proxy(false) { |
69 } | 72 } |
70 | 73 |
71 HttpResponseInfo::HttpResponseInfo(const HttpResponseInfo& rhs) | 74 HttpResponseInfo::HttpResponseInfo(const HttpResponseInfo& rhs) |
72 : was_cached(rhs.was_cached), | 75 : was_cached(rhs.was_cached), |
73 was_fetched_via_spdy(rhs.was_fetched_via_spdy), | 76 was_fetched_via_spdy(rhs.was_fetched_via_spdy), |
74 was_npn_negotiated(rhs.was_npn_negotiated), | 77 was_npn_negotiated(rhs.was_npn_negotiated), |
75 was_alternate_protocol_available(rhs.was_alternate_protocol_available), | 78 was_alternate_protocol_available(rhs.was_alternate_protocol_available), |
76 was_fetched_via_proxy(rhs.was_fetched_via_proxy), | 79 was_fetched_via_proxy(rhs.was_fetched_via_proxy), |
77 request_time(rhs.request_time), | 80 request_time(rhs.request_time), |
78 response_time(rhs.response_time), | 81 response_time(rhs.response_time), |
79 auth_challenge(rhs.auth_challenge), | 82 auth_challenge(rhs.auth_challenge), |
80 cert_request_info(rhs.cert_request_info), | 83 cert_request_info(rhs.cert_request_info), |
| 84 login_request_info(rhs.login_request_info), |
81 ssl_info(rhs.ssl_info), | 85 ssl_info(rhs.ssl_info), |
82 headers(rhs.headers), | 86 headers(rhs.headers), |
83 vary_data(rhs.vary_data), | 87 vary_data(rhs.vary_data), |
84 metadata(rhs.metadata) { | 88 metadata(rhs.metadata) { |
85 } | 89 } |
86 | 90 |
87 HttpResponseInfo::~HttpResponseInfo() { | 91 HttpResponseInfo::~HttpResponseInfo() { |
88 } | 92 } |
89 | 93 |
90 HttpResponseInfo& HttpResponseInfo::operator=(const HttpResponseInfo& rhs) { | 94 HttpResponseInfo& HttpResponseInfo::operator=(const HttpResponseInfo& rhs) { |
91 was_cached = rhs.was_cached; | 95 was_cached = rhs.was_cached; |
92 was_fetched_via_spdy = rhs.was_fetched_via_spdy; | 96 was_fetched_via_spdy = rhs.was_fetched_via_spdy; |
93 was_npn_negotiated = rhs.was_npn_negotiated; | 97 was_npn_negotiated = rhs.was_npn_negotiated; |
94 was_alternate_protocol_available = rhs.was_alternate_protocol_available; | 98 was_alternate_protocol_available = rhs.was_alternate_protocol_available; |
95 was_fetched_via_proxy = rhs.was_fetched_via_proxy; | 99 was_fetched_via_proxy = rhs.was_fetched_via_proxy; |
96 request_time = rhs.request_time; | 100 request_time = rhs.request_time; |
97 response_time = rhs.response_time; | 101 response_time = rhs.response_time; |
98 auth_challenge = rhs.auth_challenge; | 102 auth_challenge = rhs.auth_challenge; |
99 cert_request_info = rhs.cert_request_info; | 103 cert_request_info = rhs.cert_request_info; |
| 104 login_request_info = rhs.login_request_info; |
100 ssl_info = rhs.ssl_info; | 105 ssl_info = rhs.ssl_info; |
101 headers = rhs.headers; | 106 headers = rhs.headers; |
102 vary_data = rhs.vary_data; | 107 vary_data = rhs.vary_data; |
103 metadata = rhs.metadata; | 108 metadata = rhs.metadata; |
104 return *this; | 109 return *this; |
105 } | 110 } |
106 | 111 |
107 bool HttpResponseInfo::InitFromPickle(const Pickle& pickle, | 112 bool HttpResponseInfo::InitFromPickle(const Pickle& pickle, |
108 bool* response_truncated) { | 113 bool* response_truncated) { |
109 void* iter = NULL; | 114 void* iter = NULL; |
(...skipping 22 matching lines...) Expand all Loading... |
132 | 137 |
133 // read response-headers | 138 // read response-headers |
134 headers = new HttpResponseHeaders(pickle, &iter); | 139 headers = new HttpResponseHeaders(pickle, &iter); |
135 DCHECK_NE(headers->response_code(), -1); | 140 DCHECK_NE(headers->response_code(), -1); |
136 | 141 |
137 // read ssl-info | 142 // read ssl-info |
138 if (flags & RESPONSE_INFO_HAS_CERT) { | 143 if (flags & RESPONSE_INFO_HAS_CERT) { |
139 ssl_info.cert = | 144 ssl_info.cert = |
140 X509Certificate::CreateFromPickle(pickle, &iter); | 145 X509Certificate::CreateFromPickle(pickle, &iter); |
141 } | 146 } |
| 147 if (flags & RESPONSE_INFO_HAS_TLS_USERNAME) { |
| 148 string16 tls_username; |
| 149 if (!pickle.ReadString16(&iter, &tls_username)) |
| 150 return false; |
| 151 ssl_info.tls_username = tls_username; |
| 152 } |
142 if (flags & RESPONSE_INFO_HAS_CERT_STATUS) { | 153 if (flags & RESPONSE_INFO_HAS_CERT_STATUS) { |
143 int cert_status; | 154 int cert_status; |
144 if (!pickle.ReadInt(&iter, &cert_status)) | 155 if (!pickle.ReadInt(&iter, &cert_status)) |
145 return false; | 156 return false; |
146 ssl_info.cert_status = cert_status; | 157 ssl_info.cert_status = cert_status; |
147 } | 158 } |
148 if (flags & RESPONSE_INFO_HAS_SECURITY_BITS) { | 159 if (flags & RESPONSE_INFO_HAS_SECURITY_BITS) { |
149 int security_bits; | 160 int security_bits; |
150 if (!pickle.ReadInt(&iter, &security_bits)) | 161 if (!pickle.ReadInt(&iter, &security_bits)) |
151 return false; | 162 return false; |
(...skipping 18 matching lines...) Expand all Loading... |
170 *response_truncated = (flags & RESPONSE_INFO_TRUNCATED) ? true : false; | 181 *response_truncated = (flags & RESPONSE_INFO_TRUNCATED) ? true : false; |
171 | 182 |
172 return true; | 183 return true; |
173 } | 184 } |
174 | 185 |
175 void HttpResponseInfo::Persist(Pickle* pickle, | 186 void HttpResponseInfo::Persist(Pickle* pickle, |
176 bool skip_transient_headers, | 187 bool skip_transient_headers, |
177 bool response_truncated) const { | 188 bool response_truncated) const { |
178 int flags = RESPONSE_INFO_VERSION; | 189 int flags = RESPONSE_INFO_VERSION; |
179 if (ssl_info.is_valid()) { | 190 if (ssl_info.is_valid()) { |
180 flags |= RESPONSE_INFO_HAS_CERT; | 191 if (ssl_info.cert.get()) |
| 192 flags |= RESPONSE_INFO_HAS_CERT; |
| 193 if (!ssl_info.tls_username.empty()) |
| 194 flags |= RESPONSE_INFO_HAS_TLS_USERNAME; |
181 flags |= RESPONSE_INFO_HAS_CERT_STATUS; | 195 flags |= RESPONSE_INFO_HAS_CERT_STATUS; |
182 if (ssl_info.security_bits != -1) | 196 if (ssl_info.security_bits != -1) |
183 flags |= RESPONSE_INFO_HAS_SECURITY_BITS; | 197 flags |= RESPONSE_INFO_HAS_SECURITY_BITS; |
184 // TODO(wtc): we should persist ssl_info.connection_status. | 198 // TODO(wtc): we should persist ssl_info.connection_status. |
185 } | 199 } |
186 if (vary_data.is_valid()) | 200 if (vary_data.is_valid()) |
187 flags |= RESPONSE_INFO_HAS_VARY_DATA; | 201 flags |= RESPONSE_INFO_HAS_VARY_DATA; |
188 if (response_truncated) | 202 if (response_truncated) |
189 flags |= RESPONSE_INFO_TRUNCATED; | 203 flags |= RESPONSE_INFO_TRUNCATED; |
190 if (was_fetched_via_spdy) | 204 if (was_fetched_via_spdy) |
(...skipping 17 matching lines...) Expand all Loading... |
208 net::HttpResponseHeaders::PERSIST_SANS_COOKIES | | 222 net::HttpResponseHeaders::PERSIST_SANS_COOKIES | |
209 net::HttpResponseHeaders::PERSIST_SANS_CHALLENGES | | 223 net::HttpResponseHeaders::PERSIST_SANS_CHALLENGES | |
210 net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP | | 224 net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP | |
211 net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE | | 225 net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE | |
212 net::HttpResponseHeaders::PERSIST_SANS_RANGES; | 226 net::HttpResponseHeaders::PERSIST_SANS_RANGES; |
213 } | 227 } |
214 | 228 |
215 headers->Persist(pickle, persist_options); | 229 headers->Persist(pickle, persist_options); |
216 | 230 |
217 if (ssl_info.is_valid()) { | 231 if (ssl_info.is_valid()) { |
218 ssl_info.cert->Persist(pickle); | 232 if (flags & RESPONSE_INFO_HAS_CERT) |
| 233 ssl_info.cert->Persist(pickle); |
| 234 if (flags & RESPONSE_INFO_HAS_TLS_USERNAME) |
| 235 pickle->WriteString16(ssl_info.tls_username); |
219 pickle->WriteInt(ssl_info.cert_status); | 236 pickle->WriteInt(ssl_info.cert_status); |
220 if (ssl_info.security_bits != -1) | 237 if (ssl_info.security_bits != -1) |
221 pickle->WriteInt(ssl_info.security_bits); | 238 pickle->WriteInt(ssl_info.security_bits); |
222 } | 239 } |
223 | 240 |
224 if (vary_data.is_valid()) | 241 if (vary_data.is_valid()) |
225 vary_data.Persist(pickle); | 242 vary_data.Persist(pickle); |
226 } | 243 } |
227 | 244 |
228 } // namespace net | 245 } // namespace net |
OLD | NEW |