Index: net/http/http_response_info.cc |
diff --git a/net/http/http_response_info.cc b/net/http/http_response_info.cc |
deleted file mode 100644 |
index b5b94c48e2dfdc47242f948a3316bc57d03059d9..0000000000000000000000000000000000000000 |
--- a/net/http/http_response_info.cc |
+++ /dev/null |
@@ -1,425 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/http/http_response_info.h" |
- |
-#include "base/logging.h" |
-#include "base/pickle.h" |
-#include "base/time/time.h" |
-#include "net/base/auth.h" |
-#include "net/base/io_buffer.h" |
-#include "net/base/net_errors.h" |
-#include "net/cert/signed_certificate_timestamp.h" |
-#include "net/cert/x509_certificate.h" |
-#include "net/http/http_response_headers.h" |
-#include "net/ssl/ssl_cert_request_info.h" |
- |
-using base::Time; |
- |
-namespace net { |
- |
-namespace { |
- |
-X509Certificate::PickleType GetPickleTypeForVersion(int version) { |
- switch (version) { |
- case 1: |
- return X509Certificate::PICKLETYPE_SINGLE_CERTIFICATE; |
- case 2: |
- return X509Certificate::PICKLETYPE_CERTIFICATE_CHAIN_V2; |
- case 3: |
- default: |
- return X509Certificate::PICKLETYPE_CERTIFICATE_CHAIN_V3; |
- } |
-} |
- |
-} // namespace |
- |
-// These values can be bit-wise combined to form the flags field of the |
-// serialized HttpResponseInfo. |
-enum { |
- // The version of the response info used when persisting response info. |
- RESPONSE_INFO_VERSION = 3, |
- |
- // The minimum version supported for deserializing response info. |
- RESPONSE_INFO_MINIMUM_VERSION = 1, |
- |
- // We reserve up to 8 bits for the version number. |
- RESPONSE_INFO_VERSION_MASK = 0xFF, |
- |
- // This bit is set if the response info has a cert at the end. |
- // Version 1 serialized only the end-entity certificate, while subsequent |
- // versions include the available certificate chain. |
- RESPONSE_INFO_HAS_CERT = 1 << 8, |
- |
- // This bit is set if the response info has a security-bits field (security |
- // strength, in bits, of the SSL connection) at the end. |
- RESPONSE_INFO_HAS_SECURITY_BITS = 1 << 9, |
- |
- // This bit is set if the response info has a cert status at the end. |
- RESPONSE_INFO_HAS_CERT_STATUS = 1 << 10, |
- |
- // This bit is set if the response info has vary header data. |
- RESPONSE_INFO_HAS_VARY_DATA = 1 << 11, |
- |
- // This bit is set if the request was cancelled before completion. |
- RESPONSE_INFO_TRUNCATED = 1 << 12, |
- |
- // This bit is set if the response was received via SPDY. |
- RESPONSE_INFO_WAS_SPDY = 1 << 13, |
- |
- // This bit is set if the request has NPN negotiated. |
- RESPONSE_INFO_WAS_NPN = 1 << 14, |
- |
- // This bit is set if the request was fetched via an explicit proxy. |
- RESPONSE_INFO_WAS_PROXY = 1 << 15, |
- |
- // This bit is set if the response info has an SSL connection status field. |
- // This contains the ciphersuite used to fetch the resource as well as the |
- // protocol version, compression method and whether SSLv3 fallback was used. |
- RESPONSE_INFO_HAS_SSL_CONNECTION_STATUS = 1 << 16, |
- |
- // This bit is set if the response info has protocol version. |
- RESPONSE_INFO_HAS_NPN_NEGOTIATED_PROTOCOL = 1 << 17, |
- |
- // This bit is set if the response info has connection info. |
- RESPONSE_INFO_HAS_CONNECTION_INFO = 1 << 18, |
- |
- // This bit is set if the request has http authentication. |
- RESPONSE_INFO_USE_HTTP_AUTHENTICATION = 1 << 19, |
- |
- // This bit is set if ssl_info has SCTs. |
- RESPONSE_INFO_HAS_SIGNED_CERTIFICATE_TIMESTAMPS = 1 << 20, |
- |
- RESPONSE_INFO_UNUSED_SINCE_PREFETCH = 1 << 21, |
- |
- // TODO(darin): Add other bits to indicate alternate request methods. |
- // For now, we don't support storing those. |
-}; |
- |
-HttpResponseInfo::HttpResponseInfo() |
- : was_cached(false), |
- server_data_unavailable(false), |
- network_accessed(false), |
- was_fetched_via_spdy(false), |
- was_npn_negotiated(false), |
- was_fetched_via_proxy(false), |
- did_use_http_auth(false), |
- unused_since_prefetch(false), |
- connection_info(CONNECTION_INFO_UNKNOWN) { |
-} |
- |
-HttpResponseInfo::HttpResponseInfo(const HttpResponseInfo& rhs) |
- : was_cached(rhs.was_cached), |
- server_data_unavailable(rhs.server_data_unavailable), |
- network_accessed(rhs.network_accessed), |
- was_fetched_via_spdy(rhs.was_fetched_via_spdy), |
- was_npn_negotiated(rhs.was_npn_negotiated), |
- was_fetched_via_proxy(rhs.was_fetched_via_proxy), |
- proxy_server(rhs.proxy_server), |
- did_use_http_auth(rhs.did_use_http_auth), |
- unused_since_prefetch(rhs.unused_since_prefetch), |
- socket_address(rhs.socket_address), |
- npn_negotiated_protocol(rhs.npn_negotiated_protocol), |
- connection_info(rhs.connection_info), |
- request_time(rhs.request_time), |
- response_time(rhs.response_time), |
- auth_challenge(rhs.auth_challenge), |
- cert_request_info(rhs.cert_request_info), |
- ssl_info(rhs.ssl_info), |
- headers(rhs.headers), |
- vary_data(rhs.vary_data), |
- metadata(rhs.metadata) { |
-} |
- |
-HttpResponseInfo::~HttpResponseInfo() { |
-} |
- |
-HttpResponseInfo& HttpResponseInfo::operator=(const HttpResponseInfo& rhs) { |
- was_cached = rhs.was_cached; |
- server_data_unavailable = rhs.server_data_unavailable; |
- network_accessed = rhs.network_accessed; |
- was_fetched_via_spdy = rhs.was_fetched_via_spdy; |
- proxy_server = rhs.proxy_server; |
- was_npn_negotiated = rhs.was_npn_negotiated; |
- was_fetched_via_proxy = rhs.was_fetched_via_proxy; |
- did_use_http_auth = rhs.did_use_http_auth; |
- unused_since_prefetch = rhs.unused_since_prefetch; |
- socket_address = rhs.socket_address; |
- npn_negotiated_protocol = rhs.npn_negotiated_protocol; |
- connection_info = rhs.connection_info; |
- request_time = rhs.request_time; |
- response_time = rhs.response_time; |
- auth_challenge = rhs.auth_challenge; |
- cert_request_info = rhs.cert_request_info; |
- ssl_info = rhs.ssl_info; |
- headers = rhs.headers; |
- vary_data = rhs.vary_data; |
- metadata = rhs.metadata; |
- return *this; |
-} |
- |
-bool HttpResponseInfo::InitFromPickle(const Pickle& pickle, |
- bool* response_truncated) { |
- PickleIterator iter(pickle); |
- |
- // Read flags and verify version |
- int flags; |
- if (!iter.ReadInt(&flags)) |
- return false; |
- int version = flags & RESPONSE_INFO_VERSION_MASK; |
- if (version < RESPONSE_INFO_MINIMUM_VERSION || |
- version > RESPONSE_INFO_VERSION) { |
- DLOG(ERROR) << "unexpected response info version: " << version; |
- return false; |
- } |
- |
- // Read request-time |
- int64 time_val; |
- if (!iter.ReadInt64(&time_val)) |
- return false; |
- request_time = Time::FromInternalValue(time_val); |
- was_cached = true; // Set status to show cache resurrection. |
- |
- // Read response-time |
- if (!iter.ReadInt64(&time_val)) |
- return false; |
- response_time = Time::FromInternalValue(time_val); |
- |
- // Read response-headers |
- headers = new HttpResponseHeaders(&iter); |
- if (headers->response_code() == -1) |
- return false; |
- |
- // Read ssl-info |
- if (flags & RESPONSE_INFO_HAS_CERT) { |
- X509Certificate::PickleType type = GetPickleTypeForVersion(version); |
- ssl_info.cert = X509Certificate::CreateFromPickle(&iter, type); |
- if (!ssl_info.cert.get()) |
- return false; |
- } |
- if (flags & RESPONSE_INFO_HAS_CERT_STATUS) { |
- CertStatus cert_status; |
- if (!iter.ReadUInt32(&cert_status)) |
- return false; |
- ssl_info.cert_status = cert_status; |
- } |
- if (flags & RESPONSE_INFO_HAS_SECURITY_BITS) { |
- int security_bits; |
- if (!iter.ReadInt(&security_bits)) |
- return false; |
- ssl_info.security_bits = security_bits; |
- } |
- |
- if (flags & RESPONSE_INFO_HAS_SSL_CONNECTION_STATUS) { |
- int connection_status; |
- if (!iter.ReadInt(&connection_status)) |
- return false; |
- ssl_info.connection_status = connection_status; |
- } |
- |
- if (flags & RESPONSE_INFO_HAS_SIGNED_CERTIFICATE_TIMESTAMPS) { |
- int num_scts; |
- if (!iter.ReadInt(&num_scts)) |
- return false; |
- for (int i = 0; i < num_scts; ++i) { |
- scoped_refptr<ct::SignedCertificateTimestamp> sct( |
- ct::SignedCertificateTimestamp::CreateFromPickle(&iter)); |
- uint16 status; |
- if (!sct.get() || !iter.ReadUInt16(&status)) |
- return false; |
- ssl_info.signed_certificate_timestamps.push_back( |
- SignedCertificateTimestampAndStatus( |
- sct, static_cast<ct::SCTVerifyStatus>(status))); |
- } |
- } |
- |
- // Read vary-data |
- if (flags & RESPONSE_INFO_HAS_VARY_DATA) { |
- if (!vary_data.InitFromPickle(&iter)) |
- return false; |
- } |
- |
- // Read socket_address. |
- std::string socket_address_host; |
- if (iter.ReadString(&socket_address_host)) { |
- // If the host was written, we always expect the port to follow. |
- uint16 socket_address_port; |
- if (!iter.ReadUInt16(&socket_address_port)) |
- return false; |
- socket_address = HostPortPair(socket_address_host, socket_address_port); |
- } else if (version > 1) { |
- // socket_address was not always present in version 1 of the response |
- // info, so we don't fail if it can't be read. |
- return false; |
- } |
- |
- // Read protocol-version. |
- if (flags & RESPONSE_INFO_HAS_NPN_NEGOTIATED_PROTOCOL) { |
- if (!iter.ReadString(&npn_negotiated_protocol)) |
- return false; |
- } |
- |
- // Read connection info. |
- if (flags & RESPONSE_INFO_HAS_CONNECTION_INFO) { |
- int value; |
- if (!iter.ReadInt(&value)) |
- return false; |
- |
- if (value > static_cast<int>(CONNECTION_INFO_UNKNOWN) && |
- value < static_cast<int>(NUM_OF_CONNECTION_INFOS)) { |
- connection_info = static_cast<ConnectionInfo>(value); |
- } |
- } |
- |
- was_fetched_via_spdy = (flags & RESPONSE_INFO_WAS_SPDY) != 0; |
- |
- was_npn_negotiated = (flags & RESPONSE_INFO_WAS_NPN) != 0; |
- |
- was_fetched_via_proxy = (flags & RESPONSE_INFO_WAS_PROXY) != 0; |
- |
- *response_truncated = (flags & RESPONSE_INFO_TRUNCATED) != 0; |
- |
- did_use_http_auth = (flags & RESPONSE_INFO_USE_HTTP_AUTHENTICATION) != 0; |
- |
- unused_since_prefetch = (flags & RESPONSE_INFO_UNUSED_SINCE_PREFETCH) != 0; |
- |
- return true; |
-} |
- |
-void HttpResponseInfo::Persist(Pickle* pickle, |
- bool skip_transient_headers, |
- bool response_truncated) const { |
- int flags = RESPONSE_INFO_VERSION; |
- if (ssl_info.is_valid()) { |
- flags |= RESPONSE_INFO_HAS_CERT; |
- flags |= RESPONSE_INFO_HAS_CERT_STATUS; |
- if (ssl_info.security_bits != -1) |
- flags |= RESPONSE_INFO_HAS_SECURITY_BITS; |
- if (ssl_info.connection_status != 0) |
- flags |= RESPONSE_INFO_HAS_SSL_CONNECTION_STATUS; |
- } |
- if (vary_data.is_valid()) |
- flags |= RESPONSE_INFO_HAS_VARY_DATA; |
- if (response_truncated) |
- flags |= RESPONSE_INFO_TRUNCATED; |
- if (was_fetched_via_spdy) |
- flags |= RESPONSE_INFO_WAS_SPDY; |
- if (was_npn_negotiated) { |
- flags |= RESPONSE_INFO_WAS_NPN; |
- flags |= RESPONSE_INFO_HAS_NPN_NEGOTIATED_PROTOCOL; |
- } |
- if (was_fetched_via_proxy) |
- flags |= RESPONSE_INFO_WAS_PROXY; |
- if (connection_info != CONNECTION_INFO_UNKNOWN) |
- flags |= RESPONSE_INFO_HAS_CONNECTION_INFO; |
- if (did_use_http_auth) |
- flags |= RESPONSE_INFO_USE_HTTP_AUTHENTICATION; |
- if (unused_since_prefetch) |
- flags |= RESPONSE_INFO_UNUSED_SINCE_PREFETCH; |
- if (!ssl_info.signed_certificate_timestamps.empty()) |
- flags |= RESPONSE_INFO_HAS_SIGNED_CERTIFICATE_TIMESTAMPS; |
- |
- pickle->WriteInt(flags); |
- pickle->WriteInt64(request_time.ToInternalValue()); |
- pickle->WriteInt64(response_time.ToInternalValue()); |
- |
- net::HttpResponseHeaders::PersistOptions persist_options = |
- net::HttpResponseHeaders::PERSIST_RAW; |
- |
- if (skip_transient_headers) { |
- persist_options = |
- net::HttpResponseHeaders::PERSIST_SANS_COOKIES | |
- net::HttpResponseHeaders::PERSIST_SANS_CHALLENGES | |
- net::HttpResponseHeaders::PERSIST_SANS_HOP_BY_HOP | |
- net::HttpResponseHeaders::PERSIST_SANS_NON_CACHEABLE | |
- net::HttpResponseHeaders::PERSIST_SANS_RANGES | |
- net::HttpResponseHeaders::PERSIST_SANS_SECURITY_STATE; |
- } |
- |
- headers->Persist(pickle, persist_options); |
- |
- if (ssl_info.is_valid()) { |
- ssl_info.cert->Persist(pickle); |
- pickle->WriteUInt32(ssl_info.cert_status); |
- if (ssl_info.security_bits != -1) |
- pickle->WriteInt(ssl_info.security_bits); |
- if (ssl_info.connection_status != 0) |
- pickle->WriteInt(ssl_info.connection_status); |
- if (!ssl_info.signed_certificate_timestamps.empty()) { |
- pickle->WriteInt(ssl_info.signed_certificate_timestamps.size()); |
- for (SignedCertificateTimestampAndStatusList::const_iterator it = |
- ssl_info.signed_certificate_timestamps.begin(); it != |
- ssl_info.signed_certificate_timestamps.end(); ++it) { |
- it->sct->Persist(pickle); |
- pickle->WriteUInt16(static_cast<uint16>(it->status)); |
- } |
- } |
- } |
- |
- if (vary_data.is_valid()) |
- vary_data.Persist(pickle); |
- |
- pickle->WriteString(socket_address.host()); |
- pickle->WriteUInt16(socket_address.port()); |
- |
- if (was_npn_negotiated) |
- pickle->WriteString(npn_negotiated_protocol); |
- |
- if (connection_info != CONNECTION_INFO_UNKNOWN) |
- pickle->WriteInt(static_cast<int>(connection_info)); |
-} |
- |
-HttpResponseInfo::ConnectionInfo HttpResponseInfo::ConnectionInfoFromNextProto( |
- NextProto next_proto) { |
- switch (next_proto) { |
- case kProtoDeprecatedSPDY2: |
- return CONNECTION_INFO_DEPRECATED_SPDY2; |
- case kProtoSPDY3: |
- case kProtoSPDY31: |
- return CONNECTION_INFO_SPDY3; |
- case kProtoSPDY4_14: |
- return CONNECTION_INFO_HTTP2_14; |
- case kProtoSPDY4_15: |
- return CONNECTION_INFO_HTTP2_15; |
- case kProtoQUIC1SPDY3: |
- return CONNECTION_INFO_QUIC1_SPDY3; |
- |
- case kProtoUnknown: |
- case kProtoHTTP11: |
- break; |
- } |
- |
- NOTREACHED(); |
- return CONNECTION_INFO_UNKNOWN; |
-} |
- |
-// static |
-std::string HttpResponseInfo::ConnectionInfoToString( |
- ConnectionInfo connection_info) { |
- switch (connection_info) { |
- case CONNECTION_INFO_UNKNOWN: |
- return "unknown"; |
- case CONNECTION_INFO_HTTP1: |
- return "http/1"; |
- case CONNECTION_INFO_DEPRECATED_SPDY2: |
- return "spdy/2"; |
- case CONNECTION_INFO_SPDY3: |
- return "spdy/3"; |
- case CONNECTION_INFO_HTTP2_14: |
- // For internal consistency, HTTP/2 is named SPDY4 within Chromium. |
- // This is the HTTP/2 draft-14 identifier. |
- return "h2-14"; |
- case CONNECTION_INFO_HTTP2_15: |
- // This is the HTTP/2 draft-15 identifier. |
- return "h2-15"; |
- case CONNECTION_INFO_QUIC1_SPDY3: |
- return "quic/1+spdy/3"; |
- case NUM_OF_CONNECTION_INFOS: |
- break; |
- } |
- NOTREACHED(); |
- return ""; |
-} |
- |
-} // namespace net |