summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2014-03-31 11:51:25 +0100
committerBen Murdoch <benm@google.com>2014-03-31 11:51:25 +0100
commiteffb81e5f8246d0db0270817048dc992db66e9fb (patch)
treecc45ced7dfde038c8f3d022ee1eeac207a68761e /net
parent4d26337013537c1acafbcb63b9b2b7e404c3adc9 (diff)
downloadchromium_org-effb81e5f8246d0db0270817048dc992db66e9fb.tar.gz
Merge from Chromium at DEPS revision 260458
This commit was generated by merge_to_master.py. Change-Id: I140fa91b7f09c8efba4424e99ccb87b94a11d022
Diffstat (limited to 'net')
-rw-r--r--net/base/file_stream_context.cc9
-rw-r--r--net/base/file_stream_context.h1
-rw-r--r--net/base/ip_mapping_rules.cc120
-rw-r--r--net/base/ip_mapping_rules.h90
-rw-r--r--net/base/ip_mapping_rules_unittest.cc307
-rw-r--r--net/base/net_error_list.h6
-rw-r--r--net/base/net_util.h13
-rw-r--r--net/base/net_util_posix.cc106
-rw-r--r--net/base/net_util_win.cc3
-rw-r--r--net/base/network_change_notifier_win_unittest.cc12
-rw-r--r--net/base/network_delegate.cc13
-rw-r--r--net/base/network_delegate.h6
-rw-r--r--net/cert/cert_verify_proc.cc4
-rw-r--r--net/cert/cert_verify_proc_unittest.cc21
-rw-r--r--net/cert/test_root_certs.h8
-rw-r--r--net/cert/test_root_certs_unittest.cc2
-rw-r--r--net/cert/x509_certificate.h8
-rw-r--r--net/cert/x509_certificate_mac.cc27
-rw-r--r--net/cert_verify_status_android_java.target.darwin-arm.mk2
-rw-r--r--net/cert_verify_status_android_java.target.darwin-mips.mk2
-rw-r--r--net/cert_verify_status_android_java.target.darwin-x86.mk2
-rw-r--r--net/cert_verify_status_android_java.target.darwin-x86_64.mk233
-rw-r--r--net/cert_verify_status_android_java.target.linux-arm.mk2
-rw-r--r--net/cert_verify_status_android_java.target.linux-mips.mk2
-rw-r--r--net/cert_verify_status_android_java.target.linux-x86.mk2
-rw-r--r--net/cert_verify_status_android_java.target.linux-x86_64.mk233
-rw-r--r--net/certificate_mime_types_java.target.darwin-arm.mk2
-rw-r--r--net/certificate_mime_types_java.target.darwin-mips.mk2
-rw-r--r--net/certificate_mime_types_java.target.darwin-x86.mk2
-rw-r--r--net/certificate_mime_types_java.target.darwin-x86_64.mk233
-rw-r--r--net/certificate_mime_types_java.target.linux-arm.mk2
-rw-r--r--net/certificate_mime_types_java.target.linux-mips.mk2
-rw-r--r--net/certificate_mime_types_java.target.linux-x86.mk2
-rw-r--r--net/certificate_mime_types_java.target.linux-x86_64.mk233
-rw-r--r--net/cookies/cookie_monster.h11
-rw-r--r--net/cookies/cookie_store.h11
-rw-r--r--net/cookies/cookie_store_test_helpers.cc6
-rw-r--r--net/cookies/cookie_store_test_helpers.h4
-rw-r--r--net/cronet/android/url_request_context_peer.cc3
-rw-r--r--net/data/url_request_unittest/redirect302-to-echo-cacheable1
-rw-r--r--net/data/url_request_unittest/redirect302-to-echo-cacheable.mock-http-headers4
-rw-r--r--net/data/websocket/close-with-split-packet_wsh.py11
-rw-r--r--net/data/websocket/split_packet_check.html2
-rw-r--r--net/disk_cache/backend_unittest.cc12
-rw-r--r--net/disk_cache/blockfile/backend_impl_v3.h1
-rw-r--r--net/disk_cache/blockfile/backend_worker_v3.cc55
-rw-r--r--net/disk_cache/blockfile/backend_worker_v3.h26
-rw-r--r--net/disk_cache/cache_creator.cc19
-rw-r--r--net/disk_cache/simple/simple_histogram_macros.h5
-rw-r--r--net/dns/mapped_ip_resolver.cc69
-rw-r--r--net/dns/mapped_ip_resolver.h76
-rw-r--r--net/filter/filter.cc10
-rw-r--r--net/filter/filter.h4
-rw-r--r--net/filter/filter_unittest.cc17
-rw-r--r--net/filter/mock_filter_context.cc7
-rw-r--r--net/filter/mock_filter_context.h8
-rw-r--r--net/http/disk_cache_based_quic_server_info_unittest.cc98
-rw-r--r--net/http/http_cache_transaction.cc3
-rw-r--r--net/http/http_network_session.cc1
-rw-r--r--net/http/http_network_transaction_unittest.cc122
-rw-r--r--net/http/http_proxy_client_socket_pool.cc10
-rw-r--r--net/http/http_stream_factory_impl_job.cc35
-rw-r--r--net/http/http_stream_factory_impl_request.cc30
-rw-r--r--net/http/http_stream_factory_impl_request.h2
-rw-r--r--net/http/http_transaction_unittest.cc10
-rw-r--r--net/http/http_transaction_unittest.h3
-rw-r--r--net/http/transport_security_state.cc14
-rw-r--r--net/http/transport_security_state.h16
-rw-r--r--net/http/transport_security_state_static.h2
-rw-r--r--net/http/transport_security_state_static.json2
-rw-r--r--net/http_server.target.darwin-arm.mk2
-rw-r--r--net/http_server.target.darwin-mips.mk2
-rw-r--r--net/http_server.target.darwin-x86.mk2
-rw-r--r--net/http_server.target.darwin-x86_64.mk269
-rw-r--r--net/http_server.target.linux-arm.mk2
-rw-r--r--net/http_server.target.linux-mips.mk2
-rw-r--r--net/http_server.target.linux-x86.mk2
-rw-r--r--net/http_server.target.linux-x86_64.mk269
-rw-r--r--net/net.gyp120
-rw-r--r--net/net.target.darwin-arm.mk8
-rw-r--r--net/net.target.darwin-mips.mk8
-rw-r--r--net/net.target.darwin-x86.mk8
-rw-r--r--net/net.target.darwin-x86_64.mk786
-rw-r--r--net/net.target.linux-arm.mk8
-rw-r--r--net/net.target.linux-mips.mk8
-rw-r--r--net/net.target.linux-x86.mk8
-rw-r--r--net/net.target.linux-x86_64.mk786
-rw-r--r--net/net_errors_java.target.darwin-arm.mk2
-rw-r--r--net/net_errors_java.target.darwin-mips.mk2
-rw-r--r--net/net_errors_java.target.darwin-x86.mk2
-rw-r--r--net/net_errors_java.target.darwin-x86_64.mk233
-rw-r--r--net/net_errors_java.target.linux-arm.mk2
-rw-r--r--net/net_errors_java.target.linux-mips.mk2
-rw-r--r--net/net_errors_java.target.linux-x86.mk2
-rw-r--r--net/net_errors_java.target.linux-x86_64.mk233
-rw-r--r--net/net_jni_headers.target.darwin-arm.mk2
-rw-r--r--net/net_jni_headers.target.darwin-mips.mk2
-rw-r--r--net/net_jni_headers.target.darwin-x86.mk2
-rw-r--r--net/net_jni_headers.target.darwin-x86_64.mk318
-rw-r--r--net/net_jni_headers.target.linux-arm.mk2
-rw-r--r--net/net_jni_headers.target.linux-mips.mk2
-rw-r--r--net/net_jni_headers.target.linux-x86.mk2
-rw-r--r--net/net_jni_headers.target.linux-x86_64.mk318
-rw-r--r--net/net_resources.target.darwin-x86.mk2
-rw-r--r--net/net_resources.target.darwin-x86_64.mk54
-rw-r--r--net/net_resources.target.linux-x86.mk2
-rw-r--r--net/net_resources.target.linux-x86_64.mk54
-rw-r--r--net/private_key_types_java.target.darwin-arm.mk2
-rw-r--r--net/private_key_types_java.target.darwin-mips.mk2
-rw-r--r--net/private_key_types_java.target.darwin-x86.mk2
-rw-r--r--net/private_key_types_java.target.darwin-x86_64.mk233
-rw-r--r--net/private_key_types_java.target.linux-arm.mk2
-rw-r--r--net/private_key_types_java.target.linux-mips.mk2
-rw-r--r--net/private_key_types_java.target.linux-x86.mk2
-rw-r--r--net/private_key_types_java.target.linux-x86_64.mk233
-rw-r--r--net/proxy/network_delegate_error_observer_unittest.cc3
-rw-r--r--net/proxy/proxy_script_fetcher_impl_unittest.cc4
-rw-r--r--net/quic/crypto/chacha20_poly1305_decrypter.h5
-rw-r--r--net/quic/crypto/chacha20_poly1305_decrypter_test.cc8
-rw-r--r--net/quic/crypto/chacha20_poly1305_encrypter.h5
-rw-r--r--net/quic/crypto/chacha20_poly1305_encrypter_test.cc14
-rw-r--r--net/quic/crypto/proof_test.cc151
-rw-r--r--net/quic/crypto/proof_verifier.cc13
-rw-r--r--net/quic/crypto/proof_verifier.h16
-rw-r--r--net/quic/crypto/proof_verifier_chromium.cc36
-rw-r--r--net/quic/crypto/proof_verifier_chromium.h19
-rw-r--r--net/quic/crypto/quic_crypto_client_config.cc113
-rw-r--r--net/quic/crypto/quic_crypto_client_config.h45
-rw-r--r--net/quic/crypto/quic_crypto_client_config_test.cc46
-rw-r--r--net/quic/crypto/quic_crypto_server_config.cc7
-rw-r--r--net/quic/quic_client_session.cc71
-rw-r--r--net/quic/quic_client_session.h11
-rw-r--r--net/quic/quic_client_session_base.cc15
-rw-r--r--net/quic/quic_client_session_base.h41
-rw-r--r--net/quic/quic_client_session_test.cc3
-rw-r--r--net/quic/quic_crypto_client_stream.cc46
-rw-r--r--net/quic/quic_crypto_client_stream.h34
-rw-r--r--net/quic/quic_crypto_client_stream_test.cc18
-rw-r--r--net/quic/quic_crypto_server_stream_test.cc16
-rw-r--r--net/quic/quic_http_stream.cc7
-rw-r--r--net/quic/quic_http_stream_test.cc2
-rw-r--r--net/quic/quic_session_key.cc21
-rw-r--r--net/quic/quic_session_key.h13
-rw-r--r--net/quic/quic_session_key_test.cc16
-rw-r--r--net/quic/quic_stream_factory.cc173
-rw-r--r--net/quic/quic_stream_factory.h45
-rw-r--r--net/quic/quic_stream_factory_test.cc179
-rw-r--r--net/quic/test_tools/crypto_test_utils.cc5
-rw-r--r--net/quic/test_tools/crypto_test_utils.h5
-rw-r--r--net/quic/test_tools/crypto_test_utils_chromium.cc7
-rw-r--r--net/quic/test_tools/mock_crypto_client_stream.cc14
-rw-r--r--net/quic/test_tools/mock_crypto_client_stream.h5
-rw-r--r--net/quic/test_tools/mock_crypto_client_stream_factory.cc2
-rw-r--r--net/quic/test_tools/quic_test_utils.cc18
-rw-r--r--net/quic/test_tools/quic_test_utils.h28
-rw-r--r--net/socket/client_socket_pool_base.cc12
-rw-r--r--net/socket/client_socket_pool_base.h15
-rw-r--r--net/socket/client_socket_pool_base_unittest.cc66
-rw-r--r--net/socket/client_socket_pool_manager.cc3
-rw-r--r--net/socket/nss_ssl_util.cc8
-rw-r--r--net/socket/socks5_client_socket.cc46
-rw-r--r--net/socket/socks5_client_socket.h3
-rw-r--r--net/socket/socks_client_socket.cc44
-rw-r--r--net/socket/socks_client_socket.h6
-rw-r--r--net/socket/ssl_client_socket_nss.cc54
-rw-r--r--net/socket/ssl_client_socket_openssl.cc29
-rw-r--r--net/socket/ssl_client_socket_openssl.h4
-rw-r--r--net/socket/ssl_client_socket_unittest.cc56
-rw-r--r--net/socket/stream_listen_socket.cc2
-rw-r--r--net/socket/stream_socket.h6
-rw-r--r--net/socket/tcp_socket_libevent.cc12
-rw-r--r--net/socket/tcp_socket_win.cc7
-rw-r--r--net/spdy/spdy_http_stream_unittest.cc4
-rw-r--r--net/spdy/spdy_session.cc40
-rw-r--r--net/spdy/spdy_session.h20
-rw-r--r--net/spdy/spdy_session_pool.cc21
-rw-r--r--net/spdy/spdy_session_pool.h9
-rw-r--r--net/spdy/spdy_session_unittest.cc17
-rw-r--r--net/spdy/spdy_stream.cc7
-rw-r--r--net/spdy/spdy_stream.h5
-rw-r--r--net/spdy/spdy_test_util_common.cc40
-rw-r--r--net/spdy/spdy_test_util_common.h15
-rw-r--r--net/ssl/server_bound_cert_service_unittest.cc8
-rw-r--r--net/ssl/ssl_config.cc69
-rw-r--r--net/ssl/ssl_config.h156
-rw-r--r--net/ssl/ssl_config_service.cc78
-rw-r--r--net/ssl/ssl_config_service.h151
-rw-r--r--net/ssl/ssl_config_service_unittest.cc5
-rw-r--r--net/test/embedded_test_server/embedded_test_server.cc1
-rw-r--r--net/tools/dump_cache/dump_files.cc9
-rw-r--r--net/tools/fetch/fetch_client.cc225
-rw-r--r--net/tools/fetch/fetch_server.cc57
-rw-r--r--net/tools/fetch/http_listen_socket.cc249
-rw-r--r--net/tools/fetch/http_listen_socket.h70
-rw-r--r--net/tools/fetch/http_server.cc12
-rw-r--r--net/tools/fetch/http_server.h26
-rw-r--r--net/tools/fetch/http_server_request_info.cc11
-rw-r--r--net/tools/fetch/http_server_request_info.h26
-rw-r--r--net/tools/fetch/http_server_response_info.cc11
-rw-r--r--net/tools/fetch/http_server_response_info.h39
-rw-r--r--net/tools/fetch/http_session.cc33
-rw-r--r--net/tools/fetch/http_session.h27
-rw-r--r--net/tools/quic/end_to_end_test.cc7
-rw-r--r--net/tools/quic/quic_client_bin.cc4
-rw-r--r--net/tools/quic/quic_client_session.cc10
-rw-r--r--net/tools/quic/quic_client_session.h10
-rw-r--r--net/tools/quic/quic_client_session_test.cc2
-rw-r--r--net/tools/quic/quic_spdy_client_stream_test.cc3
-rw-r--r--net/tools/quic/test_tools/quic_test_client.cc3
-rwxr-xr-xnet/tools/testserver/testserver.py5
-rw-r--r--net/udp/udp_socket_libevent.cc8
-rw-r--r--net/udp/udp_socket_win.cc44
-rw-r--r--net/url_request/url_request_context_builder.cc4
-rw-r--r--net/url_request/url_request_http_job.cc58
-rw-r--r--net/url_request/url_request_http_job.h5
-rw-r--r--net/url_request/url_request_job.cc11
-rw-r--r--net/url_request/url_request_job.h5
-rw-r--r--net/url_request/url_request_job_unittest.cc28
-rw-r--r--net/url_request/url_request_test_util.cc18
-rw-r--r--net/url_request/url_request_test_util.h18
-rw-r--r--net/url_request/url_request_unittest.cc289
-rw-r--r--net/websockets/websocket_channel.cc128
-rw-r--r--net/websockets/websocket_channel.h56
-rw-r--r--net/websockets/websocket_channel_test.cc309
-rw-r--r--net/websockets/websocket_job_test.cc6
225 files changed, 7749 insertions, 2804 deletions
diff --git a/net/base/file_stream_context.cc b/net/base/file_stream_context.cc
index 43825e3109..5d1fdbb013 100644
--- a/net/base/file_stream_context.cc
+++ b/net/base/file_stream_context.cc
@@ -274,21 +274,16 @@ void FileStream::Context::CloseAndDelete() {
DCHECK(!async_in_progress_);
if (file_.IsValid()) {
- bool posted = task_runner_.get()->PostTaskAndReply(
+ bool posted = task_runner_.get()->PostTask(
FROM_HERE,
base::Bind(base::IgnoreResult(&Context::CloseFileImpl),
- base::Unretained(this)),
- base::Bind(&Context::OnCloseCompleted, base::Unretained(this)));
+ base::Owned(this)));
DCHECK(posted);
} else {
delete this;
}
}
-void FileStream::Context::OnCloseCompleted() {
- delete this;
-}
-
Int64CompletionCallback FileStream::Context::IntToInt64(
const CompletionCallback& callback) {
return base::Bind(&CallInt64ToInt, callback);
diff --git a/net/base/file_stream_context.h b/net/base/file_stream_context.h
index e7711c9bc2..c70a8f6149 100644
--- a/net/base/file_stream_context.h
+++ b/net/base/file_stream_context.h
@@ -168,7 +168,6 @@ class FileStream::Context {
OpenResult open_result);
void CloseAndDelete();
- void OnCloseCompleted();
Int64CompletionCallback IntToInt64(const CompletionCallback& callback);
diff --git a/net/base/ip_mapping_rules.cc b/net/base/ip_mapping_rules.cc
deleted file mode 100644
index fbc887da42..0000000000
--- a/net/base/ip_mapping_rules.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2014 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/base/ip_mapping_rules.h"
-
-#include <vector>
-
-#include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/stl_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_tokenizer.h"
-#include "base/strings/string_util.h"
-#include "net/base/address_list.h"
-#include "net/base/ip_pattern.h"
-
-namespace net {
-
-class IPMappingRules::Rule {
- public:
- Rule(const IPAddressNumber& address, IPPattern* pattern)
- : pattern_(pattern),
- replacement_address_(address) {
- }
-
- bool Match(const IPAddressNumber& address) const {
- return pattern_->Match(address);
- }
-
- const IPAddressNumber& replacement_address() const {
- return replacement_address_;
- }
-
- private:
- scoped_ptr<IPPattern> pattern_; // The pattern we can match.
- IPAddressNumber replacement_address_; // The replacement address we provide.
- DISALLOW_COPY_AND_ASSIGN(Rule);
-};
-
-IPMappingRules::IPMappingRules() {}
-
-IPMappingRules::~IPMappingRules() {
- STLDeleteElements(&rules_);
-}
-
-bool IPMappingRules::RewriteAddresses(AddressList* addresses) const {
- // Last rule pushed into the list has the highest priority, and is tested
- // first.
- for (RuleList::const_reverse_iterator rule_it = rules_.rbegin();
- rule_it != rules_.rend(); ++rule_it) {
- for (AddressList::iterator address_it = addresses->begin();
- address_it != addresses->end(); ++address_it) {
- if (!(*rule_it)->Match(address_it->address()))
- continue;
- // We have a match.
- int port = address_it->port();
- addresses->insert(addresses->begin(),
- IPEndPoint((*rule_it)->replacement_address(), port));
- return true;
- }
- }
- return false;
-}
-
-bool IPMappingRules::AddRuleFromString(const std::string& rule_string) {
- std::string trimmed;
- base::TrimWhitespaceASCII(rule_string, base::TRIM_ALL, &trimmed);
- if (trimmed.empty())
- return true; // Allow empty rules.
-
- std::vector<std::string> parts;
- base::SplitString(trimmed, ' ', &parts);
-
- if (parts.size() != 3) {
- DVLOG(1) << "Rule has wrong number of parts: " << rule_string;
- return false;
- }
-
- if (!LowerCaseEqualsASCII(parts[0], "preface")) {
- DVLOG(1) << "Unknown directive: " << rule_string;
- return false;
- }
-
- scoped_ptr<IPPattern> pattern(new IPPattern);
- if (!pattern->ParsePattern(parts[1])) {
- DVLOG(1) << "Unacceptable pattern: " << rule_string;
- return false;
- }
-
- IPAddressNumber address;
- if (!ParseIPLiteralToNumber(parts[2], &address)) {
- DVLOG(1) << "Invalid replacement address: " << rule_string;
- return false;
- }
-
- if (pattern->is_ipv4() != (address.size() == kIPv4AddressSize)) {
- DVLOG(1) << "Mixture of IPv4 and IPv6: " << rule_string;
- return false;
- }
- rules_.push_back(new Rule(address, pattern.release()));
- return true;
-}
-
-bool IPMappingRules::SetRulesFromString(const std::string& rules_string) {
- STLDeleteElements(&rules_);
-
- base::StringTokenizer rules(rules_string, ";");
- while (rules.GetNext()) {
- if (!AddRuleFromString(rules.token())) {
- DVLOG(1) << "Failed parsing rule: " << rules.token();
- STLDeleteElements(&rules_);
- return false;
- }
- }
- return true;
-}
-
-} // namespace net
diff --git a/net/base/ip_mapping_rules.h b/net/base/ip_mapping_rules.h
deleted file mode 100644
index 7291abfe8d..0000000000
--- a/net/base/ip_mapping_rules.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2014 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.
-
-#ifndef NET_BASE_IP_MAPPING_RULES_H_
-#define NET_BASE_IP_MAPPING_RULES_H_
-
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "net/base/net_export.h"
-
-namespace net {
-
-class AddressList;
-
-// This class contains a list of rules, that can be used to process (Rewrite) a
-// set of DNS resolutions (IP addresses) in accordance with those rules.
-// Currently the only rules supported use a pattern match against some given IP
-// addresses, and may, if there is a match, place one new IP address at the
-// start of the rewritten address list (re: the "PREFACE" directive). This
-// supports a common use case where the matching detects an address in a given
-// edge network server group, and the inserted address points to a server that
-// is expected to handle all requests that would otherwise have gone to the
-// given group of servers.
-class NET_EXPORT_PRIVATE IPMappingRules {
- public:
- IPMappingRules();
- ~IPMappingRules();
-
- // Modifies |*addresses| based on the current rules. Returns true if
- // |addresses| was modified, false otherwise.
- bool RewriteAddresses(AddressList* addresses) const;
-
- // Adds a rule to this mapper.
- // Rules are evaluated against an address list until a first matching rule is
- // found that applies, causing a modification of the address list.
- // Each rule consists of one or more of the following pattern and action
- // directives.
- //
- // RULE: CHANGE_DIRECTIVE | EMPTY
- // CHANGE_DIRECTIVE: "PREFACE" SPACE IP_PATTERN SPACE IP_LITERAL
- // SPACE: " "
- // EMPTY:
- //
- // IP_LITERAL: IP_V6_LITERAL | IP_V4_LITERAL
- //
- // IP_V4_LITERAL: OCTET "." OCTET "." OCTET "." OCTET
- // OCTET: decimal number in range 0 ... 255
- //
- // IP_V6_LITERAL: HEX_COMPONENT | IP_V6_LITERAL ":" HEX_COMPONENT
- // HEX_COMPONENT: hexadecimal values with no more than 4 hex digits
- //
- // IP_PATTERN: IP_V6_PATTERN | IP_V4_PATTERN
- //
- // IP_V6_PATTERN: HEX_PATTERN | IP_V6_PATTERN ":" HEX_PATTERN
- // HEX_PATTERN: HEX_COMPONENT | "[" HEX_GROUP_PATTERN "]" | "*"
- // HEX_GROUP_PATTERN: HEX_RANGE | HEX_GROUP_PATTERN "," HEX_RANGE
- // HEX_RANGE: HEX_COMPONENT | HEX_COMPONENT "-" HEX_COMPONENT
- //
- // IP_V4_PATTERN: OCTET_PATTERN "." OCTET_PATTERN "." OCTET_PATTERN
- // "." OCTET_PATTERN
- // OCTET_PATTERN: OCTET | "[" OCTET_GROUP_PATTERN "]" | "*"
- // OCTET_GROUP_PATTERN: OCTET_RANGE | OCTET_GROUP_PATTERN "," OCTET_RANGE
- // OCTET_RANGE: OCTET | OCTET "-" OCTET
- //
- // All literals are required to have all their components specified (4
- // components for IPv4, and 8 for IPv6). Specifically, there is currently no
- // support for elided compenents in an IPv6 address (e.g., "::").
- // Returns true if the rule was successfully parsed and added.
- bool AddRuleFromString(const std::string& rule_string);
-
- // Sets the rules from a semicolon separated list of rules.
- // Returns true if all the rules were successfully parsed and added.
- bool SetRulesFromString(const std::string& rules_string);
-
- private:
- class Rule;
- typedef std::vector<Rule*> RuleList;
-
- // We own all rules in this list, and are responsible for their destruction.
- RuleList rules_;
-
- DISALLOW_COPY_AND_ASSIGN(IPMappingRules);
-};
-
-} // namespace net
-
-#endif // NET_BASE_IP_MAPPING_RULES_H_
diff --git a/net/base/ip_mapping_rules_unittest.cc b/net/base/ip_mapping_rules_unittest.cc
deleted file mode 100644
index 7fd599f345..0000000000
--- a/net/base/ip_mapping_rules_unittest.cc
+++ /dev/null
@@ -1,307 +0,0 @@
-// Copyright 2014 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/base/ip_mapping_rules.h"
-
-#include "net/base/address_list.h"
-#include "net/base/ip_endpoint.h"
-#include "net/base/net_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace net {
-
-namespace {
-
-TEST(IPMappingRulesTest, EmptyRules) {
- AddressList addresses;
- // Null rule does nothing to null list.
- EXPECT_EQ(0u, addresses.size());
- IPMappingRules rules;
- EXPECT_FALSE(rules.RewriteAddresses(&addresses));
- EXPECT_EQ(0u, addresses.size());
-
- IPAddressNumber address;
- EXPECT_TRUE(ParseIPLiteralToNumber("1.2.3.4", &address));
- int port = 80;
- IPEndPoint endpoint(address, port);
- addresses.push_back(endpoint);
- // Null rule does nothing to a simple list.
- ASSERT_EQ(1u, addresses.size());
- EXPECT_EQ(addresses[0], endpoint);
- EXPECT_FALSE(rules.RewriteAddresses(&addresses));
- ASSERT_EQ(1u, addresses.size());
- EXPECT_EQ(addresses[0], endpoint);
-
- EXPECT_TRUE(ParseIPLiteralToNumber("1:2:3:4:a:b:c:def", &address));
- IPEndPoint endpoint2(address, port);
- addresses.push_back(endpoint2);
- // Null rule does nothing to a simple list.
- ASSERT_EQ(2u, addresses.size());
- EXPECT_EQ(addresses[0], endpoint);
- EXPECT_EQ(addresses[1], endpoint2);
- EXPECT_FALSE(rules.RewriteAddresses(&addresses));
- ASSERT_EQ(2u, addresses.size());
- EXPECT_EQ(addresses[0], endpoint);
- EXPECT_EQ(addresses[1], endpoint2);
-}
-
-// The |inserted_ip| must have a short final component, so that we can just
-// append a digit, and still be a valid (but different) ip address.
-void MatchingInsertionHelper(const std::string& matchable_ip,
- const std::string& matching_ip_pattern,
- const std::string& inserted_ip,
- bool should_match) {
- AddressList addresses;
-
- IPAddressNumber address;
- EXPECT_TRUE(ParseIPLiteralToNumber(matchable_ip, &address));
- int port = 80;
- IPEndPoint endpoint(address, port);
- addresses.push_back(endpoint);
- // Match the string with a precisely crafted pattern.
- std::string rule_text("Preface ");
- rule_text += matching_ip_pattern;
- rule_text += " ";
- rule_text += inserted_ip;
- IPMappingRules rules;
- EXPECT_TRUE(rules.AddRuleFromString(rule_text));
-
- ASSERT_EQ(1u, addresses.size());
- EXPECT_EQ(addresses[0], endpoint);
- EXPECT_EQ(should_match, rules.RewriteAddresses(&addresses));
- if (!should_match) {
- ASSERT_EQ(1u, addresses.size());
- EXPECT_EQ(addresses[0], endpoint);
- return; // Don't bother with the rest of the test.
- }
-
- ASSERT_EQ(2u, addresses.size());
- EXPECT_EQ(addresses[1], endpoint);
- IPAddressNumber inserted_ip_adress_number;
- EXPECT_TRUE(ParseIPLiteralToNumber(inserted_ip, &inserted_ip_adress_number));
- EXPECT_EQ(inserted_ip_adress_number, addresses[0].address());
-
- // Now we have two addresses. We'll use new rules, to match the second
- // address (the original address shifted over) in the list of addresses.
- rule_text = "Preface "; // Build up a new rule.
- rule_text += matching_ip_pattern;
- rule_text += " ";
- // Change the inserted IP mildly.
- std::string different_inserted_ip = inserted_ip + "3";
- rule_text += different_inserted_ip;
- // If we don't overwrite the old rule, it will fire first!
- EXPECT_TRUE(rules.SetRulesFromString(rule_text)); // Overwrite old rules.
-
- ASSERT_EQ(2u, addresses.size());
- EXPECT_EQ(addresses[1], endpoint);
- EXPECT_TRUE(rules.RewriteAddresses(&addresses));
- ASSERT_EQ(3u, addresses.size());
- EXPECT_EQ(addresses[2], endpoint);
- EXPECT_TRUE(ParseIPLiteralToNumber(different_inserted_ip,
- &inserted_ip_adress_number));
- EXPECT_EQ(inserted_ip_adress_number, addresses[0].address());
-}
-
-TEST(IPMappingRulesTest, SimpleMatchingInsertionIPV4) {
- std::string matchable_ip("1.2.3.4");
- std::string matching_ip_pattern(matchable_ip);
- std::string new_preface_ip("7.8.9.24");
- bool should_match = true;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, SimpleMatchingInsertionIPV6) {
- std::string matchable_ip("1:2:3:4:5:6:7:8");
- std::string matching_ip_pattern(matchable_ip);
- std::string new_preface_ip("A:B:C:D:1:2:3:4");
- bool should_match = true;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, SimpleMissatchingInsertionIPV4) {
- std::string matchable_ip("1.2.3.4");
- std::string matching_ip_pattern(matchable_ip + "7");
- std::string new_preface_ip("7.8.9.24");
- bool should_match = false;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, SimpleMisatchingInsertionIPV6) {
- std::string matchable_ip("1:2:3:4:5:6:7:8");
- std::string matching_ip_pattern(matchable_ip + "e");
- std::string new_preface_ip("A:B:C:D:1:2:3:4");
- bool should_match = false;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, AlternativeMatchingInsertionIPV4) {
- std::string matchable_ip("1.2.3.4");
- std::string matching_ip_pattern("1.2.3.[2,4,6]");
- std::string new_preface_ip("7.8.9.24");
- bool should_match = true;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, AlternativeMatchingInsertionIPV6) {
- std::string matchable_ip("1:2:3:4:5:6:7:abcd");
- std::string matching_ip_pattern("1:2:3:4:5:6:7:[abc2,abc9,abcd,cdef]");
- std::string new_preface_ip("A:B:C:D:1:2:3:4");
- bool should_match = true;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, RangeMatchingInsertionIPV4) {
- std::string matchable_ip("1.2.3.4");
- std::string matching_ip_pattern("1.2.3.[2-6,22]");
- std::string new_preface_ip("7.8.9.24");
- bool should_match = true;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, RandgeMatchingInsertionIPV6) {
- std::string matchable_ip("1:2:3:4:5:6:7:abcd");
- // Note: This test can detect confusion over high vs low-order bytes in an
- // IPv6 component. If the code confused them, then this range would not
- // include the matchable_ip.
- std::string matching_ip_pattern("1:2:3:4:5:6:7:[abc2-cdc2]");
- std::string new_preface_ip("A:B:C:D:1:2:3:4");
- bool should_match = true;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, WildMatchingInsertionIPV4) {
- std::string matchable_ip("1.2.3.4");
- std::string matching_ip_pattern("1.2.3.*");
- std::string new_preface_ip("7.8.9.24");
- bool should_match = true;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, WildMatchingInsertionIPV6) {
- std::string matchable_ip("1:2:3:4:5:6:7:abcd");
- // Note: This test can detect confusion over high vs low-order bytes in an
- // IPv6 component. If the code confused them, then this range would not
- // include the matchable_ip.
- std::string matching_ip_pattern("1:2:3:4:5:6:7:*");
- std::string new_preface_ip("A:B:C:D:1:2:3:4");
- bool should_match = true;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, WildNotMatchingInsertionIPV4) {
- std::string matchable_ip("1.2.3.4");
- std::string matching_ip_pattern("*.200.*.*");
- std::string new_preface_ip("7.8.9.24");
- bool should_match = false;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, WildNotMatchingInsertionIPV6) {
- std::string matchable_ip("1:2:3:4:5:6:7:8");
- // Note: This test can detect confusion over high vs low-order bytes in an
- // IPv6 component. If the code confused them, then this range would not
- // include the matchable_ip.
- std::string matching_ip_pattern("*:*:37af:*:*:*:*:*");
- std::string new_preface_ip("A:B:C:D:1:2:3:4");
- bool should_match = false;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-TEST(IPMappingRulesTest, IPv4NotMatchForIPV6) {
- std::string matchable_ip("1:2:3:4:5:6:7:abcd");
- // Note: This test can detect confusion over high vs low-order bytes in an
- // IPv6 component. If the code confused them, then this range would not
- // include the matchable_ip.
- std::string matching_ip_pattern("1.2.3.4");
- std::string new_preface_ip("10.20.30.40"); // Compatible with pattern.
- bool should_match = false;
- MatchingInsertionHelper(matchable_ip, matching_ip_pattern, new_preface_ip,
- should_match);
-}
-
-// Parsing bad rules should silently discard the rule (and never crash).
-TEST(IPMappingRulesTest, ParseInvalidRules) {
- IPMappingRules rules;
-
- EXPECT_FALSE(rules.AddRuleFromString("Too short"));
- EXPECT_FALSE(rules.AddRuleFromString("Preface much too long"));
- EXPECT_FALSE(rules.AddRuleFromString("PrefaceNotSpelled 1.2.3.4 1.2.3.4"));
-
- // Ipv4 problems
- EXPECT_FALSE(rules.AddRuleFromString("Preface 1.2.a.4 1.2.3.4"));
- EXPECT_FALSE(rules.AddRuleFromString("Preface 1.2.3.4.5 1.2.3.4"));
- EXPECT_FALSE(rules.AddRuleFromString("Preface 1.2.3.4 1.2.3.4.5"));
- EXPECT_FALSE(rules.AddRuleFromString("Preface 1.2.3.4 1.2.3.4-5"));
- EXPECT_FALSE(rules.AddRuleFromString("Preface 1.2.3.4-5-6 1.2.3.4"));
-
- // IPv6 problems
- EXPECT_FALSE(rules.AddRuleFromString(
- "Preface 1:2:3:4:5:6:7:g 1:2:3:4:5:6:7:8"));
- EXPECT_FALSE(rules.AddRuleFromString(
- "Preface 1:2:3:4:5:6:7:8 1:g:3:4:5:6:7:8"));
- EXPECT_FALSE(rules.AddRuleFromString(
- "Preface 1:2:3:4:5:6:7:8:9 1:2:3:4:5:6:7:8"));
- EXPECT_FALSE(rules.AddRuleFromString(
- "Preface 1:2:3:4:5:6:7:8 1:2:3:4:5:6:7:8:0"));
- EXPECT_FALSE(rules.AddRuleFromString(
- "Preface 1:2:3:4:5:6:7:8 1:2:3:4:5:6:7:8-A"));
- EXPECT_FALSE(rules.AddRuleFromString(
- "Preface 1:2:3:4:5:6:7:8-A-B 1:2:3:4:5:6:7:8"));
-
- // Don't mix ipv4 and ipv6.
- EXPECT_FALSE(rules.AddRuleFromString("Preface 1.2.3.4 1:2:3:4:5:6:7:8"));
-
- EXPECT_FALSE(rules.SetRulesFromString("Preface 1.2.3.4 5.6.7.8; bad"));
-}
-
-
-TEST(IPMappingRulesTest, FirstRuleToMatch) {
- std::string first_replacement("1.1.1.1");
- IPAddressNumber first_replacement_address;
- EXPECT_TRUE(ParseIPLiteralToNumber(first_replacement,
- &first_replacement_address));
-
- std::string second_replacement("2.2.2.2");
- IPAddressNumber second_replacement_address;
- EXPECT_TRUE(ParseIPLiteralToNumber(second_replacement,
- &second_replacement_address));
-
- IPMappingRules rules;
- EXPECT_TRUE(
- rules.SetRulesFromString("Preface *.*.*.* " + first_replacement +
- ";Preface *.*.*.* " + second_replacement));
-
- IPAddressNumber address;
- EXPECT_TRUE(ParseIPLiteralToNumber("7.7.7.7", &address));
- int port = 80;
- IPEndPoint endpoint(address, port);
- AddressList addresses;
- addresses.push_back(endpoint);
-
- ASSERT_EQ(1u, addresses.size());
- EXPECT_EQ(addresses[0], endpoint);
- EXPECT_TRUE(rules.RewriteAddresses(&addresses));
- ASSERT_EQ(2u, addresses.size());
- EXPECT_EQ(addresses[1], endpoint);
- // The last rule added to the list has the highest priority (overriding
- // previous rules, and matching first).
- EXPECT_NE(addresses[0].address(), first_replacement_address);
- EXPECT_EQ(addresses[0].address(), second_replacement_address);
-}
-
-} // namespace
-
-} // namespace net
diff --git a/net/base/net_error_list.h b/net/base/net_error_list.h
index b2ddd4a1ae..37c84c7f2a 100644
--- a/net/base/net_error_list.h
+++ b/net/base/net_error_list.h
@@ -313,6 +313,12 @@ NET_ERROR(CT_NO_SCTS_VERIFIED_OK, -158)
// The SSL server sent us a fatal unrecognized_name alert.
NET_ERROR(SSL_UNRECOGNIZED_NAME_ALERT, -159)
+// Failed to set or change the socket's receive buffer size as requested
+NET_ERROR(SOCKET_SET_RECEIVE_BUFFER_SIZE_ERROR, -160)
+
+// Failed to set or change the socket's send buffer size as requested.
+NET_ERROR(SOCKET_SET_SEND_BUFFER_SIZE_ERROR, -161)
+
// Certificate error codes
//
// The values of certificate error codes must be consecutive.
diff --git a/net/base/net_util.h b/net/base/net_util.h
index 04a9b2dfbe..8a20a25811 100644
--- a/net/base/net_util.h
+++ b/net/base/net_util.h
@@ -530,10 +530,13 @@ struct NET_EXPORT NetworkInterface {
typedef std::vector<NetworkInterface> NetworkInterfaceList;
-// Policy settings to include/exclude VMWare host only network interfaces.
-enum HostScopeVirtualInterfacePolicy {
- INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES,
- EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES,
+// Policy settings to include/exclude network interfaces.
+enum HostAddressSelectionPolicy {
+ EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES = 0x1,
+ INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES = 0x2,
+ // Include temp address only when interface has both permanent and
+ // temp addresses.
+ INCLUDE_ONLY_TEMP_IPV6_ADDRESS_IF_POSSIBLE = 0x4,
};
// Returns list of network interfaces except loopback interface. If an
@@ -541,7 +544,7 @@ enum HostScopeVirtualInterfacePolicy {
// the list for each address.
// Can be called only on a thread that allows IO.
NET_EXPORT bool GetNetworkList(NetworkInterfaceList* networks,
- HostScopeVirtualInterfacePolicy policy);
+ int policy);
// General category of the IEEE 802.11 (wifi) physical layer operating mode.
enum WifiPHYLayerProtocol {
diff --git a/net/base/net_util_posix.cc b/net/base/net_util_posix.cc
index 8b9e067f4f..95b963e7a6 100644
--- a/net/base/net_util_posix.cc
+++ b/net/base/net_util_posix.cc
@@ -4,6 +4,7 @@
#include "net/base/net_util.h"
+#include <set>
#include <sys/types.h>
#include "base/files/file_path.h"
@@ -23,12 +24,67 @@
#include <net/if.h>
#include <netinet/in.h>
+#if defined(OS_MACOSX) && !defined(OS_IOS)
+#include <netinet/in_var.h>
+#include <sys/ioctl.h>
+#endif
+
#if defined(OS_ANDROID)
#include "net/android/network_library.h"
#endif
namespace net {
+namespace {
+
+#if !defined(OS_ANDROID)
+
+struct NetworkInterfaceInfo {
+ NetworkInterfaceInfo() : permanent(true) { }
+
+ bool permanent; // IPv6 has notion of temporary address. If the address is
+ // IPv6 and it's temporary this field will be false.
+ NetworkInterface interface;
+};
+
+// This method will remove permanent IPv6 addresses if a temporary address
+// is available for same network interface.
+void RemovePermanentIPv6AddressesWhereTemporaryExists(
+ std::vector<NetworkInterfaceInfo>* infos) {
+ if (!infos || infos->empty())
+ return;
+
+ // Build a set containing the names of interfaces with a temp IPv6 address
+ std::set<std::string> ifaces_with_temp_addrs;
+ std::vector<NetworkInterfaceInfo>::iterator i;
+ for (i = infos->begin(); i != infos->end(); ++i) {
+ if (!i->permanent && i->interface.address.size() == kIPv6AddressSize) {
+ ifaces_with_temp_addrs.insert(i->interface.name);
+ }
+ }
+
+ // If there are no such interfaces then there's no further work.
+ if (ifaces_with_temp_addrs.empty())
+ return;
+
+ // Search for permenent addresses belonging to same network interface.
+ for (i = infos->begin(); i != infos->end(); ) {
+ // If the address is IPv6 and it's permanent and there is temporary
+ // address for it, then we can remove this address.
+ if ((i->interface.address.size() == kIPv6AddressSize) && i->permanent &&
+ (ifaces_with_temp_addrs.find(i->interface.name) !=
+ ifaces_with_temp_addrs.end())) {
+ i = infos->erase(i);
+ } else {
+ ++i;
+ }
+ }
+}
+
+#endif
+
+} // namespace
+
bool FileURLToFilePath(const GURL& url, base::FilePath* path) {
*path = base::FilePath();
std::string& file_path_str = const_cast<std::string&>(path->value());
@@ -63,8 +119,7 @@ bool FileURLToFilePath(const GURL& url, base::FilePath* path) {
return !file_path_str.empty();
}
-bool GetNetworkList(NetworkInterfaceList* networks,
- HostScopeVirtualInterfacePolicy policy) {
+bool GetNetworkList(NetworkInterfaceList* networks, int policy) {
#if defined(OS_ANDROID)
std::string network_list = android::GetNetworkList();
base::StringTokenizer network_interfaces(network_list, "\n");
@@ -94,12 +149,21 @@ bool GetNetworkList(NetworkInterfaceList* networks,
// getifaddrs() may require IO operations.
base::ThreadRestrictions::AssertIOAllowed();
+ int ioctl_socket = -1;
+ if (policy & INCLUDE_ONLY_TEMP_IPV6_ADDRESS_IF_POSSIBLE) {
+ // we need a socket to query information about temporary address.
+ ioctl_socket = socket(AF_INET6, SOCK_DGRAM, 0);
+ DCHECK_GT(ioctl_socket, 0);
+ }
+
ifaddrs *interfaces;
if (getifaddrs(&interfaces) < 0) {
PLOG(ERROR) << "getifaddrs";
return false;
}
+ std::vector<NetworkInterfaceInfo> network_infos;
+
// Enumerate the addresses assigned to network interfaces which are up.
for (ifaddrs *interface = interfaces;
interface != NULL;
@@ -141,11 +205,29 @@ bool GetNetworkList(NetworkInterfaceList* networks,
const std::string& name = interface->ifa_name;
// Filter out VMware interfaces, typically named vmnet1 and vmnet8.
- if (policy == EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES &&
+ if ((policy & EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES) &&
((name.find("vmnet") != std::string::npos) ||
(name.find("vnic") != std::string::npos))) {
continue;
}
+
+ NetworkInterfaceInfo network_info;
+#if defined(OS_MACOSX) && !defined(OS_IOS)
+ // Check if this is a temporary address. Currently this is only supported
+ // on Mac.
+ if ((policy & INCLUDE_ONLY_TEMP_IPV6_ADDRESS_IF_POSSIBLE) &&
+ ioctl_socket >= 0 && addr->sa_family == AF_INET6) {
+ struct in6_ifreq ifr = {};
+ strncpy(ifr.ifr_name, interface->ifa_name, sizeof(ifr.ifr_name) - 1);
+ memcpy(&ifr.ifr_ifru.ifru_addr, interface->ifa_addr,
+ interface->ifa_addr->sa_len);
+ int rv = ioctl(ioctl_socket, SIOCGIFAFLAG_IN6, &ifr);
+ if (rv >= 0) {
+ network_info.permanent = !(ifr.ifr_ifru.ifru_flags & IN6_IFF_TEMPORARY);
+ }
+ }
+#endif
+
IPEndPoint address;
if (address.FromSockAddr(addr, addr_size)) {
uint8 net_mask = 0;
@@ -159,15 +241,25 @@ bool GetNetworkList(NetworkInterfaceList* networks,
net_mask = MaskPrefixLength(netmask.address());
}
}
+ network_info.interface = NetworkInterface(
+ name, name, if_nametoindex(name.c_str()),
+ address.address(), net_mask);
- networks->push_back(
- NetworkInterface(name, name, if_nametoindex(name.c_str()),
- address.address(), net_mask));
+ network_infos.push_back(NetworkInterfaceInfo(network_info));
}
}
-
freeifaddrs(interfaces);
+ if (ioctl_socket >= 0) {
+ close(ioctl_socket);
+ }
+
+ if (policy & INCLUDE_ONLY_TEMP_IPV6_ADDRESS_IF_POSSIBLE) {
+ RemovePermanentIPv6AddressesWhereTemporaryExists(&network_infos);
+ }
+ for (size_t i = 0; i < network_infos.size(); ++i) {
+ networks->push_back(network_infos[i].interface);
+ }
return true;
#endif
}
diff --git a/net/base/net_util_win.cc b/net/base/net_util_win.cc
index f415808d8d..de85ce59e9 100644
--- a/net/base/net_util_win.cc
+++ b/net/base/net_util_win.cc
@@ -138,8 +138,7 @@ bool FileURLToFilePath(const GURL& url, base::FilePath* file_path) {
return true;
}
-bool GetNetworkList(NetworkInterfaceList* networks,
- HostScopeVirtualInterfacePolicy policy) {
+bool GetNetworkList(NetworkInterfaceList* networks, int policy) {
// GetAdaptersAddresses() may require IO operations.
base::ThreadRestrictions::AssertIOAllowed();
bool is_xp = base::win::GetVersion() < base::win::VERSION_VISTA;
diff --git a/net/base/network_change_notifier_win_unittest.cc b/net/base/network_change_notifier_win_unittest.cc
index 96dcd13e58..878060eefb 100644
--- a/net/base/network_change_notifier_win_unittest.cc
+++ b/net/base/network_change_notifier_win_unittest.cc
@@ -228,12 +228,14 @@ TEST_F(NetworkChangeNotifierWinTest, NetChangeWinFailStart) {
StartWatchingAndFail();
}
-TEST_F(NetworkChangeNotifierWinTest, NetChangeWinFailStartOnce) {
+// https://code.google.com/p/chromium/issues/detail?id=356401
+TEST_F(NetworkChangeNotifierWinTest, FLAKY_NetChangeWinFailStartOnce) {
StartWatchingAndFail();
RetryAndSucceed();
}
-TEST_F(NetworkChangeNotifierWinTest, NetChangeWinFailStartTwice) {
+// https://code.google.com/p/chromium/issues/detail?id=356401
+TEST_F(NetworkChangeNotifierWinTest, FLAKY_NetChangeWinFailStartTwice) {
StartWatchingAndFail();
RetryAndFail();
RetryAndSucceed();
@@ -244,13 +246,15 @@ TEST_F(NetworkChangeNotifierWinTest, NetChangeWinSignal) {
SignalAndSucceed();
}
-TEST_F(NetworkChangeNotifierWinTest, NetChangeWinFailSignalOnce) {
+// https://code.google.com/p/chromium/issues/detail?id=356401
+TEST_F(NetworkChangeNotifierWinTest, FLAKY_NetChangeWinFailSignalOnce) {
StartWatchingAndSucceed();
SignalAndFail();
RetryAndSucceed();
}
-TEST_F(NetworkChangeNotifierWinTest, NetChangeWinFailSignalTwice) {
+// https://code.google.com/p/chromium/issues/detail?id=356401
+TEST_F(NetworkChangeNotifierWinTest, FLAKY_NetChangeWinFailSignalTwice) {
StartWatchingAndSucceed();
SignalAndFail();
RetryAndFail();
diff --git a/net/base/network_delegate.cc b/net/base/network_delegate.cc
index 517868ab60..d30a4ab4c8 100644
--- a/net/base/network_delegate.cc
+++ b/net/base/network_delegate.cc
@@ -39,12 +39,16 @@ int NetworkDelegate::NotifyHeadersReceived(
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers) {
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) {
DCHECK(CalledOnValidThread());
DCHECK(original_response_headers);
DCHECK(!callback.is_null());
- return OnHeadersReceived(request, callback, original_response_headers,
- override_response_headers);
+ return OnHeadersReceived(request,
+ callback,
+ original_response_headers,
+ override_response_headers,
+ allowed_unsafe_redirect_url);
}
void NetworkDelegate::NotifyResponseStarted(URLRequest* request) {
@@ -155,7 +159,8 @@ int NetworkDelegate::OnHeadersReceived(
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers) {
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) {
return OK;
}
diff --git a/net/base/network_delegate.h b/net/base/network_delegate.h
index 882701ce5b..4f930cf6b7 100644
--- a/net/base/network_delegate.h
+++ b/net/base/network_delegate.h
@@ -69,7 +69,8 @@ class NET_EXPORT NetworkDelegate : public base::NonThreadSafe {
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers);
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url);
void NotifyBeforeRedirect(URLRequest* request,
const GURL& new_location);
void NotifyResponseStarted(URLRequest* request);
@@ -140,7 +141,8 @@ class NET_EXPORT NetworkDelegate : public base::NonThreadSafe {
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers);
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url);
// Called right after a redirect response code was received.
// |new_location| is only valid until OnURLRequestDestroyed is called for this
diff --git a/net/cert/cert_verify_proc.cc b/net/cert/cert_verify_proc.cc
index 04f330ff88..8ee4069752 100644
--- a/net/cert/cert_verify_proc.cc
+++ b/net/cert/cert_verify_proc.cc
@@ -20,7 +20,7 @@
#if defined(USE_NSS) || defined(OS_IOS)
#include "net/cert/cert_verify_proc_nss.h"
-#elif defined(USE_OPENSSL) && !defined(OS_ANDROID)
+#elif defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID)
#include "net/cert/cert_verify_proc_openssl.h"
#elif defined(OS_ANDROID)
#include "net/cert/cert_verify_proc_android.h"
@@ -167,7 +167,7 @@ bool ExaminePublicKeys(const scoped_refptr<X509Certificate>& cert,
CertVerifyProc* CertVerifyProc::CreateDefault() {
#if defined(USE_NSS) || defined(OS_IOS)
return new CertVerifyProcNSS();
-#elif defined(USE_OPENSSL) && !defined(OS_ANDROID)
+#elif defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID)
return new CertVerifyProcOpenSSL();
#elif defined(OS_ANDROID)
return new CertVerifyProcAndroid();
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc
index 9d7e7503ba..6567d1656f 100644
--- a/net/cert/cert_verify_proc_unittest.cc
+++ b/net/cert/cert_verify_proc_unittest.cc
@@ -157,7 +157,7 @@ TEST_F(CertVerifyProcTest, DISABLED_WithoutRevocationChecking) {
&verify_result));
}
-#if defined(OS_ANDROID) || defined(USE_OPENSSL)
+#if defined(OS_ANDROID) || defined(USE_OPENSSL_CERTS)
// TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported.
#define MAYBE_EVVerification DISABLED_EVVerification
#else
@@ -724,7 +724,7 @@ TEST_F(CertVerifyProcTest, InvalidKeyUsage) {
NULL,
empty_cert_list_,
&verify_result);
-#if defined(USE_OPENSSL) && !defined(OS_ANDROID)
+#if defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID)
// This certificate has two errors: "invalid key usage" and "untrusted CA".
// However, OpenSSL returns only one (the latter), and we can't detect
// the other errors.
@@ -1013,6 +1013,9 @@ TEST_F(CertVerifyProcTest, IsIssuedByKnownRootIgnoresTestRoots) {
EXPECT_EQ(0U, verify_result.cert_status);
// But should not be marked as a known root.
EXPECT_FALSE(verify_result.is_issued_by_known_root);
+
+ root_certs->Clear();
+ EXPECT_TRUE(root_certs->IsEmpty());
}
#if defined(OS_MACOSX) && !defined(OS_IOS)
@@ -1133,6 +1136,8 @@ TEST_F(CertVerifyProcTest, CybertrustGTERoot) {
EXPECT_EQ(OK, error);
EXPECT_EQ(0U, verify_result.cert_status);
+ TestRootCerts::GetInstance()->Clear();
+ EXPECT_TRUE(TestRootCerts::GetInstance()->IsEmpty());
}
#endif
@@ -1402,7 +1407,7 @@ TEST_P(CertVerifyProcWeakDigestTest, Verify) {
const WeakDigestTestData kVerifyRootCATestData[] = {
{ "weak_digest_md5_root.pem", "weak_digest_sha1_intermediate.pem",
"weak_digest_sha1_ee.pem", false, false, false },
-#if defined(USE_OPENSSL) || defined(OS_WIN)
+#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN)
// MD4 is not supported by OS X / NSS
{ "weak_digest_md4_root.pem", "weak_digest_sha1_intermediate.pem",
"weak_digest_sha1_ee.pem", false, false, false },
@@ -1417,7 +1422,7 @@ INSTANTIATE_TEST_CASE_P(VerifyRoot, CertVerifyProcWeakDigestTest,
const WeakDigestTestData kVerifyIntermediateCATestData[] = {
{ "weak_digest_sha1_root.pem", "weak_digest_md5_intermediate.pem",
"weak_digest_sha1_ee.pem", true, false, false },
-#if defined(USE_OPENSSL) || defined(OS_WIN)
+#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN)
// MD4 is not supported by OS X / NSS
{ "weak_digest_sha1_root.pem", "weak_digest_md4_intermediate.pem",
"weak_digest_sha1_ee.pem", false, true, false },
@@ -1440,7 +1445,7 @@ WRAPPED_INSTANTIATE_TEST_CASE_P(
const WeakDigestTestData kVerifyEndEntityTestData[] = {
{ "weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem",
"weak_digest_md5_ee.pem", true, false, false },
-#if defined(USE_OPENSSL) || defined(OS_WIN)
+#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN)
// MD4 is not supported by OS X / NSS
{ "weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem",
"weak_digest_md4_ee.pem", false, true, false },
@@ -1464,7 +1469,7 @@ WRAPPED_INSTANTIATE_TEST_CASE_P(MAYBE_VerifyEndEntity,
const WeakDigestTestData kVerifyIncompleteIntermediateTestData[] = {
{ NULL, "weak_digest_md5_intermediate.pem", "weak_digest_sha1_ee.pem",
true, false, false },
-#if defined(USE_OPENSSL) || defined(OS_WIN)
+#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN)
// MD4 is not supported by OS X / NSS
{ NULL, "weak_digest_md4_intermediate.pem", "weak_digest_sha1_ee.pem",
false, true, false },
@@ -1489,7 +1494,7 @@ WRAPPED_INSTANTIATE_TEST_CASE_P(
const WeakDigestTestData kVerifyIncompleteEETestData[] = {
{ NULL, "weak_digest_sha1_intermediate.pem", "weak_digest_md5_ee.pem",
true, false, false },
-#if defined(USE_OPENSSL) || defined(OS_WIN)
+#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN)
// MD4 is not supported by OS X / NSS
{ NULL, "weak_digest_sha1_intermediate.pem", "weak_digest_md4_ee.pem",
false, true, false },
@@ -1516,7 +1521,7 @@ const WeakDigestTestData kVerifyMixedTestData[] = {
"weak_digest_md2_ee.pem", true, false, true },
{ "weak_digest_sha1_root.pem", "weak_digest_md2_intermediate.pem",
"weak_digest_md5_ee.pem", true, false, true },
-#if defined(USE_OPENSSL) || defined(OS_WIN)
+#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN)
// MD4 is not supported by OS X / NSS
{ "weak_digest_sha1_root.pem", "weak_digest_md4_intermediate.pem",
"weak_digest_md2_ee.pem", false, true, true },
diff --git a/net/cert/test_root_certs.h b/net/cert/test_root_certs.h
index cf35a2af12..84c163a5bb 100644
--- a/net/cert/test_root_certs.h
+++ b/net/cert/test_root_certs.h
@@ -12,7 +12,7 @@
#if defined(USE_NSS) || defined(OS_IOS)
#include <list>
-#elif defined(USE_OPENSSL) && !defined(OS_ANDROID)
+#elif defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID)
#include <vector>
#elif defined(OS_WIN)
#include <windows.h>
@@ -25,7 +25,7 @@
#if defined(USE_NSS)
typedef struct CERTCertificateStr CERTCertificate;
-#elif defined(USE_OPENSSL) && !defined(OS_ANDROID)
+#elif defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID)
typedef struct x509_st X509;
#endif
@@ -78,7 +78,7 @@ class NET_EXPORT TestRootCerts {
// be trusted. By default, this is true, indicating that the TestRootCerts
// are used in addition to OS trust store.
void SetAllowSystemTrust(bool allow_system_trust);
-#elif defined(USE_OPENSSL) && !defined(OS_ANDROID)
+#elif defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID)
const std::vector<scoped_refptr<X509Certificate> >&
temporary_roots() const { return temporary_roots_; }
bool Contains(X509* cert) const;
@@ -106,7 +106,7 @@ class NET_EXPORT TestRootCerts {
// settings, in order to restore them when Clear() is called.
class TrustEntry;
std::list<TrustEntry*> trust_cache_;
-#elif defined(USE_OPENSSL) && !defined(OS_ANDROID)
+#elif defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID)
std::vector<scoped_refptr<X509Certificate> > temporary_roots_;
#elif defined(OS_WIN)
HCERTSTORE temporary_roots_;
diff --git a/net/cert/test_root_certs_unittest.cc b/net/cert/test_root_certs_unittest.cc
index 81926bee12..a2cf695f95 100644
--- a/net/cert/test_root_certs_unittest.cc
+++ b/net/cert/test_root_certs_unittest.cc
@@ -135,7 +135,7 @@ TEST(TestRootCertsTest, OverrideTrust) {
EXPECT_EQ(bad_verify_result.cert_status, restored_verify_result.cert_status);
}
-#if defined(USE_NSS) || (defined(USE_OPENSSL) && !defined(OS_ANDROID))
+#if defined(USE_NSS) || (defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID))
TEST(TestRootCertsTest, Contains) {
// Another test root certificate.
const char kRootCertificateFile2[] = "2048-rsa-root.pem";
diff --git a/net/cert/x509_certificate.h b/net/cert/x509_certificate.h
index 43ed01414e..7aa48f068f 100644
--- a/net/cert/x509_certificate.h
+++ b/net/cert/x509_certificate.h
@@ -25,7 +25,7 @@
#include <CoreFoundation/CFArray.h>
#include <Security/SecBase.h>
-#elif defined(USE_OPENSSL)
+#elif defined(USE_OPENSSL_CERTS)
// Forward declaration; real one in <x509.h>
typedef struct x509_st X509;
typedef struct x509_store_st X509_STORE;
@@ -58,7 +58,7 @@ class NET_EXPORT X509Certificate
typedef PCCERT_CONTEXT OSCertHandle;
#elif defined(OS_MACOSX)
typedef SecCertificateRef OSCertHandle;
-#elif defined(USE_OPENSSL)
+#elif defined(USE_OPENSSL_CERTS)
typedef X509* OSCertHandle;
#elif defined(USE_NSS)
typedef struct CERTCertificateStr* OSCertHandle;
@@ -304,7 +304,7 @@ class NET_EXPORT X509Certificate
PCCERT_CONTEXT CreateOSCertChainForCert() const;
#endif
-#if defined(USE_OPENSSL)
+#if defined(USE_OPENSSL_CERTS)
// Returns a handle to a global, in-memory certificate store. We
// use it for test code, e.g. importing the test server's certificate.
static X509_STORE* cert_store();
@@ -413,7 +413,7 @@ class NET_EXPORT X509Certificate
// Common object initialization code. Called by the constructors only.
void Initialize();
-#if defined(USE_OPENSSL)
+#if defined(USE_OPENSSL_CERTS)
// Resets the store returned by cert_store() to default state. Used by
// TestRootCerts to undo modifications.
static void ResetCertStore();
diff --git a/net/cert/x509_certificate_mac.cc b/net/cert/x509_certificate_mac.cc
index a7f862469b..ab479384a1 100644
--- a/net/cert/x509_certificate_mac.cc
+++ b/net/cert/x509_certificate_mac.cc
@@ -196,33 +196,6 @@ void AddCertificatesFromBytes(const char* data, size_t length,
}
}
-struct CSSMOIDString {
- const CSSM_OID* oid_;
- std::string string_;
-};
-
-typedef std::vector<CSSMOIDString> CSSMOIDStringVector;
-
-class ScopedEncodedCertResults {
- public:
- explicit ScopedEncodedCertResults(CSSM_TP_RESULT_SET* results)
- : results_(results) { }
- ~ScopedEncodedCertResults() {
- if (results_) {
- CSSM_ENCODED_CERT* encCert =
- reinterpret_cast<CSSM_ENCODED_CERT*>(results_->Results);
- for (uint32 i = 0; i < results_->NumberOfResults; i++) {
- crypto::CSSMFree(encCert[i].CertBlob.Data);
- }
- crypto::CSSMFree(results_->Results);
- crypto::CSSMFree(results_);
- }
- }
-
- private:
- CSSM_TP_RESULT_SET* results_;
-};
-
} // namespace
void X509Certificate::Initialize() {
diff --git a/net/cert_verify_status_android_java.target.darwin-arm.mk b/net/cert_verify_status_android_java.target.darwin-arm.mk
index 0ee66cf95f..1dfb9bd68b 100644
--- a/net/cert_verify_status_android_java.target.darwin-arm.mk
+++ b/net/cert_verify_status_android_java.target.darwin-arm.mk
@@ -94,6 +94,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -176,6 +177,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/cert_verify_status_android_java.target.darwin-mips.mk b/net/cert_verify_status_android_java.target.darwin-mips.mk
index 73fb42ad58..745c8c2bb1 100644
--- a/net/cert_verify_status_android_java.target.darwin-mips.mk
+++ b/net/cert_verify_status_android_java.target.darwin-mips.mk
@@ -93,6 +93,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -174,6 +175,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/cert_verify_status_android_java.target.darwin-x86.mk b/net/cert_verify_status_android_java.target.darwin-x86.mk
index df708b986c..492877cf67 100644
--- a/net/cert_verify_status_android_java.target.darwin-x86.mk
+++ b/net/cert_verify_status_android_java.target.darwin-x86.mk
@@ -95,6 +95,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -177,6 +178,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/cert_verify_status_android_java.target.darwin-x86_64.mk b/net/cert_verify_status_android_java.target.darwin-x86_64.mk
new file mode 100644
index 0000000000..cdabc2bda2
--- /dev/null
+++ b/net/cert_verify_status_android_java.target.darwin-x86_64.mk
@@ -0,0 +1,233 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_cert_verify_status_android_java_gyp
+LOCAL_MODULE_STEM := cert_verify_status_android_java
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+
+### Generated for rule "net_net_gyp_cert_verify_status_android_java_target_generate_java_constants":
+# "{'inputs': ['../build/android/gyp/util/build_utils.py', '../build/android/gyp/gcc_preprocess.py', 'android/cert_verify_status_android_list.h'], 'extension': 'template', 'outputs': ['$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'], 'variables': {'output_path': '$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'}, 'rule_name': 'generate_java_constants', 'rule_sources': ['android/java/CertVerifyStatusAndroid.template'], 'action': ['python', '../build/android/gyp/gcc_preprocess.py', '--include-path=..', '--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java', '--template=$(RULE_SOURCES)'], 'message': 'Generating Java from cpp template $(RULE_SOURCES)'}":
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java: $(LOCAL_PATH)/net/android/java/CertVerifyStatusAndroid.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/net/android/cert_verify_status_android_list.h $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/net; cd $(gyp_local_path)/net; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java" "--template=android/java/CertVerifyStatusAndroid.template"
+
+.PHONY: net_cert_verify_status_android_java_gyp_rule_trigger
+net_cert_verify_status_android_java_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java
+
+### Finished generating for all rules
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_GENERATED_SOURCES := \
+ net_cert_verify_status_android_java_gyp_rule_trigger
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES :=
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_cert_verify_status_android_java_gyp
+
+# Alias gyp target name.
+.PHONY: cert_verify_status_android_java
+cert_verify_status_android_java: net_cert_verify_status_android_java_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/cert_verify_status_android_java.target.linux-arm.mk b/net/cert_verify_status_android_java.target.linux-arm.mk
index 0ee66cf95f..1dfb9bd68b 100644
--- a/net/cert_verify_status_android_java.target.linux-arm.mk
+++ b/net/cert_verify_status_android_java.target.linux-arm.mk
@@ -94,6 +94,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -176,6 +177,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/cert_verify_status_android_java.target.linux-mips.mk b/net/cert_verify_status_android_java.target.linux-mips.mk
index 73fb42ad58..745c8c2bb1 100644
--- a/net/cert_verify_status_android_java.target.linux-mips.mk
+++ b/net/cert_verify_status_android_java.target.linux-mips.mk
@@ -93,6 +93,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -174,6 +175,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/cert_verify_status_android_java.target.linux-x86.mk b/net/cert_verify_status_android_java.target.linux-x86.mk
index df708b986c..492877cf67 100644
--- a/net/cert_verify_status_android_java.target.linux-x86.mk
+++ b/net/cert_verify_status_android_java.target.linux-x86.mk
@@ -95,6 +95,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -177,6 +178,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/cert_verify_status_android_java.target.linux-x86_64.mk b/net/cert_verify_status_android_java.target.linux-x86_64.mk
new file mode 100644
index 0000000000..cdabc2bda2
--- /dev/null
+++ b/net/cert_verify_status_android_java.target.linux-x86_64.mk
@@ -0,0 +1,233 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_cert_verify_status_android_java_gyp
+LOCAL_MODULE_STEM := cert_verify_status_android_java
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+
+### Generated for rule "net_net_gyp_cert_verify_status_android_java_target_generate_java_constants":
+# "{'inputs': ['../build/android/gyp/util/build_utils.py', '../build/android/gyp/gcc_preprocess.py', 'android/cert_verify_status_android_list.h'], 'extension': 'template', 'outputs': ['$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'], 'variables': {'output_path': '$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'}, 'rule_name': 'generate_java_constants', 'rule_sources': ['android/java/CertVerifyStatusAndroid.template'], 'action': ['python', '../build/android/gyp/gcc_preprocess.py', '--include-path=..', '--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java', '--template=$(RULE_SOURCES)'], 'message': 'Generating Java from cpp template $(RULE_SOURCES)'}":
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java: $(LOCAL_PATH)/net/android/java/CertVerifyStatusAndroid.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/net/android/cert_verify_status_android_list.h $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/net; cd $(gyp_local_path)/net; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java" "--template=android/java/CertVerifyStatusAndroid.template"
+
+.PHONY: net_cert_verify_status_android_java_gyp_rule_trigger
+net_cert_verify_status_android_java_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java
+
+### Finished generating for all rules
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertVerifyStatusAndroid.java
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_GENERATED_SOURCES := \
+ net_cert_verify_status_android_java_gyp_rule_trigger
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES :=
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_cert_verify_status_android_java_gyp
+
+# Alias gyp target name.
+.PHONY: cert_verify_status_android_java
+cert_verify_status_android_java: net_cert_verify_status_android_java_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/certificate_mime_types_java.target.darwin-arm.mk b/net/certificate_mime_types_java.target.darwin-arm.mk
index 65c5467137..9b2ad25704 100644
--- a/net/certificate_mime_types_java.target.darwin-arm.mk
+++ b/net/certificate_mime_types_java.target.darwin-arm.mk
@@ -94,6 +94,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -176,6 +177,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/certificate_mime_types_java.target.darwin-mips.mk b/net/certificate_mime_types_java.target.darwin-mips.mk
index 6cef8b573b..21f56e893a 100644
--- a/net/certificate_mime_types_java.target.darwin-mips.mk
+++ b/net/certificate_mime_types_java.target.darwin-mips.mk
@@ -93,6 +93,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -174,6 +175,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/certificate_mime_types_java.target.darwin-x86.mk b/net/certificate_mime_types_java.target.darwin-x86.mk
index 15771ebc48..3df90609fc 100644
--- a/net/certificate_mime_types_java.target.darwin-x86.mk
+++ b/net/certificate_mime_types_java.target.darwin-x86.mk
@@ -95,6 +95,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -177,6 +178,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/certificate_mime_types_java.target.darwin-x86_64.mk b/net/certificate_mime_types_java.target.darwin-x86_64.mk
new file mode 100644
index 0000000000..b424379376
--- /dev/null
+++ b/net/certificate_mime_types_java.target.darwin-x86_64.mk
@@ -0,0 +1,233 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_certificate_mime_types_java_gyp
+LOCAL_MODULE_STEM := certificate_mime_types_java
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+
+### Generated for rule "net_net_gyp_certificate_mime_types_java_target_generate_java_constants":
+# "{'inputs': ['../build/android/gyp/util/build_utils.py', '../build/android/gyp/gcc_preprocess.py', 'base/mime_util_certificate_type_list.h'], 'extension': 'template', 'outputs': ['$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'], 'variables': {'output_path': '$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'}, 'rule_name': 'generate_java_constants', 'rule_sources': ['android/java/CertificateMimeType.template'], 'action': ['python', '../build/android/gyp/gcc_preprocess.py', '--include-path=..', '--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java', '--template=$(RULE_SOURCES)'], 'message': 'Generating Java from cpp template $(RULE_SOURCES)'}":
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java: $(LOCAL_PATH)/net/android/java/CertificateMimeType.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/net/base/mime_util_certificate_type_list.h $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/net; cd $(gyp_local_path)/net; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java" "--template=android/java/CertificateMimeType.template"
+
+.PHONY: net_certificate_mime_types_java_gyp_rule_trigger
+net_certificate_mime_types_java_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java
+
+### Finished generating for all rules
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_GENERATED_SOURCES := \
+ net_certificate_mime_types_java_gyp_rule_trigger
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES :=
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_certificate_mime_types_java_gyp
+
+# Alias gyp target name.
+.PHONY: certificate_mime_types_java
+certificate_mime_types_java: net_certificate_mime_types_java_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/certificate_mime_types_java.target.linux-arm.mk b/net/certificate_mime_types_java.target.linux-arm.mk
index 65c5467137..9b2ad25704 100644
--- a/net/certificate_mime_types_java.target.linux-arm.mk
+++ b/net/certificate_mime_types_java.target.linux-arm.mk
@@ -94,6 +94,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -176,6 +177,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/certificate_mime_types_java.target.linux-mips.mk b/net/certificate_mime_types_java.target.linux-mips.mk
index 6cef8b573b..21f56e893a 100644
--- a/net/certificate_mime_types_java.target.linux-mips.mk
+++ b/net/certificate_mime_types_java.target.linux-mips.mk
@@ -93,6 +93,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -174,6 +175,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/certificate_mime_types_java.target.linux-x86.mk b/net/certificate_mime_types_java.target.linux-x86.mk
index 15771ebc48..3df90609fc 100644
--- a/net/certificate_mime_types_java.target.linux-x86.mk
+++ b/net/certificate_mime_types_java.target.linux-x86.mk
@@ -95,6 +95,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -177,6 +178,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/certificate_mime_types_java.target.linux-x86_64.mk b/net/certificate_mime_types_java.target.linux-x86_64.mk
new file mode 100644
index 0000000000..b424379376
--- /dev/null
+++ b/net/certificate_mime_types_java.target.linux-x86_64.mk
@@ -0,0 +1,233 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_certificate_mime_types_java_gyp
+LOCAL_MODULE_STEM := certificate_mime_types_java
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+
+### Generated for rule "net_net_gyp_certificate_mime_types_java_target_generate_java_constants":
+# "{'inputs': ['../build/android/gyp/util/build_utils.py', '../build/android/gyp/gcc_preprocess.py', 'base/mime_util_certificate_type_list.h'], 'extension': 'template', 'outputs': ['$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'], 'variables': {'output_path': '$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'}, 'rule_name': 'generate_java_constants', 'rule_sources': ['android/java/CertificateMimeType.template'], 'action': ['python', '../build/android/gyp/gcc_preprocess.py', '--include-path=..', '--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java', '--template=$(RULE_SOURCES)'], 'message': 'Generating Java from cpp template $(RULE_SOURCES)'}":
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java: $(LOCAL_PATH)/net/android/java/CertificateMimeType.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/net/base/mime_util_certificate_type_list.h $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/net; cd $(gyp_local_path)/net; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java" "--template=android/java/CertificateMimeType.template"
+
+.PHONY: net_certificate_mime_types_java_gyp_rule_trigger
+net_certificate_mime_types_java_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java
+
+### Finished generating for all rules
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/templates/org/chromium/net/CertificateMimeType.java
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_GENERATED_SOURCES := \
+ net_certificate_mime_types_java_gyp_rule_trigger
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES :=
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_certificate_mime_types_java_gyp
+
+# Alias gyp target name.
+.PHONY: certificate_mime_types_java
+certificate_mime_types_java: net_certificate_mime_types_java_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/cookies/cookie_monster.h b/net/cookies/cookie_monster.h
index 455484ef1b..5a06922391 100644
--- a/net/cookies/cookie_monster.h
+++ b/net/cookies/cookie_monster.h
@@ -187,11 +187,6 @@ class NET_EXPORT CookieMonster : public CookieStore {
const CookieOptions& options,
const GetCookieListCallback& callback);
- // Invokes GetAllCookiesForURLWithOptions with options set to include HTTP
- // only cookies.
- void GetAllCookiesForURLAsync(const GURL& url,
- const GetCookieListCallback& callback);
-
// Deletes all of the cookies.
void DeleteAllAsync(const DeleteCallback& callback);
@@ -257,6 +252,12 @@ class NET_EXPORT CookieMonster : public CookieStore {
const CookieOptions& options,
const GetCookiesCallback& callback) OVERRIDE;
+ // Invokes GetAllCookiesForURLWithOptions with options set to include HTTP
+ // only cookies.
+ virtual void GetAllCookiesForURLAsync(
+ const GURL& url,
+ const GetCookieListCallback& callback) OVERRIDE;
+
// Deletes all cookies with that might apply to |url| that has |cookie_name|.
virtual void DeleteCookieAsync(
const GURL& url, const std::string& cookie_name,
diff --git a/net/cookies/cookie_store.h b/net/cookies/cookie_store.h
index 730f7106a7..b2552a6cf0 100644
--- a/net/cookies/cookie_store.h
+++ b/net/cookies/cookie_store.h
@@ -15,6 +15,7 @@
#include "base/memory/ref_counted.h"
#include "base/time/time.h"
#include "net/base/net_export.h"
+#include "net/cookies/canonical_cookie.h"
#include "net/cookies/cookie_options.h"
class GURL;
@@ -28,8 +29,8 @@ class CookieMonster;
class NET_EXPORT CookieStore : public base::RefCountedThreadSafe<CookieStore> {
public:
// Callback definitions.
- typedef base::Callback<void(const std::string& cookie)>
- GetCookiesCallback;
+ typedef base::Callback<void(const CookieList& cookies)> GetCookieListCallback;
+ typedef base::Callback<void(const std::string& cookie)> GetCookiesCallback;
typedef base::Callback<void(bool success)> SetCookiesCallback;
typedef base::Callback<void(int num_deleted)> DeleteCallback;
@@ -55,6 +56,12 @@ class NET_EXPORT CookieStore : public base::RefCountedThreadSafe<CookieStore> {
const CookieOptions& options,
const GetCookiesCallback& callback) = 0;
+ // Returns all matching cookies without marking them as accessed,
+ // including HTTP only cookies.
+ virtual void GetAllCookiesForURLAsync(
+ const GURL& url,
+ const GetCookieListCallback& callback) = 0;
+
// Deletes the passed in cookie for the specified URL.
virtual void DeleteCookieAsync(const GURL& url,
const std::string& cookie_name,
diff --git a/net/cookies/cookie_store_test_helpers.cc b/net/cookies/cookie_store_test_helpers.cc
index 68086e1c4e..fdf2c1f1ee 100644
--- a/net/cookies/cookie_store_test_helpers.cc
+++ b/net/cookies/cookie_store_test_helpers.cc
@@ -68,6 +68,12 @@ void DelayedCookieMonster::GetCookiesWithOptionsAsync(
base::TimeDelta::FromMilliseconds(kDelayedTime));
}
+void DelayedCookieMonster::GetAllCookiesForURLAsync(
+ const GURL& url,
+ const GetCookieListCallback& callback) {
+ cookie_monster_->GetAllCookiesForURLAsync(url, callback);
+}
+
void DelayedCookieMonster::InvokeSetCookiesCallback(
const CookieMonster::SetCookiesCallback& callback) {
if (!callback.is_null())
diff --git a/net/cookies/cookie_store_test_helpers.h b/net/cookies/cookie_store_test_helpers.h
index 3119e03229..84b83bc062 100644
--- a/net/cookies/cookie_store_test_helpers.h
+++ b/net/cookies/cookie_store_test_helpers.h
@@ -34,6 +34,10 @@ class DelayedCookieMonster : public CookieStore {
const CookieOptions& options,
const CookieMonster::GetCookiesCallback& callback) OVERRIDE;
+ virtual void GetAllCookiesForURLAsync(
+ const GURL& url,
+ const GetCookieListCallback& callback) OVERRIDE;
+
virtual bool SetCookieWithOptions(const GURL& url,
const std::string& cookie_line,
const CookieOptions& options);
diff --git a/net/cronet/android/url_request_context_peer.cc b/net/cronet/android/url_request_context_peer.cc
index 2c754dbeac..e36763228e 100644
--- a/net/cronet/android/url_request_context_peer.cc
+++ b/net/cronet/android/url_request_context_peer.cc
@@ -44,7 +44,8 @@ class BasicNetworkDelegate : public net::NetworkDelegate {
net::URLRequest* request,
const net::CompletionCallback& callback,
const net::HttpResponseHeaders* original_response_headers,
- scoped_refptr<net::HttpResponseHeaders>* _response_headers) OVERRIDE {
+ scoped_refptr<net::HttpResponseHeaders>* _response_headers,
+ GURL* allowed_unsafe_redirect_url) OVERRIDE {
return net::OK;
}
diff --git a/net/data/url_request_unittest/redirect302-to-echo-cacheable b/net/data/url_request_unittest/redirect302-to-echo-cacheable
new file mode 100644
index 0000000000..7898192261
--- /dev/null
+++ b/net/data/url_request_unittest/redirect302-to-echo-cacheable
@@ -0,0 +1 @@
+a
diff --git a/net/data/url_request_unittest/redirect302-to-echo-cacheable.mock-http-headers b/net/data/url_request_unittest/redirect302-to-echo-cacheable.mock-http-headers
new file mode 100644
index 0000000000..fce2271606
--- /dev/null
+++ b/net/data/url_request_unittest/redirect302-to-echo-cacheable.mock-http-headers
@@ -0,0 +1,4 @@
+HTTP/1.1 302 Yo
+Location: /echo
+Content-Length: 1
+Cache-control: max-age=60000
diff --git a/net/data/websocket/close-with-split-packet_wsh.py b/net/data/websocket/close-with-split-packet_wsh.py
index d5185c4114..3bd5b58b25 100644
--- a/net/data/websocket/close-with-split-packet_wsh.py
+++ b/net/data/websocket/close-with-split-packet_wsh.py
@@ -13,17 +13,12 @@ def web_socket_do_extra_handshake(_request):
def web_socket_transfer_data(request):
- line = request.ws_stream.receive_message()
- if line is None:
- return
- if isinstance(line, unicode):
- request.ws_stream.send_message(line, binary=False)
- else:
- request.ws_stream.send_message(line, binary=True)
+ # Just waiting...
+ request.ws_stream.receive_message()
def web_socket_passive_closing_handshake(request):
- code = struct.pack('!H', 1000)
+ code = struct.pack('!H', 3004)
packet = stream.create_close_frame(code + 'split test'.encode('utf-8'))
request.connection.write(packet[:1])
request.connection.write(packet[1:])
diff --git a/net/data/websocket/split_packet_check.html b/net/data/websocket/split_packet_check.html
index 8e273ec284..a7f4c365f5 100644
--- a/net/data/websocket/split_packet_check.html
+++ b/net/data/websocket/split_packet_check.html
@@ -26,7 +26,7 @@ ws.onopen = function()
ws.onclose = function(event)
{
// Check wasClean, then set proper title.
- if (event.wasClean)
+ if (event.wasClean && event.code === 3004 && event.reason === 'split test')
document.title = 'PASS';
else
document.title = 'FAIL';
diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc
index 68da572deb..e118dc6a9b 100644
--- a/net/disk_cache/backend_unittest.cc
+++ b/net/disk_cache/backend_unittest.cc
@@ -668,6 +668,9 @@ TEST_F(DiskCacheBackendTest, ShutdownWithPendingCreate_Fast) {
}
#endif
+// Disabled on android since this test requires cache creator to create
+// blockfile caches.
+#if !defined(OS_ANDROID)
TEST_F(DiskCacheTest, TruncatedIndex) {
ASSERT_TRUE(CleanupCacheDir());
base::FilePath index = cache_path_.AppendASCII("index");
@@ -693,6 +696,7 @@ TEST_F(DiskCacheTest, TruncatedIndex) {
ASSERT_FALSE(backend);
}
+#endif
void DiskCacheBackendTest::BackendSetSize() {
const int cache_size = 0x10000; // 64 kB
@@ -1837,6 +1841,9 @@ class BadEntropyProvider : public base::FieldTrial::EntropyProvider {
// Tests that the disk cache successfully joins the control group, dropping the
// existing cache in favour of a new empty cache.
+// Disabled on android since this test requires cache creator to create
+// blockfile caches.
+#if !defined(OS_ANDROID)
TEST_F(DiskCacheTest, SimpleCacheControlJoin) {
base::Thread cache_thread("CacheThread");
ASSERT_TRUE(cache_thread.StartWithOptions(
@@ -1867,6 +1874,7 @@ TEST_F(DiskCacheTest, SimpleCacheControlJoin) {
ASSERT_EQ(net::OK, cb.GetResult(rv));
EXPECT_EQ(0, base_cache->GetEntryCount());
}
+#endif
// Tests that the disk cache can restart in the control group preserving
// existing entries.
@@ -1945,6 +1953,9 @@ TEST_F(DiskCacheTest, SimpleCacheControlLeave) {
}
// Tests that the cache is properly restarted on recovery error.
+// Disabled on android since this test requires cache creator to create
+// blockfile caches.
+#if !defined(OS_ANDROID)
TEST_F(DiskCacheBackendTest, DeleteOld) {
ASSERT_TRUE(CopyTestCache("wrong_version"));
SetNewEviction();
@@ -1971,6 +1982,7 @@ TEST_F(DiskCacheBackendTest, DeleteOld) {
cache_.reset();
EXPECT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, mask_));
}
+#endif
// We want to be able to deal with messed up entries on disk.
void DiskCacheBackendTest::BackendInvalidEntry2() {
diff --git a/net/disk_cache/blockfile/backend_impl_v3.h b/net/disk_cache/blockfile/backend_impl_v3.h
index adb926c9a5..37f90aaf15 100644
--- a/net/disk_cache/blockfile/backend_impl_v3.h
+++ b/net/disk_cache/blockfile/backend_impl_v3.h
@@ -194,6 +194,7 @@ class NET_EXPORT_PRIVATE BackendImplV3 : public Backend {
private:
friend class EvictionV3;
typedef base::hash_map<CacheAddr, EntryImplV3*> EntriesMap;
+ class Worker;
void AdjustMaxCacheSize();
bool InitStats(void* stats_data);
diff --git a/net/disk_cache/blockfile/backend_worker_v3.cc b/net/disk_cache/blockfile/backend_worker_v3.cc
index d02eee523a..ab432c4a39 100644
--- a/net/disk_cache/blockfile/backend_worker_v3.cc
+++ b/net/disk_cache/blockfile/backend_worker_v3.cc
@@ -8,28 +8,15 @@
#include "base/bind_helpers.h"
#include "base/file_util.h"
#include "base/files/file_path.h"
-#include "base/hash.h"
#include "base/message_loop/message_loop.h"
-#include "base/metrics/field_trial.h"
-#include "base/metrics/histogram.h"
-#include "base/metrics/stats_counters.h"
-#include "base/rand_util.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
-#include "base/sys_info.h"
-#include "base/threading/thread_restrictions.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "net/base/net_errors.h"
-#include "net/disk_cache/blockfile/entry_impl.h"
#include "net/disk_cache/blockfile/errors.h"
#include "net/disk_cache/blockfile/experiments.h"
#include "net/disk_cache/blockfile/file.h"
-#include "net/disk_cache/blockfile/histogram_macros.h"
-#include "net/disk_cache/cache_util.h"
-
-// Provide a BackendImpl object to macros from histogram_macros.h.
-#define CACHE_UMA_BACKEND_IMPL_OBJ this
using base::Time;
using base::TimeDelta;
@@ -37,6 +24,8 @@ using base::TimeTicks;
namespace {
+#if defined(V3_NOT_JUST_YET_READY)
+
const char* kIndexName = "index";
// Seems like ~240 MB correspond to less than 50k entries for 99% of the people.
@@ -96,6 +85,7 @@ bool InitExperiment(disk_cache::IndexHeader* header, bool cache_created) {
header->experiment = disk_cache::NO_EXPERIMENT;
return true;
}
+#endif // defined(V3_NOT_JUST_YET_READY).
} // namespace
@@ -103,31 +93,15 @@ bool InitExperiment(disk_cache::IndexHeader* header, bool cache_created) {
namespace disk_cache {
-BackendImpl::BackendImpl(const base::FilePath& path,
- base::MessageLoopProxy* cache_thread,
- net::NetLog* net_log)
- : background_queue_(this, cache_thread),
- path_(path),
- block_files_(path),
- mask_(0),
- max_size_(0),
- up_ticks_(0),
- cache_type_(net::DISK_CACHE),
- uma_report_(0),
- user_flags_(0),
- init_(false),
- restarted_(false),
- unit_test_(false),
- read_only_(false),
- disabled_(false),
- new_eviction_(false),
- first_timer_(true),
- user_load_(false),
- net_log_(net_log),
- done_(true, false),
- ptr_factory_(this) {
+BackendImplV3::Worker::Worker(const base::FilePath& path,
+ base::MessageLoopProxy* main_thread)
+ : path_(path),
+ block_files_(path),
+ init_(false) {
}
+#if defined(V3_NOT_JUST_YET_READY)
+
int BackendImpl::SyncInit() {
#if defined(NET_BUILD_STRESS_CACHE)
// Start evictions right away.
@@ -482,4 +456,13 @@ bool BackendImpl::InitStats() {
return true;
}
+#endif // defined(V3_NOT_JUST_YET_READY).
+
+int BackendImplV3::Worker::Init(const CompletionCallback& callback) {
+ return net::ERR_FAILED;
+}
+
+BackendImplV3::Worker::~Worker() {
+}
+
} // namespace disk_cache
diff --git a/net/disk_cache/blockfile/backend_worker_v3.h b/net/disk_cache/blockfile/backend_worker_v3.h
index a184d8f707..d0829b9634 100644
--- a/net/disk_cache/blockfile/backend_worker_v3.h
+++ b/net/disk_cache/blockfile/backend_worker_v3.h
@@ -9,30 +9,23 @@
#include "base/containers/hash_tables.h"
#include "base/files/file_path.h"
-#include "base/timer/timer.h"
+#include "net/disk_cache/blockfile/addr.h"
+#include "net/disk_cache/blockfile/backend_impl_v3.h"
#include "net/disk_cache/blockfile/block_files.h"
-#include "net/disk_cache/blockfile/eviction.h"
-#include "net/disk_cache/blockfile/in_flight_backend_io.h"
-#include "net/disk_cache/blockfile/rankings.h"
-#include "net/disk_cache/blockfile/stats.h"
-#include "net/disk_cache/blockfile/stress_support.h"
-#include "net/disk_cache/blockfile/trace.h"
-#include "net/disk_cache/disk_cache.h"
namespace disk_cache {
-// This class implements the Backend interface. An object of this
-// class handles the operations of the cache for a particular profile.
-class NET_EXPORT_PRIVATE BackendImpl : public Backend {
- friend class Eviction;
+class BackendImplV3::Worker : public base::RefCountedThreadSafe<Worker> {
public:
- BackendImpl(const base::FilePath& path, base::MessageLoopProxy* cache_thread,
- net::NetLog* net_log);
+ Worker(const base::FilePath& path, base::MessageLoopProxy* main_thread);
// Performs general initialization for this current instance of the cache.
int Init(const CompletionCallback& callback);
private:
+ friend class base::RefCountedThreadSafe<Worker>;
+
+ ~Worker();
void CleanupCache();
// Returns the full name for an external storage file.
@@ -42,9 +35,6 @@ class NET_EXPORT_PRIVATE BackendImpl : public Backend {
bool CreateBackingStore(disk_cache::File* file);
bool InitBackingStore(bool* file_created);
- // Reports an uncommon, recoverable error.
- void ReportError(int error);
-
// Performs basic checks on the index file. Returns false on failure.
bool CheckIndex();
@@ -52,7 +42,7 @@ class NET_EXPORT_PRIVATE BackendImpl : public Backend {
BlockFiles block_files_; // Set of files used to store all data.
bool init_; // controls the initialization of the system.
- DISALLOW_COPY_AND_ASSIGN(BackendImpl);
+ DISALLOW_COPY_AND_ASSIGN(Worker);
};
} // namespace disk_cache
diff --git a/net/disk_cache/cache_creator.cc b/net/disk_cache/cache_creator.cc
index 102e10218a..866df10e37 100644
--- a/net/disk_cache/cache_creator.cc
+++ b/net/disk_cache/cache_creator.cc
@@ -79,11 +79,14 @@ CacheCreator::~CacheCreator() {
}
int CacheCreator::Run() {
- // TODO(gavinp,pasko): Turn Simple Cache on for more cache types as
- // appropriate.
- if (backend_type_ == net::CACHE_BACKEND_SIMPLE &&
- (type_ == net::DISK_CACHE || type_ == net::APP_CACHE ||
- type_ == net::MEDIA_CACHE)) {
+#if defined(OS_ANDROID)
+ static const bool kSimpleBackendIsDefault = true;
+#else
+ static const bool kSimpleBackendIsDefault = false;
+#endif
+ if (backend_type_ == net::CACHE_BACKEND_SIMPLE ||
+ (backend_type_ == net::CACHE_BACKEND_DEFAULT &&
+ kSimpleBackendIsDefault)) {
disk_cache::SimpleBackendImpl* simple_cache =
new disk_cache::SimpleBackendImpl(path_, max_bytes_, type_,
thread_.get(), net_log_);
@@ -91,6 +94,11 @@ int CacheCreator::Run() {
return simple_cache->Init(
base::Bind(&CacheCreator::OnIOComplete, base::Unretained(this)));
}
+
+ // Avoid references to blockfile functions on Android to reduce binary size.
+#if defined(OS_ANDROID)
+ return net::ERR_FAILED;
+#else
disk_cache::BackendImpl* new_cache =
new disk_cache::BackendImpl(path_, thread_.get(), net_log_);
created_cache_.reset(new_cache);
@@ -101,6 +109,7 @@ int CacheCreator::Run() {
base::Bind(&CacheCreator::OnIOComplete, base::Unretained(this)));
DCHECK_EQ(net::ERR_IO_PENDING, rv);
return rv;
+#endif
}
void CacheCreator::DoCallback(int result) {
diff --git a/net/disk_cache/simple/simple_histogram_macros.h b/net/disk_cache/simple/simple_histogram_macros.h
index f800a6f40a..39fdff73ce 100644
--- a/net/disk_cache/simple/simple_histogram_macros.h
+++ b/net/disk_cache/simple/simple_histogram_macros.h
@@ -16,6 +16,9 @@
#define SIMPLE_CACHE_THUNK(uma_type, args) UMA_HISTOGRAM_##uma_type args
+// TODO(pasko): add histograms for shader cache as soon as it becomes possible
+// for a user to get shader cache with the |SimpleBackendImpl| without altering
+// any flags.
#define SIMPLE_CACHE_UMA(uma_type, uma_name, cache_type, ...) \
do { \
switch (cache_type) { \
@@ -31,6 +34,8 @@
SIMPLE_CACHE_THUNK( \
uma_type, ("SimpleCache.Media." uma_name, ##__VA_ARGS__)); \
break; \
+ case net::SHADER_CACHE: \
+ break; \
default: \
NOTREACHED(); \
break; \
diff --git a/net/dns/mapped_ip_resolver.cc b/net/dns/mapped_ip_resolver.cc
deleted file mode 100644
index 58d01a374e..0000000000
--- a/net/dns/mapped_ip_resolver.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2014 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/dns/mapped_ip_resolver.h"
-
-#include "base/strings/string_util.h"
-#include "net/base/net_errors.h"
-#include "net/base/net_util.h"
-
-namespace net {
-
-MappedIPResolver::MappedIPResolver(scoped_ptr<HostResolver> impl)
- : impl_(impl.Pass()),
- weak_factory_(this) {
-}
-
-MappedIPResolver::~MappedIPResolver() {}
-
-int MappedIPResolver::Resolve(const RequestInfo& info,
- RequestPriority priority,
- AddressList* addresses,
- const CompletionCallback& callback,
- RequestHandle* out_req,
- const BoundNetLog& net_log) {
- CompletionCallback new_callback = base::Bind(&MappedIPResolver::ApplyRules,
- weak_factory_.GetWeakPtr(),
- callback, addresses);
- int rv = impl_->Resolve(info, priority, addresses, new_callback, out_req,
- net_log);
- if (rv == OK)
- rules_.RewriteAddresses(addresses);
- return rv;
-}
-
-int MappedIPResolver::ResolveFromCache(const RequestInfo& info,
- AddressList* addresses,
- const BoundNetLog& net_log) {
- int rv = impl_->ResolveFromCache(info, addresses, net_log);
- if (rv == OK)
- rules_.RewriteAddresses(addresses);
- return rv;
-}
-
-void MappedIPResolver::CancelRequest(RequestHandle req) {
- impl_->CancelRequest(req);
-}
-
-void MappedIPResolver::SetDnsClientEnabled(bool enabled) {
- impl_->SetDnsClientEnabled(enabled);
-}
-
-HostCache* MappedIPResolver::GetHostCache() {
- return impl_->GetHostCache();
-}
-
-base::Value* MappedIPResolver::GetDnsConfigAsValue() const {
- return impl_->GetDnsConfigAsValue();
-}
-
-void MappedIPResolver::ApplyRules(const CompletionCallback& original_callback,
- AddressList* addresses,
- int rv) const {
- if (rv == OK)
- rules_.RewriteAddresses(addresses);
- original_callback.Run(rv);
-}
-
-} // namespace net
diff --git a/net/dns/mapped_ip_resolver.h b/net/dns/mapped_ip_resolver.h
deleted file mode 100644
index a3c7aa8dc5..0000000000
--- a/net/dns/mapped_ip_resolver.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2014 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.
-
-#ifndef NET_DNS_MAPPED_IP_RESOLVER_H_
-#define NET_DNS_MAPPED_IP_RESOLVER_H_
-
-#include <string>
-
-#include "base/memory/scoped_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "net/base/ip_mapping_rules.h"
-#include "net/base/net_export.h"
-#include "net/dns/host_resolver.h"
-
-namespace net {
-
-// This class wraps an existing HostResolver instance, but modifies the
-// resolution response by inserting or replacing IP addresses before returning
-// it. Currently, the only directive suported is a "PREFACE" directive which
-// (when a match exists) inserts a single IP address at the start of a list.
-class NET_EXPORT MappedIPResolver : public HostResolver {
- public:
- // Creates a MappedIPResolver that forwards all of its requests through
- // |impl|.
- explicit MappedIPResolver(scoped_ptr<HostResolver> impl);
- virtual ~MappedIPResolver();
-
- // Adds a rule to our IP mapper rules_.
- // The most recently added rule "has priority" and will be used first (in
- // preference to) any previous rules. Once one rule is found that matches,
- // no other rules will be considered.
- // See ip_mapping_rules.h for syntax and semantics.
- // Returns true if the rule was successfully parsed and added.
- bool AddRuleFromString(const std::string& rule_string) {
- return rules_.AddRuleFromString(rule_string);
- }
-
- // Takes a semicolon separated list of rules, and assigns them to this
- // resolver, discarding any previously added or set rules.
- void SetRulesFromString(const std::string& rules_string) {
- rules_.SetRulesFromString(rules_string);
- }
-
- // HostResolver methods:
- virtual int Resolve(const RequestInfo& info,
- RequestPriority priority,
- AddressList* addresses,
- const CompletionCallback& callback,
- RequestHandle* out_req,
- const BoundNetLog& net_log) OVERRIDE;
- virtual int ResolveFromCache(const RequestInfo& info,
- AddressList* addresses,
- const BoundNetLog& net_log) OVERRIDE;
- virtual void CancelRequest(RequestHandle req) OVERRIDE;
- virtual void SetDnsClientEnabled(bool enabled) OVERRIDE;
- virtual HostCache* GetHostCache() OVERRIDE;
- virtual base::Value* GetDnsConfigAsValue() const OVERRIDE;
-
- private:
- // Modify the list of resolution |addresses| according to |rules_|, and then
- // calls the |original_callback| with network error code |rv|.
- void ApplyRules(const CompletionCallback& original_callback,
- AddressList* addresses,
- int rv) const;
-
- scoped_ptr<HostResolver> impl_;
- IPMappingRules rules_;
-
- base::WeakPtrFactory<MappedIPResolver> weak_factory_;
- DISALLOW_COPY_AND_ASSIGN(MappedIPResolver);
-};
-
-} // namespace net
-
-#endif // NET_DNS_MAPPED_IP_RESOLVER_H_
diff --git a/net/filter/filter.cc b/net/filter/filter.cc
index 244abaea10..90d91e161b 100644
--- a/net/filter/filter.cc
+++ b/net/filter/filter.cc
@@ -8,6 +8,7 @@
#include "base/strings/string_util.h"
#include "net/base/io_buffer.h"
#include "net/base/mime_util.h"
+#include "net/base/net_util.h"
#include "net/filter/gzip_filter.h"
#include "net/filter/sdch_filter.h"
@@ -170,11 +171,14 @@ void Filter::FixupEncodingTypes(
encoding_types->clear();
GURL url;
+ std::string disposition;
success = filter_context.GetURL(&url);
DCHECK(success);
- base::FilePath filename =
- base::FilePath().AppendASCII(url.ExtractFileName());
- base::FilePath::StringType extension = filename.Extension();
+ filter_context.GetContentDisposition(&disposition);
+ // Don't supply a MIME type here, since that may cause disk IO.
+ base::FilePath filepath = GenerateFileName(url, disposition, "UTF-8", "",
+ "", "");
+ base::FilePath::StringType extension = filepath.Extension();
if (filter_context.IsDownload()) {
// We don't want to decompress gzipped files when the user explicitly
diff --git a/net/filter/filter.h b/net/filter/filter.h
index 1b4d2f5bf2..81890997ef 100644
--- a/net/filter/filter.h
+++ b/net/filter/filter.h
@@ -74,6 +74,10 @@ class NET_EXPORT_PRIVATE FilterContext {
// Return false if gurl is not present.
virtual bool GetURL(GURL* gurl) const = 0;
+ // What Content-Disposition header came with this data?
+ // Return false if no header was present.
+ virtual bool GetContentDisposition(std::string* disposition) const = 0;
+
// When was this data requested from a server?
virtual base::Time GetRequestTime() const = 0;
diff --git a/net/filter/filter_unittest.cc b/net/filter/filter_unittest.cc
index 3b912520f8..08a2861699 100644
--- a/net/filter/filter_unittest.cc
+++ b/net/filter/filter_unittest.cc
@@ -82,6 +82,23 @@ TEST(FilterTest, ApacheGzip) {
EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front());
}
+TEST(FilterTest, GzipContentDispositionFilename) {
+ MockFilterContext filter_context;
+ filter_context.SetSdchResponse(false);
+
+ const std::string kGzipMime("application/x-tar");
+ const std::string kContentDisposition("attachment; filename=\"foo.tgz\"");
+ const std::string kURL("http://foo.com/getfoo.php");
+ std::vector<Filter::FilterType> encoding_types;
+
+ encoding_types.push_back(Filter::FILTER_TYPE_GZIP);
+ filter_context.SetMimeType(kGzipMime);
+ filter_context.SetURL(GURL(kURL));
+ filter_context.SetContentDisposition(kContentDisposition);
+ Filter::FixupEncodingTypes(filter_context, &encoding_types);
+ ASSERT_EQ(0U, encoding_types.size());
+}
+
TEST(FilterTest, SdchEncoding) {
// Handle content encodings including SDCH.
const std::string kTextHtmlMime("text/html");
diff --git a/net/filter/mock_filter_context.cc b/net/filter/mock_filter_context.cc
index ec6db0111c..06905c0e07 100644
--- a/net/filter/mock_filter_context.cc
+++ b/net/filter/mock_filter_context.cc
@@ -27,6 +27,13 @@ bool MockFilterContext::GetURL(GURL* gurl) const {
return true;
}
+bool MockFilterContext::GetContentDisposition(std::string* disposition) const {
+ if (content_disposition_.empty())
+ return false;
+ *disposition = content_disposition_;
+ return true;
+}
+
// What was this data requested from a server?
base::Time MockFilterContext::GetRequestTime() const {
return request_time_;
diff --git a/net/filter/mock_filter_context.h b/net/filter/mock_filter_context.h
index 00fc8ed6ce..21e56ac92e 100644
--- a/net/filter/mock_filter_context.h
+++ b/net/filter/mock_filter_context.h
@@ -19,6 +19,9 @@ class MockFilterContext : public FilterContext {
void SetMimeType(const std::string& mime_type) { mime_type_ = mime_type; }
void SetURL(const GURL& gurl) { gurl_ = gurl; }
+ void SetContentDisposition(const std::string& disposition) {
+ content_disposition_ = disposition;
+ }
void SetRequestTime(const base::Time time) { request_time_ = time; }
void SetCached(bool is_cached) { is_cached_content_ = is_cached; }
void SetDownload(bool is_download) { is_download_ = is_download; }
@@ -33,6 +36,10 @@ class MockFilterContext : public FilterContext {
// Return false if gurl is not present.
virtual bool GetURL(GURL* gurl) const OVERRIDE;
+ // What Content-Disposition did the server supply for this data?
+ // Return false if Content-Disposition was not present.
+ virtual bool GetContentDisposition(std::string* disposition) const OVERRIDE;
+
// What was this data requested from a server?
virtual base::Time GetRequestTime() const OVERRIDE;
@@ -55,6 +62,7 @@ class MockFilterContext : public FilterContext {
private:
int buffer_size_;
std::string mime_type_;
+ std::string content_disposition_;
GURL gurl_;
base::Time request_time_;
bool is_cached_content_;
diff --git a/net/http/disk_cache_based_quic_server_info_unittest.cc b/net/http/disk_cache_based_quic_server_info_unittest.cc
index 3321240055..ed0e1b7157 100644
--- a/net/http/disk_cache_based_quic_server_info_unittest.cc
+++ b/net/http/disk_cache_based_quic_server_info_unittest.cc
@@ -14,6 +14,7 @@
#include "net/quic/quic_session_key.h"
#include "testing/gtest/include/gtest/gtest.h"
+namespace net {
namespace {
// This is an empty transaction, needed to register the URL and the test mode.
@@ -22,7 +23,7 @@ const MockTransaction kHostInfoTransaction1 = {
"",
base::Time(),
"",
- net::LOAD_NORMAL,
+ LOAD_NORMAL,
"",
"",
base::Time(),
@@ -37,7 +38,7 @@ const MockTransaction kHostInfoTransaction2 = {
"",
base::Time(),
"",
- net::LOAD_NORMAL,
+ LOAD_NORMAL,
"",
"",
base::Time(),
@@ -47,6 +48,8 @@ const MockTransaction kHostInfoTransaction2 = {
0
};
+} // namespace
+
// Tests that we can delete a DiskCacheBasedQuicServerInfo object in a
// completion callback for DiskCacheBasedQuicServerInfo::WaitForDataReady.
TEST(DiskCacheBasedQuicServerInfo, DeleteInCallback) {
@@ -54,32 +57,33 @@ TEST(DiskCacheBasedQuicServerInfo, DeleteInCallback) {
// of quic_server_info->WaitForDataReady(), so that the callback will run.
MockBlockingBackendFactory* factory = new MockBlockingBackendFactory();
MockHttpCache cache(factory);
- net::QuicSessionKey server_key("www.verisign.com", 443, true);
- scoped_ptr<net::QuicServerInfo> quic_server_info(
- new net::DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
+ QuicSessionKey server_key("www.verisign.com", 443, true,
+ kPrivacyModeDisabled);
+ scoped_ptr<QuicServerInfo> quic_server_info(
+ new DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
quic_server_info->Start();
- net::TestCompletionCallback callback;
+ TestCompletionCallback callback;
int rv = quic_server_info->WaitForDataReady(callback.callback());
- EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ EXPECT_EQ(ERR_IO_PENDING, rv);
// Now complete the backend creation and let the callback run.
factory->FinishCreation();
- EXPECT_EQ(net::OK, callback.GetResult(rv));
+ EXPECT_EQ(OK, callback.GetResult(rv));
}
// Tests the basic logic of storing, retrieving and updating data.
TEST(DiskCacheBasedQuicServerInfo, Update) {
MockHttpCache cache;
AddMockTransaction(&kHostInfoTransaction1);
- net::TestCompletionCallback callback;
+ TestCompletionCallback callback;
- net::QuicSessionKey server_key("www.google.com", 443, true);
- scoped_ptr<net::QuicServerInfo> quic_server_info(
- new net::DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
+ QuicSessionKey server_key("www.google.com", 443, true, kPrivacyModeDisabled);
+ scoped_ptr<QuicServerInfo> quic_server_info(
+ new DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
quic_server_info->Start();
int rv = quic_server_info->WaitForDataReady(callback.callback());
- EXPECT_EQ(net::OK, callback.GetResult(rv));
+ EXPECT_EQ(OK, callback.GetResult(rv));
- net::QuicServerInfo::State* state = quic_server_info->mutable_state();
+ QuicServerInfo::State* state = quic_server_info->mutable_state();
EXPECT_TRUE(state->certs.empty());
const string server_config_a = "server_config_a";
const string source_address_token_a = "source_address_token_a";
@@ -98,10 +102,10 @@ TEST(DiskCacheBasedQuicServerInfo, Update) {
// Open the stored QuicServerInfo.
quic_server_info.reset(
- new net::DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
+ new DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
quic_server_info->Start();
rv = quic_server_info->WaitForDataReady(callback.callback());
- EXPECT_EQ(net::OK, callback.GetResult(rv));
+ EXPECT_EQ(OK, callback.GetResult(rv));
// And now update the data.
state = quic_server_info->mutable_state();
@@ -114,13 +118,13 @@ TEST(DiskCacheBasedQuicServerInfo, Update) {
// Verify that the state was updated.
quic_server_info.reset(
- new net::DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
+ new DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
quic_server_info->Start();
rv = quic_server_info->WaitForDataReady(callback.callback());
- EXPECT_EQ(net::OK, callback.GetResult(rv));
+ EXPECT_EQ(OK, callback.GetResult(rv));
EXPECT_TRUE(quic_server_info->IsDataReady());
- const net::QuicServerInfo::State& state1 = quic_server_info->state();
+ const QuicServerInfo::State& state1 = quic_server_info->state();
EXPECT_EQ(server_config_a, state1.server_config);
EXPECT_EQ(source_address_token_a, state1.source_address_token);
EXPECT_EQ(server_config_sig_a, state1.server_config_sig);
@@ -136,17 +140,17 @@ TEST(DiskCacheBasedQuicServerInfo, UpdateDifferentPorts) {
MockHttpCache cache;
AddMockTransaction(&kHostInfoTransaction1);
AddMockTransaction(&kHostInfoTransaction2);
- net::TestCompletionCallback callback;
+ TestCompletionCallback callback;
// Persist data for port 443.
- net::QuicSessionKey server_key1("www.google.com", 443, true);
- scoped_ptr<net::QuicServerInfo> quic_server_info1(
- new net::DiskCacheBasedQuicServerInfo(server_key1, cache.http_cache()));
+ QuicSessionKey server_key1("www.google.com", 443, true, kPrivacyModeDisabled);
+ scoped_ptr<QuicServerInfo> quic_server_info1(
+ new DiskCacheBasedQuicServerInfo(server_key1, cache.http_cache()));
quic_server_info1->Start();
int rv = quic_server_info1->WaitForDataReady(callback.callback());
- EXPECT_EQ(net::OK, callback.GetResult(rv));
+ EXPECT_EQ(OK, callback.GetResult(rv));
- net::QuicServerInfo::State* state1 = quic_server_info1->mutable_state();
+ QuicServerInfo::State* state1 = quic_server_info1->mutable_state();
EXPECT_TRUE(state1->certs.empty());
const string server_config_a = "server_config_a";
const string source_address_token_a = "source_address_token_a";
@@ -163,14 +167,14 @@ TEST(DiskCacheBasedQuicServerInfo, UpdateDifferentPorts) {
base::MessageLoop::current()->RunUntilIdle();
// Persist data for port 80.
- net::QuicSessionKey server_key2("www.google.com", 80, false);
- scoped_ptr<net::QuicServerInfo> quic_server_info2(
- new net::DiskCacheBasedQuicServerInfo(server_key2, cache.http_cache()));
+ QuicSessionKey server_key2("www.google.com", 80, false, kPrivacyModeDisabled);
+ scoped_ptr<QuicServerInfo> quic_server_info2(
+ new DiskCacheBasedQuicServerInfo(server_key2, cache.http_cache()));
quic_server_info2->Start();
rv = quic_server_info2->WaitForDataReady(callback.callback());
- EXPECT_EQ(net::OK, callback.GetResult(rv));
+ EXPECT_EQ(OK, callback.GetResult(rv));
- net::QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
+ QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
EXPECT_TRUE(state2->certs.empty());
const string server_config_b = "server_config_b";
const string source_address_token_b = "source_address_token_b";
@@ -187,14 +191,14 @@ TEST(DiskCacheBasedQuicServerInfo, UpdateDifferentPorts) {
base::MessageLoop::current()->RunUntilIdle();
// Verify the stored QuicServerInfo for port 443.
- scoped_ptr<net::QuicServerInfo> quic_server_info(
- new net::DiskCacheBasedQuicServerInfo(server_key1, cache.http_cache()));
+ scoped_ptr<QuicServerInfo> quic_server_info(
+ new DiskCacheBasedQuicServerInfo(server_key1, cache.http_cache()));
quic_server_info->Start();
rv = quic_server_info->WaitForDataReady(callback.callback());
- EXPECT_EQ(net::OK, callback.GetResult(rv));
+ EXPECT_EQ(OK, callback.GetResult(rv));
EXPECT_TRUE(quic_server_info->IsDataReady());
- const net::QuicServerInfo::State& state_a = quic_server_info->state();
+ const QuicServerInfo::State& state_a = quic_server_info->state();
EXPECT_EQ(server_config_a, state_a.server_config);
EXPECT_EQ(source_address_token_a, state_a.source_address_token);
EXPECT_EQ(server_config_sig_a, state_a.server_config_sig);
@@ -203,13 +207,13 @@ TEST(DiskCacheBasedQuicServerInfo, UpdateDifferentPorts) {
// Verify the stored QuicServerInfo for port 80.
quic_server_info.reset(
- new net::DiskCacheBasedQuicServerInfo(server_key2, cache.http_cache()));
+ new DiskCacheBasedQuicServerInfo(server_key2, cache.http_cache()));
quic_server_info->Start();
rv = quic_server_info->WaitForDataReady(callback.callback());
- EXPECT_EQ(net::OK, callback.GetResult(rv));
+ EXPECT_EQ(OK, callback.GetResult(rv));
EXPECT_TRUE(quic_server_info->IsDataReady());
- const net::QuicServerInfo::State& state_b = quic_server_info->state();
+ const QuicServerInfo::State& state_b = quic_server_info->state();
EXPECT_EQ(server_config_b, state_b.server_config);
EXPECT_EQ(source_address_token_b, state_b.source_address_token);
EXPECT_EQ(server_config_sig_b, state_b.server_config_sig);
@@ -224,18 +228,18 @@ TEST(DiskCacheBasedQuicServerInfo, UpdateDifferentPorts) {
TEST(DiskCacheBasedQuicServerInfo, IsReadyToPersist) {
MockHttpCache cache;
AddMockTransaction(&kHostInfoTransaction1);
- net::TestCompletionCallback callback;
+ TestCompletionCallback callback;
- net::QuicSessionKey server_key("www.google.com", 443, true);
- scoped_ptr<net::QuicServerInfo> quic_server_info(
- new net::DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
+ QuicSessionKey server_key("www.google.com", 443, true, kPrivacyModeDisabled);
+ scoped_ptr<QuicServerInfo> quic_server_info(
+ new DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
EXPECT_FALSE(quic_server_info->IsDataReady());
quic_server_info->Start();
int rv = quic_server_info->WaitForDataReady(callback.callback());
- EXPECT_EQ(net::OK, callback.GetResult(rv));
+ EXPECT_EQ(OK, callback.GetResult(rv));
EXPECT_TRUE(quic_server_info->IsDataReady());
- net::QuicServerInfo::State* state = quic_server_info->mutable_state();
+ QuicServerInfo::State* state = quic_server_info->mutable_state();
EXPECT_TRUE(state->certs.empty());
const string server_config_a = "server_config_a";
const string source_address_token_a = "source_address_token_a";
@@ -260,13 +264,13 @@ TEST(DiskCacheBasedQuicServerInfo, IsReadyToPersist) {
// Verify that the state was updated.
quic_server_info.reset(
- new net::DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
+ new DiskCacheBasedQuicServerInfo(server_key, cache.http_cache()));
quic_server_info->Start();
rv = quic_server_info->WaitForDataReady(callback.callback());
- EXPECT_EQ(net::OK, callback.GetResult(rv));
+ EXPECT_EQ(OK, callback.GetResult(rv));
EXPECT_TRUE(quic_server_info->IsDataReady());
- const net::QuicServerInfo::State& state1 = quic_server_info->state();
+ const QuicServerInfo::State& state1 = quic_server_info->state();
EXPECT_EQ(server_config_a, state1.server_config);
EXPECT_EQ(source_address_token_a, state1.source_address_token);
EXPECT_EQ(server_config_sig_a, state1.server_config_sig);
@@ -276,4 +280,4 @@ TEST(DiskCacheBasedQuicServerInfo, IsReadyToPersist) {
RemoveMockTransaction(&kHostInfoTransaction1);
}
-} // namespace
+} // namespace net
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
index 6aae9718d3..e2d46be453 100644
--- a/net/http/http_cache_transaction.cc
+++ b/net/http/http_cache_transaction.cc
@@ -446,6 +446,9 @@ void HttpCache::Transaction::StopCaching() {
// entry how it is (it will be marked as truncated at destruction), and let
// the next piece of code that executes know that we are now reading directly
// from the net.
+ // TODO(mmenke): This doesn't release the lock on the cache entry, so a
+ // future request for the resource will be blocked on this one.
+ // Fix this.
if (cache_.get() && entry_ && (mode_ & WRITE) && network_trans_.get() &&
!is_sparse_ && !range_requested_) {
mode_ = NONE;
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 73d969c8e3..0e0765337f 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -113,6 +113,7 @@ HttpNetworkSession::HttpNetworkSession(const Params& params)
params.client_socket_factory :
net::ClientSocketFactory::GetDefaultFactory(),
params.http_server_properties,
+ params.cert_verifier,
params.quic_crypto_client_stream_factory,
params.quic_random ? params.quic_random :
QuicRandom::GetInstance(),
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index 7dda13ecde..ca0678533d 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -289,7 +289,8 @@ class HttpNetworkTransactionTest
// failure should cause the network transaction to resend the request, and the
// other argument should be NULL.
void PreconnectErrorResendRequestTest(const MockWrite* write_failure,
- const MockRead* read_failure);
+ const MockRead* read_failure,
+ bool use_spdy);
SimpleGetHelperResult SimpleGetHelperForData(StaticSocketDataProvider* data[],
size_t data_count) {
@@ -1308,46 +1309,81 @@ void HttpNetworkTransactionTest::KeepAliveConnectionResendRequestTest(
void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
const MockWrite* write_failure,
- const MockRead* read_failure) {
+ const MockRead* read_failure,
+ bool use_spdy) {
HttpRequestInfo request;
request.method = "GET";
- request.url = GURL("http://www.foo.com/");
+ request.url = GURL("https://www.foo.com/");
request.load_flags = 0;
CapturingNetLog net_log;
session_deps_.net_log = &net_log;
scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
- // Written data for successfully sending a request.
- MockWrite data1_writes[] = {
- MockWrite("GET / HTTP/1.1\r\n"
- "Host: www.foo.com\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
+ SSLSocketDataProvider ssl1(ASYNC, OK);
+ SSLSocketDataProvider ssl2(ASYNC, OK);
+ if (use_spdy) {
+ ssl1.SetNextProto(GetParam());
+ ssl2.SetNextProto(GetParam());
+ }
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl1);
+ session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2);
- // Read results for the first request.
- MockRead data1_reads[] = {
- MockRead(ASYNC, OK),
- };
+ // SPDY versions of the request and response.
+ scoped_ptr<SpdyFrame> spdy_request(spdy_util_.ConstructSpdyGet(
+ request.url.spec().c_str(), false, 1, DEFAULT_PRIORITY));
+ scoped_ptr<SpdyFrame> spdy_response(
+ spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
+ scoped_ptr<SpdyFrame> spdy_data(
+ spdy_util_.ConstructSpdyBodyFrame(1, "hello", 5, true));
+ // HTTP/1.1 versions of the request and response.
+ const char kHttpRequest[] = "GET / HTTP/1.1\r\n"
+ "Host: www.foo.com\r\n"
+ "Connection: keep-alive\r\n\r\n";
+ const char kHttpResponse[] = "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n";
+ const char kHttpData[] = "hello";
+
+ std::vector<MockRead> data1_reads;
+ std::vector<MockWrite> data1_writes;
if (write_failure) {
ASSERT_FALSE(read_failure);
- data1_writes[0] = *write_failure;
+ data1_writes.push_back(*write_failure);
+ data1_reads.push_back(MockRead(ASYNC, OK));
} else {
ASSERT_TRUE(read_failure);
- data1_reads[0] = *read_failure;
+ if (use_spdy) {
+ data1_writes.push_back(CreateMockWrite(*spdy_request));
+ } else {
+ data1_writes.push_back(MockWrite(kHttpRequest));
+ }
+ data1_reads.push_back(*read_failure);
}
- StaticSocketDataProvider data1(data1_reads, arraysize(data1_reads),
- data1_writes, arraysize(data1_writes));
+ StaticSocketDataProvider data1(&data1_reads[0], data1_reads.size(),
+ &data1_writes[0], data1_writes.size());
session_deps_.socket_factory->AddSocketDataProvider(&data1);
- MockRead data2_reads[] = {
- MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"),
- MockRead("hello"),
- MockRead(ASYNC, OK),
- };
- StaticSocketDataProvider data2(data2_reads, arraysize(data2_reads), NULL, 0);
+ std::vector<MockRead> data2_reads;
+ std::vector<MockWrite> data2_writes;
+
+ if (use_spdy) {
+ data2_writes.push_back(CreateMockWrite(*spdy_request, 0, ASYNC));
+
+ data2_reads.push_back(CreateMockRead(*spdy_response, 1, ASYNC));
+ data2_reads.push_back(CreateMockRead(*spdy_data, 2, ASYNC));
+ data2_reads.push_back(MockRead(ASYNC, OK, 3));
+ } else {
+ data2_writes.push_back(
+ MockWrite(ASYNC, kHttpRequest, strlen(kHttpRequest), 0));
+
+ data2_reads.push_back(
+ MockRead(ASYNC, kHttpResponse, strlen(kHttpResponse), 1));
+ data2_reads.push_back(MockRead(ASYNC, kHttpData, strlen(kHttpData), 2));
+ data2_reads.push_back(MockRead(ASYNC, OK, 3));
+ }
+ OrderedSocketData data2(&data2_reads[0], data2_reads.size(),
+ &data2_writes[0], data2_writes.size());
session_deps_.socket_factory->AddSocketDataProvider(&data2);
// Preconnect a socket.
@@ -1360,7 +1396,7 @@ void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
// Wait for the preconnect to complete.
// TODO(davidben): Some way to wait for an idle socket count might be handy.
base::RunLoop().RunUntilIdle();
- EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get()));
+ EXPECT_EQ(1, GetIdleSocketCountInSSLSocketPool(session.get()));
// Make the request.
TestCompletionCallback callback;
@@ -1376,7 +1412,9 @@ void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
LoadTimingInfo load_timing_info;
EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info));
- TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
+ TestLoadTimingNotReused(
+ load_timing_info,
+ CONNECT_TIMING_HAS_DNS_TIMES|CONNECT_TIMING_HAS_SSL_TIMES);
const HttpResponseInfo* response = trans->GetResponseInfo();
ASSERT_TRUE(response != NULL);
@@ -1387,7 +1425,7 @@ void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
std::string response_data;
rv = ReadTransaction(trans.get(), &response_data);
EXPECT_EQ(OK, rv);
- EXPECT_EQ("hello", response_data);
+ EXPECT_EQ(kHttpData, response_data);
}
TEST_P(HttpNetworkTransactionTest,
@@ -1409,17 +1447,43 @@ TEST_P(HttpNetworkTransactionTest, KeepAliveConnectionEOF) {
TEST_P(HttpNetworkTransactionTest,
PreconnectErrorNotConnectedOnWrite) {
MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED);
- PreconnectErrorResendRequestTest(&write_failure, NULL);
+ PreconnectErrorResendRequestTest(&write_failure, NULL, false);
}
TEST_P(HttpNetworkTransactionTest, PreconnectErrorReset) {
MockRead read_failure(ASYNC, ERR_CONNECTION_RESET);
- PreconnectErrorResendRequestTest(NULL, &read_failure);
+ PreconnectErrorResendRequestTest(NULL, &read_failure, false);
}
TEST_P(HttpNetworkTransactionTest, PreconnectErrorEOF) {
MockRead read_failure(SYNCHRONOUS, OK); // EOF
- PreconnectErrorResendRequestTest(NULL, &read_failure);
+ PreconnectErrorResendRequestTest(NULL, &read_failure, false);
+}
+
+TEST_P(HttpNetworkTransactionTest, PreconnectErrorAsyncEOF) {
+ MockRead read_failure(ASYNC, OK); // EOF
+ PreconnectErrorResendRequestTest(NULL, &read_failure, false);
+}
+
+TEST_P(HttpNetworkTransactionTest,
+ SpdyPreconnectErrorNotConnectedOnWrite) {
+ MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED);
+ PreconnectErrorResendRequestTest(&write_failure, NULL, true);
+}
+
+TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorReset) {
+ MockRead read_failure(ASYNC, ERR_CONNECTION_RESET);
+ PreconnectErrorResendRequestTest(NULL, &read_failure, true);
+}
+
+TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorEOF) {
+ MockRead read_failure(SYNCHRONOUS, OK); // EOF
+ PreconnectErrorResendRequestTest(NULL, &read_failure, true);
+}
+
+TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorAsyncEOF) {
+ MockRead read_failure(ASYNC, OK); // EOF
+ PreconnectErrorResendRequestTest(NULL, &read_failure, true);
}
TEST_P(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) {
diff --git a/net/http/http_proxy_client_socket_pool.cc b/net/http/http_proxy_client_socket_pool.cc
index 8d691b7dd8..e2529f8152 100644
--- a/net/http/http_proxy_client_socket_pool.cc
+++ b/net/http/http_proxy_client_socket_pool.cc
@@ -315,11 +315,11 @@ int HttpProxyConnectJob::DoSpdyProxyCreateStream() {
}
} else {
// Create a session direct to the proxy itself
- int rv = spdy_pool->CreateAvailableSessionFromSocket(
- key, transport_socket_handle_.Pass(),
- net_log(), OK, &spdy_session, /*using_ssl_*/ true);
- if (rv < 0)
- return rv;
+ spdy_session =
+ spdy_pool->CreateAvailableSessionFromSocket(
+ key, transport_socket_handle_.Pass(),
+ net_log(), OK, /*using_ssl_*/ true);
+ DCHECK(spdy_session);
}
next_state_ = STATE_SPDY_PROXY_CREATE_STREAM_COMPLETE;
diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc
index 960bc582d9..09b58d403e 100644
--- a/net/http/http_stream_factory_impl_job.cc
+++ b/net/http/http_stream_factory_impl_job.cc
@@ -334,20 +334,23 @@ void HttpStreamFactoryImpl::Job::OnWebSocketHandshakeStreamReadyCallback() {
}
void HttpStreamFactoryImpl::Job::OnNewSpdySessionReadyCallback() {
- DCHECK(!stream_.get());
+ DCHECK(stream_.get());
DCHECK(!IsPreconnecting());
DCHECK(using_spdy());
- if (!new_spdy_session_)
- return;
+ // Note: an event loop iteration has passed, so |new_spdy_session_| may be
+ // NULL at this point if the SpdySession closed immediately after creation.
base::WeakPtr<SpdySession> spdy_session = new_spdy_session_;
new_spdy_session_.reset();
if (IsOrphaned()) {
- stream_factory_->OnNewSpdySessionReady(
- spdy_session, spdy_session_direct_, server_ssl_config_, proxy_info_,
- was_npn_negotiated(), protocol_negotiated(), using_spdy(), net_log_);
+ if (spdy_session) {
+ stream_factory_->OnNewSpdySessionReady(
+ spdy_session, spdy_session_direct_, server_ssl_config_, proxy_info_,
+ was_npn_negotiated(), protocol_negotiated(), using_spdy(), net_log_);
+ }
stream_factory_->OnOrphanedJobComplete(this);
} else {
- request_->OnNewSpdySessionReady(this, spdy_session, spdy_session_direct_);
+ request_->OnNewSpdySessionReady(
+ this, stream_.Pass(), spdy_session, spdy_session_direct_);
}
// |this| may be deleted after this call.
}
@@ -740,8 +743,8 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() {
next_state_ = STATE_INIT_CONNECTION_COMPLETE;
bool secure_quic = using_ssl_ || proxy_info_.is_quic();
int rv = quic_request_.Request(
- destination, secure_quic, request_info_.method,
- session_->cert_verifier(), net_log_, io_callback_);
+ destination, secure_quic, request_info_.privacy_mode,
+ request_info_.method, net_log_, io_callback_);
if (rv != OK) {
// OK, there's no available QUIC session. Let |waiting_job_| resume
// if it's paused.
@@ -1104,21 +1107,27 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
SpdySessionPool* spdy_pool = session_->spdy_session_pool();
spdy_session = spdy_pool->FindAvailableSession(spdy_session_key, net_log_);
if (!spdy_session) {
- int error =
+ new_spdy_session_ =
spdy_pool->CreateAvailableSessionFromSocket(spdy_session_key,
connection_.Pass(),
net_log_,
spdy_certificate_error_,
- &new_spdy_session_,
using_ssl_);
- if (error != OK)
- return error;
const HostPortPair& host_port_pair = spdy_session_key.host_port_pair();
base::WeakPtr<HttpServerProperties> http_server_properties =
session_->http_server_properties();
if (http_server_properties)
http_server_properties->SetSupportsSpdy(host_port_pair, true);
spdy_session_direct_ = direct;
+
+ // Create a SpdyHttpStream attached to the session;
+ // OnNewSpdySessionReadyCallback is not called until an event loop
+ // iteration later, so if the SpdySession is closed between then, allow
+ // reuse state from the underlying socket, sampled by SpdyHttpStream,
+ // bubble up to the request.
+ bool use_relative_url = direct || request_info_.url.SchemeIs("https");
+ stream_.reset(new SpdyHttpStream(new_spdy_session_, use_relative_url));
+
return OK;
}
}
diff --git a/net/http/http_stream_factory_impl_request.cc b/net/http/http_stream_factory_impl_request.cc
index ff66f1475c..5f129ac267 100644
--- a/net/http/http_stream_factory_impl_request.cc
+++ b/net/http/http_stream_factory_impl_request.cc
@@ -291,11 +291,16 @@ HttpStreamFactoryImpl::Request::RemoveRequestFromHttpPipeliningRequestMap() {
void HttpStreamFactoryImpl::Request::OnNewSpdySessionReady(
Job* job,
+ scoped_ptr<HttpStream> stream,
const base::WeakPtr<SpdySession>& spdy_session,
bool direct) {
DCHECK(job);
DCHECK(job->using_spdy());
+ // Note: |spdy_session| may be NULL. In that case, |delegate_| should still
+ // receive |stream| so the error propogates up correctly, however there is no
+ // point in broadcasting |spdy_session| to other requests.
+
// The first case is the usual case.
if (!bound_job_.get()) {
OrphanJobsExcept(job);
@@ -322,21 +327,20 @@ void HttpStreamFactoryImpl::Request::OnNewSpdySessionReady(
// implemented.
NOTREACHED();
} else {
- bool use_relative_url = direct || url().SchemeIs("https");
- delegate_->OnStreamReady(
- job->server_ssl_config(),
- job->proxy_info(),
- new SpdyHttpStream(spdy_session, use_relative_url));
+ delegate_->OnStreamReady(job->server_ssl_config(), job->proxy_info(),
+ stream.release());
}
// |this| may be deleted after this point.
- factory->OnNewSpdySessionReady(spdy_session,
- direct,
- used_ssl_config,
- used_proxy_info,
- was_npn_negotiated,
- protocol_negotiated,
- using_spdy,
- net_log);
+ if (spdy_session) {
+ factory->OnNewSpdySessionReady(spdy_session,
+ direct,
+ used_ssl_config,
+ used_proxy_info,
+ was_npn_negotiated,
+ protocol_negotiated,
+ using_spdy,
+ net_log);
+ }
}
void HttpStreamFactoryImpl::Request::OrphanJobsExcept(Job* job) {
diff --git a/net/http/http_stream_factory_impl_request.h b/net/http/http_stream_factory_impl_request.h
index 3d3b2c8bd6..22c8ff2d48 100644
--- a/net/http/http_stream_factory_impl_request.h
+++ b/net/http/http_stream_factory_impl_request.h
@@ -16,6 +16,7 @@
namespace net {
class ClientSocketHandle;
+class HttpStream;
class SpdySession;
class HttpStreamFactoryImpl::Request : public HttpStreamRequest {
@@ -64,6 +65,7 @@ class HttpStreamFactoryImpl::Request : public HttpStreamRequest {
// Called by an attached Job if it sets up a SpdySession.
void OnNewSpdySessionReady(Job* job,
+ scoped_ptr<HttpStream> stream,
const base::WeakPtr<SpdySession>& spdy_session,
bool direct);
diff --git a/net/http/http_transaction_unittest.cc b/net/http/http_transaction_unittest.cc
index fe904d909f..eed3c4fc8c 100644
--- a/net/http/http_transaction_unittest.cc
+++ b/net/http/http_transaction_unittest.cc
@@ -296,7 +296,10 @@ int MockNetworkTransaction::Read(net::IOBuffer* buf, int buf_len,
return net::ERR_IO_PENDING;
}
-void MockNetworkTransaction::StopCaching() {}
+void MockNetworkTransaction::StopCaching() {
+ if (transaction_factory_.get())
+ transaction_factory_->TransactionStopCaching();
+}
bool MockNetworkTransaction::GetFullRequestHeaders(
net::HttpRequestHeaders* headers) const {
@@ -439,6 +442,7 @@ void MockNetworkTransaction::RunCallback(
MockNetworkLayer::MockNetworkLayer()
: transaction_count_(0),
done_reading_called_(false),
+ stop_caching_called_(false),
last_create_transaction_priority_(net::DEFAULT_PRIORITY) {}
MockNetworkLayer::~MockNetworkLayer() {}
@@ -447,6 +451,10 @@ void MockNetworkLayer::TransactionDoneReading() {
done_reading_called_ = true;
}
+void MockNetworkLayer::TransactionStopCaching() {
+ stop_caching_called_ = true;
+}
+
int MockNetworkLayer::CreateTransaction(
net::RequestPriority priority,
scoped_ptr<net::HttpTransaction>* trans) {
diff --git a/net/http/http_transaction_unittest.h b/net/http/http_transaction_unittest.h
index 2572b1faad..5116f6585b 100644
--- a/net/http/http_transaction_unittest.h
+++ b/net/http/http_transaction_unittest.h
@@ -256,7 +256,9 @@ class MockNetworkLayer : public net::HttpTransactionFactory,
int transaction_count() const { return transaction_count_; }
bool done_reading_called() const { return done_reading_called_; }
+ bool stop_caching_called() const { return stop_caching_called_; }
void TransactionDoneReading();
+ void TransactionStopCaching();
// Returns the last priority passed to CreateTransaction, or
// DEFAULT_PRIORITY if it hasn't been called yet.
@@ -289,6 +291,7 @@ class MockNetworkLayer : public net::HttpTransactionFactory,
private:
int transaction_count_;
bool done_reading_called_;
+ bool stop_caching_called_;
net::RequestPriority last_create_transaction_priority_;
base::WeakPtr<MockNetworkTransaction> last_transaction_;
};
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc
index 8498d26ed4..8142e09e82 100644
--- a/net/http/transport_security_state.cc
+++ b/net/http/transport_security_state.cc
@@ -718,8 +718,18 @@ bool TransportSecurityState::IsGooglePinnedProperty(const std::string& host,
}
// static
-const char* const* TransportSecurityState::GooglePinsForDebugging() {
- return kGoogleAcceptableCerts;
+bool TransportSecurityState::GetPinsForDebugging(
+ const std::string& host,
+ const char* const** out_required_pins,
+ const char* const** out_excluded_pins) {
+ const std::string canonicalized_host = CanonicalizeHost(host);
+ const struct HSTSPreload* entry =
+ GetHSTSPreload(canonicalized_host, kPreloadedSTS, kNumPreloadedSTS);
+ if (!entry)
+ return false;
+ *out_required_pins = entry->pins.required_hashes;
+ *out_excluded_pins = entry->pins.excluded_hashes;
+ return true;
}
// static
diff --git a/net/http/transport_security_state.h b/net/http/transport_security_state.h
index 7696cbb4a6..8aaecb693c 100644
--- a/net/http/transport_security_state.h
+++ b/net/http/transport_security_state.h
@@ -248,11 +248,17 @@ class NET_EXPORT TransportSecurityState
static bool IsGooglePinnedProperty(const std::string& host,
bool sni_enabled);
- // GooglePinsForDebugging returns an array of SHA-1 pins for Google
- // properties - each 20 bytes long - with a NULL pointer signalling the end
- // of the array. This is a temporary debugging measure to check for binary
- // alteration / corruption.
- static const char* const* GooglePinsForDebugging();
+ // GetPinsForDebugging finds the preloaded entry for the given host. If none
+ // exists, it returns false. Otherwise it returns true and sets |out_pins|
+ // and |out_bad_pins| to point to arrays of SHA-1 hashes, each 20 bytes long
+ // with a NULL pointer signalling the end of the array, for the required and
+ // excluded pins, respectively.
+ // This is a temporary debugging measure to check for binary alteration /
+ // corruption.
+ static bool GetPinsForDebugging(
+ const std::string& host,
+ const char* const** out_pins,
+ const char* const** out_bad_pins);
// The maximum number of seconds for which we'll cache an HSTS request.
static const long int kMaxHSTSAgeSecs;
diff --git a/net/http/transport_security_state_static.h b/net/http/transport_security_state_static.h
index e87233d057..661a6a8dc8 100644
--- a/net/http/transport_security_state_static.h
+++ b/net/http/transport_security_state_static.h
@@ -405,6 +405,7 @@ static const struct HSTSPreload kPreloadedSTS[] = {
{17, true, "\004goto\006google\003com", true, kGooglePins, DOMAIN_GOOGLE_COM },
{18, true, "\005cloud\006google\003com", true, kGooglePins, DOMAIN_GOOGLE_COM },
{18, true, "\005glass\006google\003com", true, kGooglePins, DOMAIN_GOOGLE_COM },
+ {18, true, "\005admin\006google\003com", true, kGooglePins, DOMAIN_GOOGLE_COM },
{17, false, "\004play\006google\003com", true, kGooglePins, DOMAIN_GOOGLE_COM },
{20, true, "\006market\007android\003com", true, kGooglePins, DOMAIN_ANDROID_COM },
{26, true, "\003ssl\020google-analytics\003com", true, kGooglePins, DOMAIN_GOOGLE_ANALYTICS_COM },
@@ -922,6 +923,7 @@ static const struct HSTSPreload kPreloadedSTS[] = {
{19, false, "\003www\007banking\002co\002at", true, kNoPins, DOMAIN_NOT_PINNED },
{19, false, "\003mbp\007banking\002co\002at", true, kNoPins, DOMAIN_NOT_PINNED },
{13, false, "\007feedbin\003com", true, kNoPins, DOMAIN_NOT_PINNED },
+ {9, true, "\004heha\002co", true, kNoPins, DOMAIN_NOT_PINNED },
};
static const size_t kNumPreloadedSTS = ARRAYSIZE_UNSAFE(kPreloadedSTS);
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index 84dcf34eba..2af203cec4 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -184,6 +184,7 @@
{ "name": "goto.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
{ "name": "cloud.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
{ "name": "glass.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
+ { "name": "admin.google.com", "include_subdomains": true, "mode": "force-https", "pins": "google" },
// play.google.com doesn't have include_subdomains because of crbug.com/327834.
{ "name": "play.google.com", "mode": "force-https", "pins": "google" },
@@ -715,6 +716,7 @@
{ "name": "www.banking.co.at", "mode": "force-https" },
{ "name": "mbp.banking.co.at", "mode": "force-https" },
{ "name": "feedbin.com", "mode": "force-https" },
+ { "name": "heha.co", "include_subdomains": true, "mode": "force-https" },
// Entries that are only valid if the client supports SNI.
{ "name": "gmail.com", "mode": "force-https", "pins": "google", "snionly": true },
diff --git a/net/http_server.target.darwin-arm.mk b/net/http_server.target.darwin-arm.mk
index 1dd00b6f7d..4b86b99902 100644
--- a/net/http_server.target.darwin-arm.mk
+++ b/net/http_server.target.darwin-arm.mk
@@ -83,6 +83,7 @@ MY_DEFS_Debug := \
'-DENABLE_MANAGED_USERS=1' \
'-DPOSIX_AVOID_MMAP' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -170,6 +171,7 @@ MY_DEFS_Release := \
'-DENABLE_MANAGED_USERS=1' \
'-DPOSIX_AVOID_MMAP' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/http_server.target.darwin-mips.mk b/net/http_server.target.darwin-mips.mk
index b1abe01b59..8c9f4eb719 100644
--- a/net/http_server.target.darwin-mips.mk
+++ b/net/http_server.target.darwin-mips.mk
@@ -82,6 +82,7 @@ MY_DEFS_Debug := \
'-DENABLE_MANAGED_USERS=1' \
'-DPOSIX_AVOID_MMAP' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -168,6 +169,7 @@ MY_DEFS_Release := \
'-DENABLE_MANAGED_USERS=1' \
'-DPOSIX_AVOID_MMAP' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/http_server.target.darwin-x86.mk b/net/http_server.target.darwin-x86.mk
index 114ac61c1b..c1ac63a219 100644
--- a/net/http_server.target.darwin-x86.mk
+++ b/net/http_server.target.darwin-x86.mk
@@ -83,6 +83,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -169,6 +170,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/http_server.target.darwin-x86_64.mk b/net/http_server.target.darwin-x86_64.mk
new file mode 100644
index 0000000000..6b87e65c70
--- /dev/null
+++ b/net/http_server.target.darwin-x86_64.mk
@@ -0,0 +1,269 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+LOCAL_MODULE := net_http_server_gyp
+LOCAL_MODULE_SUFFIX := .a
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+GYP_GENERATED_OUTPUTS :=
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_CPP_EXTENSION := .cc
+LOCAL_GENERATED_SOURCES :=
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES := \
+ net/server/http_connection.cc \
+ net/server/http_server.cc \
+ net/server/http_server_request_info.cc \
+ net/server/http_server_response_info.cc \
+ net/server/web_socket.cc
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DPOSIX_AVOID_MMAP' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
+ $(LOCAL_PATH) \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DPOSIX_AVOID_MMAP' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
+ $(LOCAL_PATH) \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+
+LOCAL_LDFLAGS_Debug := \
+ -Wl,--fatal-warnings \
+ -Wl,-z,now \
+ -Wl,-z,relro \
+ -Wl,-z,noexecstack \
+ -fPIC \
+ -m64 \
+ -fuse-ld=gold \
+ -nostdlib \
+ -Wl,--no-undefined \
+ -Wl,--exclude-libs=ALL \
+ -Wl,--gc-sections \
+ -Wl,--warn-shared-textrel \
+ -Wl,-O1 \
+ -Wl,--as-needed
+
+
+LOCAL_LDFLAGS_Release := \
+ -Wl,--fatal-warnings \
+ -Wl,-z,now \
+ -Wl,-z,relro \
+ -Wl,-z,noexecstack \
+ -fPIC \
+ -m64 \
+ -fuse-ld=gold \
+ -nostdlib \
+ -Wl,--no-undefined \
+ -Wl,--exclude-libs=ALL \
+ -Wl,-O1 \
+ -Wl,--as-needed \
+ -Wl,--gc-sections \
+ -Wl,--warn-shared-textrel
+
+
+LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
+
+LOCAL_STATIC_LIBRARIES :=
+
+# Enable grouping to fix circular references
+LOCAL_GROUP_STATIC_LIBRARIES := true
+
+LOCAL_SHARED_LIBRARIES := \
+ libstlport \
+ libdl
+
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_http_server_gyp
+
+# Alias gyp target name.
+.PHONY: http_server
+http_server: net_http_server_gyp
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/net/http_server.target.linux-arm.mk b/net/http_server.target.linux-arm.mk
index 1dd00b6f7d..4b86b99902 100644
--- a/net/http_server.target.linux-arm.mk
+++ b/net/http_server.target.linux-arm.mk
@@ -83,6 +83,7 @@ MY_DEFS_Debug := \
'-DENABLE_MANAGED_USERS=1' \
'-DPOSIX_AVOID_MMAP' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -170,6 +171,7 @@ MY_DEFS_Release := \
'-DENABLE_MANAGED_USERS=1' \
'-DPOSIX_AVOID_MMAP' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/http_server.target.linux-mips.mk b/net/http_server.target.linux-mips.mk
index b1abe01b59..8c9f4eb719 100644
--- a/net/http_server.target.linux-mips.mk
+++ b/net/http_server.target.linux-mips.mk
@@ -82,6 +82,7 @@ MY_DEFS_Debug := \
'-DENABLE_MANAGED_USERS=1' \
'-DPOSIX_AVOID_MMAP' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -168,6 +169,7 @@ MY_DEFS_Release := \
'-DENABLE_MANAGED_USERS=1' \
'-DPOSIX_AVOID_MMAP' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/http_server.target.linux-x86.mk b/net/http_server.target.linux-x86.mk
index 114ac61c1b..c1ac63a219 100644
--- a/net/http_server.target.linux-x86.mk
+++ b/net/http_server.target.linux-x86.mk
@@ -83,6 +83,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -169,6 +170,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/http_server.target.linux-x86_64.mk b/net/http_server.target.linux-x86_64.mk
new file mode 100644
index 0000000000..6b87e65c70
--- /dev/null
+++ b/net/http_server.target.linux-x86_64.mk
@@ -0,0 +1,269 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+LOCAL_MODULE := net_http_server_gyp
+LOCAL_MODULE_SUFFIX := .a
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+GYP_GENERATED_OUTPUTS :=
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_CPP_EXTENSION := .cc
+LOCAL_GENERATED_SOURCES :=
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES := \
+ net/server/http_connection.cc \
+ net/server/http_server.cc \
+ net/server/http_server_request_info.cc \
+ net/server/http_server_response_info.cc \
+ net/server/web_socket.cc
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DPOSIX_AVOID_MMAP' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
+ $(LOCAL_PATH) \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DPOSIX_AVOID_MMAP' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
+ $(LOCAL_PATH) \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+
+LOCAL_LDFLAGS_Debug := \
+ -Wl,--fatal-warnings \
+ -Wl,-z,now \
+ -Wl,-z,relro \
+ -Wl,-z,noexecstack \
+ -fPIC \
+ -m64 \
+ -fuse-ld=gold \
+ -nostdlib \
+ -Wl,--no-undefined \
+ -Wl,--exclude-libs=ALL \
+ -Wl,--gc-sections \
+ -Wl,--warn-shared-textrel \
+ -Wl,-O1 \
+ -Wl,--as-needed
+
+
+LOCAL_LDFLAGS_Release := \
+ -Wl,--fatal-warnings \
+ -Wl,-z,now \
+ -Wl,-z,relro \
+ -Wl,-z,noexecstack \
+ -fPIC \
+ -m64 \
+ -fuse-ld=gold \
+ -nostdlib \
+ -Wl,--no-undefined \
+ -Wl,--exclude-libs=ALL \
+ -Wl,-O1 \
+ -Wl,--as-needed \
+ -Wl,--gc-sections \
+ -Wl,--warn-shared-textrel
+
+
+LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
+
+LOCAL_STATIC_LIBRARIES :=
+
+# Enable grouping to fix circular references
+LOCAL_GROUP_STATIC_LIBRARIES := true
+
+LOCAL_SHARED_LIBRARIES := \
+ libstlport \
+ libdl
+
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_http_server_gyp
+
+# Alias gyp target name.
+.PHONY: http_server
+http_server: net_http_server_gyp
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/net/net.gyp b/net/net.gyp
index bd408e2643..28dcd4d7fc 100644
--- a/net/net.gyp
+++ b/net/net.gyp
@@ -136,8 +136,6 @@
'base/iovec.h',
'base/ip_endpoint.cc',
'base/ip_endpoint.h',
- 'base/ip_mapping_rules.cc',
- 'base/ip_mapping_rules.h',
'base/ip_pattern.cc',
'base/ip_pattern.h',
'base/keygen_handler.cc',
@@ -355,6 +353,8 @@
'disk_cache/blockfile/backend_impl.h',
'disk_cache/blockfile/backend_impl_v3.cc',
'disk_cache/blockfile/backend_impl_v3.h',
+ 'disk_cache/blockfile/backend_worker_v3.cc',
+ 'disk_cache/blockfile/backend_worker_v3.h',
'disk_cache/blockfile/bitmap.cc',
'disk_cache/blockfile/bitmap.h',
'disk_cache/blockfile/block_bitmaps_v3.cc',
@@ -488,8 +488,6 @@
'dns/host_resolver_proc.h',
'dns/mapped_host_resolver.cc',
'dns/mapped_host_resolver.h',
- 'dns/mapped_ip_resolver.cc',
- 'dns/mapped_ip_resolver.h',
'dns/mdns_cache.cc',
'dns/mdns_cache.h',
'dns/mdns_client.cc',
@@ -843,7 +841,7 @@
'quic/crypto/proof_source.h',
'quic/crypto/proof_source_chromium.cc',
'quic/crypto/proof_source_chromium.h',
- 'quic/crypto/proof_verifier.cc',
+ 'quic/crypto/proof_verifier.h',
'quic/crypto/proof_verifier_chromium.cc',
'quic/crypto/proof_verifier_chromium.h',
'quic/crypto/quic_crypto_client_config.cc',
@@ -882,6 +880,8 @@
'quic/quic_blocked_writer_interface.h',
'quic/quic_client_session.cc',
'quic/quic_client_session.h',
+ 'quic/quic_client_session_base.cc',
+ 'quic/quic_client_session_base.h',
'quic/quic_clock.cc',
'quic/quic_clock.h',
'quic/quic_config.cc',
@@ -1124,6 +1124,8 @@
'ssl/ssl_client_auth_cache.cc',
'ssl/ssl_client_auth_cache.h',
'ssl/ssl_client_cert_type.h',
+ 'ssl/ssl_config.cc',
+ 'ssl/ssl_config.h',
'ssl/ssl_config_service.cc',
'ssl/ssl_config_service.h',
'ssl/ssl_config_service_defaults.cc',
@@ -1409,22 +1411,17 @@
'third_party/mozilla_security_manager/nsPKCS12Blob.cpp',
'third_party/mozilla_security_manager/nsPKCS12Blob.h',
],
+ 'dependencies': [
+ '../third_party/openssl/openssl.gyp:openssl',
+ ],
},
{ # else !use_openssl: remove the unneeded files
'sources!': [
'base/crypto_module_openssl.cc',
'base/keygen_handler_openssl.cc',
- 'base/openssl_private_key_store.h',
- 'base/openssl_private_key_store_android.cc',
- 'base/openssl_private_key_store_memory.cc',
- 'cert/cert_database_openssl.cc',
- 'cert/cert_verify_proc_openssl.cc',
- 'cert/cert_verify_proc_openssl.h',
'cert/ct_log_verifier_openssl.cc',
'cert/ct_objects_extractor_openssl.cc',
'cert/jwk_serializer_openssl.cc',
- 'cert/test_root_certs_openssl.cc',
- 'cert/x509_certificate_openssl.cc',
'cert/x509_util_openssl.cc',
'cert/x509_util_openssl.h',
'quic/crypto/aead_base_decrypter_openssl.cc',
@@ -1442,11 +1439,23 @@
'socket/ssl_server_socket_openssl.cc',
'socket/ssl_session_cache_openssl.cc',
'socket/ssl_session_cache_openssl.h',
- 'ssl/openssl_client_key_store.cc',
- 'ssl/openssl_client_key_store.h',
],
},
],
+ [ 'use_openssl_certs == 0', {
+ 'sources!': [
+ 'base/openssl_private_key_store.h',
+ 'base/openssl_private_key_store_android.cc',
+ 'base/openssl_private_key_store_memory.cc',
+ 'cert/cert_database_openssl.cc',
+ 'cert/cert_verify_proc_openssl.cc',
+ 'cert/cert_verify_proc_openssl.h',
+ 'cert/test_root_certs_openssl.cc',
+ 'cert/x509_certificate_openssl.cc',
+ 'ssl/openssl_client_key_store.cc',
+ 'ssl/openssl_client_key_store.h',
+ ],
+ }],
[ 'use_glib == 1', {
'dependencies': [
'../build/linux/system.gyp:gconf',
@@ -1455,12 +1464,8 @@
}],
[ 'desktop_linux == 1 or chromeos == 1', {
'conditions': [
- ['use_openssl==1', {
- 'dependencies': [
- '../third_party/openssl/openssl.gyp:openssl',
- ],
- },
- { # else use_openssl==0, use NSS
+ ['use_openssl == 0', {
+ # use NSS
'dependencies': [
'../build/linux/system.gyp:ssl',
],
@@ -1569,10 +1574,15 @@
},
],
[ 'OS == "mac"', {
- 'dependencies': [
- '../third_party/nss/nss.gyp:nspr',
- '../third_party/nss/nss.gyp:nss',
- 'third_party/nss/ssl.gyp:libssl',
+ 'conditions': [
+ [ 'use_openssl == 0', {
+ 'dependencies': [
+ # defaults to nss
+ '../third_party/nss/nss.gyp:nspr',
+ '../third_party/nss/nss.gyp:nss',
+ 'third_party/nss/ssl.gyp:libssl',
+ ],
+ }],
],
'link_settings': {
'libraries': [
@@ -1692,7 +1702,6 @@
'base/host_mapping_rules_unittest.cc',
'base/host_port_pair_unittest.cc',
'base/ip_endpoint_unittest.cc',
- 'base/ip_mapping_rules_unittest.cc',
'base/ip_pattern_unittest.cc',
'base/keygen_handler_unittest.cc',
'base/mime_sniffer_unittest.cc',
@@ -2175,8 +2184,8 @@
}],
[ 'OS == "android"', {
'sources!': [
- # See bug 344533.
- 'disk_cache/blockfile/index_table_v3unittest.cc',
+ # See bug http://crbug.com/344533.
+ 'disk_cache/blockfile/index_table_v3_unittest.cc',
# No res_ninit() et al on Android, so this doesn't make a lot of
# sense.
'dns/dns_config_service_posix_unittest.cc',
@@ -2262,10 +2271,14 @@
'quic/test_tools/crypto_test_utils_openssl.cc',
'socket/ssl_client_socket_openssl_unittest.cc',
'socket/ssl_session_cache_openssl_unittest.cc',
- 'ssl/openssl_client_key_store_unittest.cc',
],
},
],
+ [ 'use_openssl_certs == 0', {
+ 'sources!': [
+ 'ssl/openssl_client_key_store_unittest.cc',
+ ],
+ }],
[ 'enable_websockets != 1', {
'sources/': [
['exclude', '^socket_stream/'],
@@ -2333,7 +2346,7 @@
'msvs_disabled_warnings': [4267, ],
},
],
- [ 'OS == "mac"', {
+ [ 'OS == "mac" and use_openssl == 0', {
'dependencies': [
'../third_party/nss/nss.gyp:nspr',
'../third_party/nss/nss.gyp:nss',
@@ -2382,8 +2395,8 @@
# OS is not "linux" or "freebsd" or "openbsd".
'socket/unix_domain_socket_posix_unittest.cc',
- # See bug 344533.
- 'disk_cache/v3/index_table_unittest.cc',
+ # See bug http://crbug.com/344533.
+ 'disk_cache/blockfile/index_table_v3_unittest.cc',
],
}],
[ 'OS == "android"', {
@@ -2742,49 +2755,6 @@
'msvs_disabled_warnings': [4267, ],
},
{
- 'target_name': 'fetch_client',
- 'type': 'executable',
- 'variables': { 'enable_wexit_time_destructors': 1, },
- 'dependencies': [
- '../base/base.gyp:base',
- '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
- '../testing/gtest.gyp:gtest',
- '../url/url.gyp:url_lib',
- 'net',
- 'net_with_v8',
- ],
- 'sources': [
- 'tools/fetch/fetch_client.cc',
- ],
- # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
- 'msvs_disabled_warnings': [4267, ],
- },
- {
- 'target_name': 'fetch_server',
- 'type': 'executable',
- 'variables': { 'enable_wexit_time_destructors': 1, },
- 'dependencies': [
- '../base/base.gyp:base',
- '../url/url.gyp:url_lib',
- 'net',
- ],
- 'sources': [
- 'tools/fetch/fetch_server.cc',
- 'tools/fetch/http_listen_socket.cc',
- 'tools/fetch/http_listen_socket.h',
- 'tools/fetch/http_server.cc',
- 'tools/fetch/http_server.h',
- 'tools/fetch/http_server_request_info.cc',
- 'tools/fetch/http_server_request_info.h',
- 'tools/fetch/http_server_response_info.cc',
- 'tools/fetch/http_server_response_info.h',
- 'tools/fetch/http_session.cc',
- 'tools/fetch/http_session.h',
- ],
- # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
- 'msvs_disabled_warnings': [4267, ],
- },
- {
'target_name': 'gdig',
'type': 'executable',
'dependencies': [
diff --git a/net/net.target.darwin-arm.mk b/net/net.target.darwin-arm.mk
index 19bb3a027a..eed3235b75 100644
--- a/net/net.target.darwin-arm.mk
+++ b/net/net.target.darwin-arm.mk
@@ -61,7 +61,6 @@ LOCAL_SRC_FILES := \
net/base/host_port_pair.cc \
net/base/io_buffer.cc \
net/base/ip_endpoint.cc \
- net/base/ip_mapping_rules.cc \
net/base/ip_pattern.cc \
net/base/keygen_handler.cc \
net/base/keygen_handler_openssl.cc \
@@ -134,6 +133,7 @@ LOCAL_SRC_FILES := \
net/disk_cache/blockfile/addr.cc \
net/disk_cache/blockfile/backend_impl.cc \
net/disk_cache/blockfile/backend_impl_v3.cc \
+ net/disk_cache/blockfile/backend_worker_v3.cc \
net/disk_cache/blockfile/bitmap.cc \
net/disk_cache/blockfile/block_bitmaps_v3.cc \
net/disk_cache/blockfile/block_files.cc \
@@ -189,7 +189,6 @@ LOCAL_SRC_FILES := \
net/dns/host_resolver_impl.cc \
net/dns/host_resolver_proc.cc \
net/dns/mapped_host_resolver.cc \
- net/dns/mapped_ip_resolver.cc \
net/dns/serial_worker.cc \
net/dns/single_request_host_resolver.cc \
net/filter/filter.cc \
@@ -332,7 +331,6 @@ LOCAL_SRC_FILES := \
net/quic/crypto/null_encrypter.cc \
net/quic/crypto/p256_key_exchange_openssl.cc \
net/quic/crypto/proof_source_chromium.cc \
- net/quic/crypto/proof_verifier.cc \
net/quic/crypto/proof_verifier_chromium.cc \
net/quic/crypto/quic_crypto_client_config.cc \
net/quic/crypto/quic_crypto_server_config.cc \
@@ -351,6 +349,7 @@ LOCAL_SRC_FILES := \
net/quic/quic_alarm.cc \
net/quic/quic_bandwidth.cc \
net/quic/quic_client_session.cc \
+ net/quic/quic_client_session_base.cc \
net/quic/quic_clock.cc \
net/quic/quic_config.cc \
net/quic/quic_connection.cc \
@@ -458,6 +457,7 @@ LOCAL_SRC_FILES := \
net/ssl/ssl_cert_request_info.cc \
net/ssl/ssl_cipher_suite_names.cc \
net/ssl/ssl_client_auth_cache.cc \
+ net/ssl/ssl_config.cc \
net/ssl/ssl_config_service.cc \
net/ssl/ssl_config_service_defaults.cc \
net/ssl/ssl_info.cc \
@@ -581,6 +581,7 @@ MY_DEFS_Debug := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -678,6 +679,7 @@ MY_DEFS_Release := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net.target.darwin-mips.mk b/net/net.target.darwin-mips.mk
index 18a34acf72..31da97e641 100644
--- a/net/net.target.darwin-mips.mk
+++ b/net/net.target.darwin-mips.mk
@@ -61,7 +61,6 @@ LOCAL_SRC_FILES := \
net/base/host_port_pair.cc \
net/base/io_buffer.cc \
net/base/ip_endpoint.cc \
- net/base/ip_mapping_rules.cc \
net/base/ip_pattern.cc \
net/base/keygen_handler.cc \
net/base/keygen_handler_openssl.cc \
@@ -134,6 +133,7 @@ LOCAL_SRC_FILES := \
net/disk_cache/blockfile/addr.cc \
net/disk_cache/blockfile/backend_impl.cc \
net/disk_cache/blockfile/backend_impl_v3.cc \
+ net/disk_cache/blockfile/backend_worker_v3.cc \
net/disk_cache/blockfile/bitmap.cc \
net/disk_cache/blockfile/block_bitmaps_v3.cc \
net/disk_cache/blockfile/block_files.cc \
@@ -189,7 +189,6 @@ LOCAL_SRC_FILES := \
net/dns/host_resolver_impl.cc \
net/dns/host_resolver_proc.cc \
net/dns/mapped_host_resolver.cc \
- net/dns/mapped_ip_resolver.cc \
net/dns/serial_worker.cc \
net/dns/single_request_host_resolver.cc \
net/filter/filter.cc \
@@ -332,7 +331,6 @@ LOCAL_SRC_FILES := \
net/quic/crypto/null_encrypter.cc \
net/quic/crypto/p256_key_exchange_openssl.cc \
net/quic/crypto/proof_source_chromium.cc \
- net/quic/crypto/proof_verifier.cc \
net/quic/crypto/proof_verifier_chromium.cc \
net/quic/crypto/quic_crypto_client_config.cc \
net/quic/crypto/quic_crypto_server_config.cc \
@@ -351,6 +349,7 @@ LOCAL_SRC_FILES := \
net/quic/quic_alarm.cc \
net/quic/quic_bandwidth.cc \
net/quic/quic_client_session.cc \
+ net/quic/quic_client_session_base.cc \
net/quic/quic_clock.cc \
net/quic/quic_config.cc \
net/quic/quic_connection.cc \
@@ -458,6 +457,7 @@ LOCAL_SRC_FILES := \
net/ssl/ssl_cert_request_info.cc \
net/ssl/ssl_cipher_suite_names.cc \
net/ssl/ssl_client_auth_cache.cc \
+ net/ssl/ssl_config.cc \
net/ssl/ssl_config_service.cc \
net/ssl/ssl_config_service_defaults.cc \
net/ssl/ssl_info.cc \
@@ -580,6 +580,7 @@ MY_DEFS_Debug := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -676,6 +677,7 @@ MY_DEFS_Release := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net.target.darwin-x86.mk b/net/net.target.darwin-x86.mk
index 04a91ae04f..071105f988 100644
--- a/net/net.target.darwin-x86.mk
+++ b/net/net.target.darwin-x86.mk
@@ -61,7 +61,6 @@ LOCAL_SRC_FILES := \
net/base/host_port_pair.cc \
net/base/io_buffer.cc \
net/base/ip_endpoint.cc \
- net/base/ip_mapping_rules.cc \
net/base/ip_pattern.cc \
net/base/keygen_handler.cc \
net/base/keygen_handler_openssl.cc \
@@ -134,6 +133,7 @@ LOCAL_SRC_FILES := \
net/disk_cache/blockfile/addr.cc \
net/disk_cache/blockfile/backend_impl.cc \
net/disk_cache/blockfile/backend_impl_v3.cc \
+ net/disk_cache/blockfile/backend_worker_v3.cc \
net/disk_cache/blockfile/bitmap.cc \
net/disk_cache/blockfile/block_bitmaps_v3.cc \
net/disk_cache/blockfile/block_files.cc \
@@ -189,7 +189,6 @@ LOCAL_SRC_FILES := \
net/dns/host_resolver_impl.cc \
net/dns/host_resolver_proc.cc \
net/dns/mapped_host_resolver.cc \
- net/dns/mapped_ip_resolver.cc \
net/dns/serial_worker.cc \
net/dns/single_request_host_resolver.cc \
net/filter/filter.cc \
@@ -332,7 +331,6 @@ LOCAL_SRC_FILES := \
net/quic/crypto/null_encrypter.cc \
net/quic/crypto/p256_key_exchange_openssl.cc \
net/quic/crypto/proof_source_chromium.cc \
- net/quic/crypto/proof_verifier.cc \
net/quic/crypto/proof_verifier_chromium.cc \
net/quic/crypto/quic_crypto_client_config.cc \
net/quic/crypto/quic_crypto_server_config.cc \
@@ -351,6 +349,7 @@ LOCAL_SRC_FILES := \
net/quic/quic_alarm.cc \
net/quic/quic_bandwidth.cc \
net/quic/quic_client_session.cc \
+ net/quic/quic_client_session_base.cc \
net/quic/quic_clock.cc \
net/quic/quic_config.cc \
net/quic/quic_connection.cc \
@@ -458,6 +457,7 @@ LOCAL_SRC_FILES := \
net/ssl/ssl_cert_request_info.cc \
net/ssl/ssl_cipher_suite_names.cc \
net/ssl/ssl_client_auth_cache.cc \
+ net/ssl/ssl_config.cc \
net/ssl/ssl_config_service.cc \
net/ssl/ssl_config_service_defaults.cc \
net/ssl/ssl_info.cc \
@@ -581,6 +581,7 @@ MY_DEFS_Debug := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -677,6 +678,7 @@ MY_DEFS_Release := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net.target.darwin-x86_64.mk b/net/net.target.darwin-x86_64.mk
new file mode 100644
index 0000000000..c05cd6df73
--- /dev/null
+++ b/net/net.target.darwin-x86_64.mk
@@ -0,0 +1,786 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+LOCAL_MODULE := net_net_gyp
+LOCAL_MODULE_SUFFIX := .a
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES := \
+ $(call intermediates-dir-for,GYP,third_party_icu_icui18n_gyp)/icui18n.stamp \
+ $(call intermediates-dir-for,GYP,third_party_icu_icuuc_gyp)/icuuc.stamp \
+ $(call intermediates-dir-for,GYP,net_net_resources_gyp)/net_resources.stamp \
+ $(call intermediates-dir-for,GYP,net_net_jni_headers_gyp)/net_jni_headers.stamp
+
+GYP_GENERATED_OUTPUTS :=
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_CPP_EXTENSION := .cc
+LOCAL_GENERATED_SOURCES :=
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES := \
+ net/android/cert_verify_result_android.cc \
+ net/android/gurl_utils.cc \
+ net/android/android_private_key.cc \
+ net/android/keystore.cc \
+ net/android/keystore_openssl.cc \
+ net/android/net_jni_registrar.cc \
+ net/android/network_change_notifier_android.cc \
+ net/android/network_change_notifier_delegate_android.cc \
+ net/android/network_change_notifier_factory_android.cc \
+ net/android/network_library.cc \
+ net/base/address_list.cc \
+ net/base/address_tracker_linux.cc \
+ net/base/auth.cc \
+ net/base/backoff_entry.cc \
+ net/base/bandwidth_metrics.cc \
+ net/base/connection_type_histograms.cc \
+ net/base/crypto_module_openssl.cc \
+ net/base/data_url.cc \
+ net/base/directory_lister.cc \
+ net/base/dns_reloader.cc \
+ net/base/dns_util.cc \
+ net/base/escape.cc \
+ net/base/file_stream.cc \
+ net/base/file_stream_context.cc \
+ net/base/file_stream_context_posix.cc \
+ net/base/file_stream_metrics.cc \
+ net/base/file_stream_metrics_posix.cc \
+ net/base/file_stream_net_log_parameters.cc \
+ net/base/int128.cc \
+ net/base/hash_value.cc \
+ net/base/host_mapping_rules.cc \
+ net/base/host_port_pair.cc \
+ net/base/io_buffer.cc \
+ net/base/ip_endpoint.cc \
+ net/base/ip_pattern.cc \
+ net/base/keygen_handler.cc \
+ net/base/keygen_handler_openssl.cc \
+ net/base/load_timing_info.cc \
+ net/base/mime_sniffer.cc \
+ net/base/mime_util.cc \
+ net/base/net_errors.cc \
+ net/base/net_errors_posix.cc \
+ net/base/net_log.cc \
+ net/base/net_log_logger.cc \
+ net/base/net_module.cc \
+ net/base/net_util.cc \
+ net/base/net_util_posix.cc \
+ net/base/network_change_notifier.cc \
+ net/base/network_delegate.cc \
+ net/base/network_time_notifier.cc \
+ net/base/openssl_private_key_store_android.cc \
+ net/base/platform_mime_util_linux.cc \
+ net/base/prioritized_dispatcher.cc \
+ net/base/registry_controlled_domains/registry_controlled_domain.cc \
+ net/base/request_priority.cc \
+ net/base/sdch_manager.cc \
+ net/base/static_cookie_policy.cc \
+ net/base/test_data_stream.cc \
+ net/base/upload_bytes_element_reader.cc \
+ net/base/upload_data_stream.cc \
+ net/base/upload_element.cc \
+ net/base/upload_element_reader.cc \
+ net/base/upload_file_element_reader.cc \
+ net/base/url_util.cc \
+ net/base/zap.cc \
+ net/cert/asn1_util.cc \
+ net/cert/cert_database.cc \
+ net/cert/cert_database_android.cc \
+ net/cert/cert_status_flags.cc \
+ net/cert/cert_verifier.cc \
+ net/cert/cert_verify_proc.cc \
+ net/cert/cert_verify_proc_android.cc \
+ net/cert/cert_verify_result.cc \
+ net/cert/crl_set.cc \
+ net/cert/ct_known_logs.cc \
+ net/cert/ct_log_verifier.cc \
+ net/cert/ct_log_verifier_openssl.cc \
+ net/cert/ct_objects_extractor_openssl.cc \
+ net/cert/ct_serialization.cc \
+ net/cert/ct_signed_certificate_timestamp_log_param.cc \
+ net/cert/ct_verify_result.cc \
+ net/cert/ev_root_ca_metadata.cc \
+ net/cert/jwk_serializer_openssl.cc \
+ net/cert/multi_log_ct_verifier.cc \
+ net/cert/multi_threaded_cert_verifier.cc \
+ net/cert/pem_tokenizer.cc \
+ net/cert/signed_certificate_timestamp.cc \
+ net/cert/single_request_cert_verifier.cc \
+ net/cert/test_root_certs.cc \
+ net/cert/test_root_certs_android.cc \
+ net/cert/x509_cert_types.cc \
+ net/cert/x509_certificate.cc \
+ net/cert/x509_certificate_net_log_param.cc \
+ net/cert/x509_certificate_openssl.cc \
+ net/cert/x509_util.cc \
+ net/cert/x509_util_android.cc \
+ net/cert/x509_util_openssl.cc \
+ net/cookies/canonical_cookie.cc \
+ net/cookies/cookie_constants.cc \
+ net/cookies/cookie_monster.cc \
+ net/cookies/cookie_store.cc \
+ net/cookies/cookie_util.cc \
+ net/cookies/parsed_cookie.cc \
+ net/disk_cache/blockfile/addr.cc \
+ net/disk_cache/blockfile/backend_impl.cc \
+ net/disk_cache/blockfile/backend_impl_v3.cc \
+ net/disk_cache/blockfile/backend_worker_v3.cc \
+ net/disk_cache/blockfile/bitmap.cc \
+ net/disk_cache/blockfile/block_bitmaps_v3.cc \
+ net/disk_cache/blockfile/block_files.cc \
+ net/disk_cache/blockfile/disk_format.cc \
+ net/disk_cache/blockfile/entry_impl.cc \
+ net/disk_cache/blockfile/entry_impl_v3.cc \
+ net/disk_cache/blockfile/eviction.cc \
+ net/disk_cache/blockfile/eviction_v3.cc \
+ net/disk_cache/blockfile/file.cc \
+ net/disk_cache/blockfile/file_lock.cc \
+ net/disk_cache/blockfile/file_posix.cc \
+ net/disk_cache/blockfile/in_flight_backend_io.cc \
+ net/disk_cache/blockfile/in_flight_io.cc \
+ net/disk_cache/blockfile/index_table_v3.cc \
+ net/disk_cache/blockfile/mapped_file.cc \
+ net/disk_cache/blockfile/mapped_file_avoid_mmap_posix.cc \
+ net/disk_cache/blockfile/rankings.cc \
+ net/disk_cache/blockfile/sparse_control.cc \
+ net/disk_cache/blockfile/stats.cc \
+ net/disk_cache/blockfile/stats_histogram.cc \
+ net/disk_cache/blockfile/trace.cc \
+ net/disk_cache/cache_creator.cc \
+ net/disk_cache/cache_util.cc \
+ net/disk_cache/cache_util_posix.cc \
+ net/disk_cache/memory/mem_backend_impl.cc \
+ net/disk_cache/memory/mem_entry_impl.cc \
+ net/disk_cache/memory/mem_rankings.cc \
+ net/disk_cache/net_log_parameters.cc \
+ net/disk_cache/simple/simple_backend_impl.cc \
+ net/disk_cache/simple/simple_entry_format.cc \
+ net/disk_cache/simple/simple_entry_impl.cc \
+ net/disk_cache/simple/simple_entry_operation.cc \
+ net/disk_cache/simple/simple_index.cc \
+ net/disk_cache/simple/simple_index_file.cc \
+ net/disk_cache/simple/simple_index_file_posix.cc \
+ net/disk_cache/simple/simple_net_log_parameters.cc \
+ net/disk_cache/simple/simple_synchronous_entry.cc \
+ net/disk_cache/simple/simple_util.cc \
+ net/disk_cache/simple/simple_version_upgrade.cc \
+ net/disk_cache/tracing/tracing_cache_backend.cc \
+ net/dns/address_sorter_posix.cc \
+ net/dns/dns_client.cc \
+ net/dns/dns_config_service.cc \
+ net/dns/dns_config_service_posix.cc \
+ net/dns/dns_hosts.cc \
+ net/dns/dns_query.cc \
+ net/dns/dns_response.cc \
+ net/dns/dns_session.cc \
+ net/dns/dns_socket_pool.cc \
+ net/dns/dns_transaction.cc \
+ net/dns/host_cache.cc \
+ net/dns/host_resolver.cc \
+ net/dns/host_resolver_impl.cc \
+ net/dns/host_resolver_proc.cc \
+ net/dns/mapped_host_resolver.cc \
+ net/dns/serial_worker.cc \
+ net/dns/single_request_host_resolver.cc \
+ net/filter/filter.cc \
+ net/filter/gzip_filter.cc \
+ net/filter/gzip_header.cc \
+ net/filter/sdch_filter.cc \
+ net/ftp/ftp_auth_cache.cc \
+ net/ftp/ftp_ctrl_response_buffer.cc \
+ net/ftp/ftp_directory_listing_parser.cc \
+ net/ftp/ftp_directory_listing_parser_ls.cc \
+ net/ftp/ftp_directory_listing_parser_netware.cc \
+ net/ftp/ftp_directory_listing_parser_os2.cc \
+ net/ftp/ftp_directory_listing_parser_vms.cc \
+ net/ftp/ftp_directory_listing_parser_windows.cc \
+ net/ftp/ftp_network_layer.cc \
+ net/ftp/ftp_network_session.cc \
+ net/ftp/ftp_network_transaction.cc \
+ net/ftp/ftp_response_info.cc \
+ net/ftp/ftp_server_type_histograms.cc \
+ net/ftp/ftp_util.cc \
+ net/http/des.cc \
+ net/http/disk_cache_based_quic_server_info.cc \
+ net/http/failing_http_transaction_factory.cc \
+ net/http/http_auth.cc \
+ net/http/http_auth_cache.cc \
+ net/http/http_auth_challenge_tokenizer.cc \
+ net/http/http_auth_controller.cc \
+ net/http/http_auth_filter.cc \
+ net/http/http_auth_handler.cc \
+ net/http/http_auth_handler_basic.cc \
+ net/http/http_auth_handler_digest.cc \
+ net/http/http_auth_handler_factory.cc \
+ net/http/http_auth_handler_ntlm.cc \
+ net/http/http_auth_handler_ntlm_portable.cc \
+ net/http/http_basic_state.cc \
+ net/http/http_basic_stream.cc \
+ net/http/http_byte_range.cc \
+ net/http/http_cache.cc \
+ net/http/http_cache_transaction.cc \
+ net/http/http_content_disposition.cc \
+ net/http/http_chunked_decoder.cc \
+ net/http/http_log_util.cc \
+ net/http/http_network_layer.cc \
+ net/http/http_network_session.cc \
+ net/http/http_network_session_peer.cc \
+ net/http/http_network_transaction.cc \
+ net/http/http_pipelined_connection_impl.cc \
+ net/http/http_pipelined_host.cc \
+ net/http/http_pipelined_host_forced.cc \
+ net/http/http_pipelined_host_impl.cc \
+ net/http/http_pipelined_host_pool.cc \
+ net/http/http_pipelined_stream.cc \
+ net/http/http_proxy_client_socket.cc \
+ net/http/http_proxy_client_socket_pool.cc \
+ net/http/http_request_headers.cc \
+ net/http/http_request_info.cc \
+ net/http/http_response_body_drainer.cc \
+ net/http/http_response_headers.cc \
+ net/http/http_response_info.cc \
+ net/http/http_security_headers.cc \
+ net/http/http_server_properties.cc \
+ net/http/http_server_properties_impl.cc \
+ net/http/http_status_code.cc \
+ net/http/http_stream_factory.cc \
+ net/http/http_stream_factory_impl.cc \
+ net/http/http_stream_factory_impl_job.cc \
+ net/http/http_stream_factory_impl_request.cc \
+ net/http/http_stream_parser.cc \
+ net/http/http_util.cc \
+ net/http/http_util_icu.cc \
+ net/http/http_vary_data.cc \
+ net/http/md4.cc \
+ net/http/partial_data.cc \
+ net/http/proxy_client_socket.cc \
+ net/http/proxy_connect_redirect_http_stream.cc \
+ net/http/transport_security_persister.cc \
+ net/http/transport_security_state.cc \
+ net/http/url_security_manager.cc \
+ net/http/url_security_manager_posix.cc \
+ net/proxy/dhcp_proxy_script_fetcher.cc \
+ net/proxy/dhcp_proxy_script_fetcher_factory.cc \
+ net/proxy/multi_threaded_proxy_resolver.cc \
+ net/proxy/network_delegate_error_observer.cc \
+ net/proxy/polling_proxy_config_service.cc \
+ net/proxy/proxy_bypass_rules.cc \
+ net/proxy/proxy_config.cc \
+ net/proxy/proxy_config_service_android.cc \
+ net/proxy/proxy_config_service_fixed.cc \
+ net/proxy/proxy_config_source.cc \
+ net/proxy/proxy_info.cc \
+ net/proxy/proxy_list.cc \
+ net/proxy/proxy_resolver_script_data.cc \
+ net/proxy/proxy_script_decider.cc \
+ net/proxy/proxy_script_fetcher_impl.cc \
+ net/proxy/proxy_server.cc \
+ net/proxy/proxy_service.cc \
+ net/quic/congestion_control/available_channel_estimator.cc \
+ net/quic/congestion_control/channel_estimator.cc \
+ net/quic/congestion_control/cube_root.cc \
+ net/quic/congestion_control/cubic.cc \
+ net/quic/congestion_control/fix_rate_receiver.cc \
+ net/quic/congestion_control/fix_rate_sender.cc \
+ net/quic/congestion_control/hybrid_slow_start.cc \
+ net/quic/congestion_control/inter_arrival_bitrate_ramp_up.cc \
+ net/quic/congestion_control/inter_arrival_overuse_detector.cc \
+ net/quic/congestion_control/inter_arrival_probe.cc \
+ net/quic/congestion_control/inter_arrival_receiver.cc \
+ net/quic/congestion_control/inter_arrival_sender.cc \
+ net/quic/congestion_control/inter_arrival_state_machine.cc \
+ net/quic/congestion_control/leaky_bucket.cc \
+ net/quic/congestion_control/loss_detection_interface.cc \
+ net/quic/congestion_control/paced_sender.cc \
+ net/quic/congestion_control/pacing_sender.cc \
+ net/quic/congestion_control/receive_algorithm_interface.cc \
+ net/quic/congestion_control/rtt_stats.cc \
+ net/quic/congestion_control/send_algorithm_interface.cc \
+ net/quic/congestion_control/tcp_cubic_sender.cc \
+ net/quic/congestion_control/tcp_loss_algorithm.cc \
+ net/quic/congestion_control/tcp_receiver.cc \
+ net/quic/congestion_control/time_loss_algorithm.cc \
+ net/quic/crypto/aead_base_decrypter_openssl.cc \
+ net/quic/crypto/aead_base_encrypter_openssl.cc \
+ net/quic/crypto/aes_128_gcm_12_decrypter_openssl.cc \
+ net/quic/crypto/aes_128_gcm_12_encrypter_openssl.cc \
+ net/quic/crypto/cert_compressor.cc \
+ net/quic/crypto/chacha20_poly1305_decrypter_openssl.cc \
+ net/quic/crypto/chacha20_poly1305_encrypter_openssl.cc \
+ net/quic/crypto/channel_id.cc \
+ net/quic/crypto/channel_id_openssl.cc \
+ net/quic/crypto/common_cert_set.cc \
+ net/quic/crypto/crypto_framer.cc \
+ net/quic/crypto/crypto_handshake.cc \
+ net/quic/crypto/crypto_handshake_message.cc \
+ net/quic/crypto/crypto_secret_boxer.cc \
+ net/quic/crypto/crypto_server_config_protobuf.cc \
+ net/quic/crypto/crypto_utils.cc \
+ net/quic/crypto/curve25519_key_exchange.cc \
+ net/quic/crypto/local_strike_register_client.cc \
+ net/quic/crypto/null_decrypter.cc \
+ net/quic/crypto/null_encrypter.cc \
+ net/quic/crypto/p256_key_exchange_openssl.cc \
+ net/quic/crypto/proof_source_chromium.cc \
+ net/quic/crypto/proof_verifier_chromium.cc \
+ net/quic/crypto/quic_crypto_client_config.cc \
+ net/quic/crypto/quic_crypto_server_config.cc \
+ net/quic/crypto/quic_decrypter.cc \
+ net/quic/crypto/quic_encrypter.cc \
+ net/quic/crypto/quic_random.cc \
+ net/quic/crypto/quic_server_info.cc \
+ net/quic/crypto/scoped_evp_aead_ctx.cc \
+ net/quic/crypto/strike_register.cc \
+ net/quic/crypto/source_address_token.cc \
+ net/quic/iovector.cc \
+ net/quic/port_suggester.cc \
+ net/quic/quic_ack_notifier.cc \
+ net/quic/quic_ack_notifier_manager.cc \
+ net/quic/quic_address_mismatch.cc \
+ net/quic/quic_alarm.cc \
+ net/quic/quic_bandwidth.cc \
+ net/quic/quic_client_session.cc \
+ net/quic/quic_client_session_base.cc \
+ net/quic/quic_clock.cc \
+ net/quic/quic_config.cc \
+ net/quic/quic_connection.cc \
+ net/quic/quic_connection_helper.cc \
+ net/quic/quic_connection_logger.cc \
+ net/quic/quic_connection_stats.cc \
+ net/quic/quic_crypto_client_stream.cc \
+ net/quic/quic_crypto_server_stream.cc \
+ net/quic/quic_crypto_stream.cc \
+ net/quic/quic_data_reader.cc \
+ net/quic/quic_data_stream.cc \
+ net/quic/quic_data_writer.cc \
+ net/quic/quic_default_packet_writer.cc \
+ net/quic/quic_fec_group.cc \
+ net/quic/quic_framer.cc \
+ net/quic/quic_headers_stream.cc \
+ net/quic/quic_http_stream.cc \
+ net/quic/quic_http_utils.cc \
+ net/quic/quic_packet_creator.cc \
+ net/quic/quic_packet_generator.cc \
+ net/quic/quic_protocol.cc \
+ net/quic/quic_received_packet_manager.cc \
+ net/quic/quic_reliable_client_stream.cc \
+ net/quic/quic_sent_entropy_manager.cc \
+ net/quic/quic_sent_packet_manager.cc \
+ net/quic/quic_session.cc \
+ net/quic/quic_session_key.cc \
+ net/quic/quic_socket_address_coder.cc \
+ net/quic/quic_stream_factory.cc \
+ net/quic/quic_stream_sequencer.cc \
+ net/quic/quic_time.cc \
+ net/quic/quic_unacked_packet_map.cc \
+ net/quic/quic_utils.cc \
+ net/quic/quic_write_blocked_list.cc \
+ net/quic/reliable_quic_stream.cc \
+ net/quic/spdy_utils.cc \
+ net/socket/buffered_write_stream_socket.cc \
+ net/socket/client_socket_factory.cc \
+ net/socket/client_socket_handle.cc \
+ net/socket/client_socket_pool.cc \
+ net/socket/client_socket_pool_base.cc \
+ net/socket/client_socket_pool_histograms.cc \
+ net/socket/client_socket_pool_manager.cc \
+ net/socket/client_socket_pool_manager_impl.cc \
+ net/socket/socket_descriptor.cc \
+ net/socket/socket_net_log_params.cc \
+ net/socket/socks5_client_socket.cc \
+ net/socket/socks_client_socket.cc \
+ net/socket/socks_client_socket_pool.cc \
+ net/socket/ssl_client_socket.cc \
+ net/socket/ssl_client_socket_openssl.cc \
+ net/socket/ssl_client_socket_pool.cc \
+ net/socket/ssl_error_params.cc \
+ net/socket/ssl_server_socket_openssl.cc \
+ net/socket/ssl_session_cache_openssl.cc \
+ net/socket/stream_listen_socket.cc \
+ net/socket/stream_socket.cc \
+ net/socket/tcp_client_socket.cc \
+ net/socket/tcp_listen_socket.cc \
+ net/socket/tcp_server_socket.cc \
+ net/socket/tcp_socket.cc \
+ net/socket/tcp_socket_libevent.cc \
+ net/socket/transport_client_socket_pool.cc \
+ net/socket/unix_domain_socket_posix.cc \
+ net/socket_stream/socket_stream.cc \
+ net/socket_stream/socket_stream_job.cc \
+ net/socket_stream/socket_stream_job_manager.cc \
+ net/socket_stream/socket_stream_metrics.cc \
+ net/spdy/buffered_spdy_framer.cc \
+ net/spdy/hpack_constants.cc \
+ net/spdy/hpack_decoder.cc \
+ net/spdy/hpack_encoder.cc \
+ net/spdy/hpack_encoding_context.cc \
+ net/spdy/hpack_entry.cc \
+ net/spdy/hpack_header_table.cc \
+ net/spdy/hpack_huffman_table.cc \
+ net/spdy/hpack_input_stream.cc \
+ net/spdy/hpack_output_stream.cc \
+ net/spdy/hpack_string_util.cc \
+ net/spdy/spdy_buffer.cc \
+ net/spdy/spdy_buffer_producer.cc \
+ net/spdy/spdy_frame_builder.cc \
+ net/spdy/spdy_frame_reader.cc \
+ net/spdy/spdy_framer.cc \
+ net/spdy/spdy_header_block.cc \
+ net/spdy/spdy_headers_block_parser.cc \
+ net/spdy/spdy_http_stream.cc \
+ net/spdy/spdy_http_utils.cc \
+ net/spdy/spdy_pinnable_buffer_piece.cc \
+ net/spdy/spdy_prefixed_buffer_reader.cc \
+ net/spdy/spdy_protocol.cc \
+ net/spdy/spdy_proxy_client_socket.cc \
+ net/spdy/spdy_read_queue.cc \
+ net/spdy/spdy_session.cc \
+ net/spdy/spdy_session_key.cc \
+ net/spdy/spdy_session_pool.cc \
+ net/spdy/spdy_stream.cc \
+ net/spdy/spdy_websocket_stream.cc \
+ net/spdy/spdy_write_queue.cc \
+ net/ssl/default_server_bound_cert_store.cc \
+ net/ssl/openssl_client_key_store.cc \
+ net/ssl/server_bound_cert_service.cc \
+ net/ssl/server_bound_cert_store.cc \
+ net/ssl/signed_certificate_timestamp_and_status.cc \
+ net/ssl/ssl_cert_request_info.cc \
+ net/ssl/ssl_cipher_suite_names.cc \
+ net/ssl/ssl_client_auth_cache.cc \
+ net/ssl/ssl_config.cc \
+ net/ssl/ssl_config_service.cc \
+ net/ssl/ssl_config_service_defaults.cc \
+ net/ssl/ssl_info.cc \
+ net/udp/udp_client_socket.cc \
+ net/udp/udp_net_log_parameters.cc \
+ net/udp/udp_server_socket.cc \
+ net/udp/udp_socket_libevent.cc \
+ net/url_request/data_protocol_handler.cc \
+ net/url_request/file_protocol_handler.cc \
+ net/url_request/ftp_protocol_handler.cc \
+ net/url_request/protocol_intercept_job_factory.cc \
+ net/url_request/static_http_user_agent_settings.cc \
+ net/url_request/url_fetcher.cc \
+ net/url_request/url_fetcher_core.cc \
+ net/url_request/url_fetcher_delegate.cc \
+ net/url_request/url_fetcher_impl.cc \
+ net/url_request/url_fetcher_response_writer.cc \
+ net/url_request/url_range_request_job.cc \
+ net/url_request/url_request.cc \
+ net/url_request/url_request_about_job.cc \
+ net/url_request/url_request_context.cc \
+ net/url_request/url_request_context_builder.cc \
+ net/url_request/url_request_context_getter.cc \
+ net/url_request/url_request_context_storage.cc \
+ net/url_request/url_request_data_job.cc \
+ net/url_request/url_request_error_job.cc \
+ net/url_request/url_request_file_dir_job.cc \
+ net/url_request/url_request_file_job.cc \
+ net/url_request/url_request_filter.cc \
+ net/url_request/url_request_ftp_job.cc \
+ net/url_request/url_request_http_job.cc \
+ net/url_request/url_request_job.cc \
+ net/url_request/url_request_job_factory.cc \
+ net/url_request/url_request_job_factory_impl.cc \
+ net/url_request/url_request_job_manager.cc \
+ net/url_request/url_request_netlog_params.cc \
+ net/url_request/url_request_redirect_job.cc \
+ net/url_request/url_request_simple_job.cc \
+ net/url_request/url_request_test_job.cc \
+ net/url_request/url_request_throttler_entry.cc \
+ net/url_request/url_request_throttler_header_adapter.cc \
+ net/url_request/url_request_throttler_manager.cc \
+ net/url_request/view_cache_helper.cc \
+ net/url_request/websocket_handshake_userdata_key.cc \
+ net/websockets/websocket_basic_handshake_stream.cc \
+ net/websockets/websocket_basic_stream.cc \
+ net/websockets/websocket_channel.cc \
+ net/websockets/websocket_deflate_predictor_impl.cc \
+ net/websockets/websocket_deflate_stream.cc \
+ net/websockets/websocket_deflater.cc \
+ net/websockets/websocket_errors.cc \
+ net/websockets/websocket_extension.cc \
+ net/websockets/websocket_extension_parser.cc \
+ net/websockets/websocket_frame.cc \
+ net/websockets/websocket_frame_parser.cc \
+ net/websockets/websocket_handshake_constants.cc \
+ net/websockets/websocket_handshake_handler.cc \
+ net/websockets/websocket_handshake_request_info.cc \
+ net/websockets/websocket_handshake_response_info.cc \
+ net/websockets/websocket_handshake_stream_create_helper.cc \
+ net/websockets/websocket_inflater.cc \
+ net/websockets/websocket_job.cc \
+ net/websockets/websocket_net_log_params.cc \
+ net/websockets/websocket_stream.cc \
+ net/websockets/websocket_throttle.cc
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DNET_IMPLEMENTATION' \
+ '-DPOSIX_AVOID_MMAP' \
+ '-DENABLE_BUILT_IN_DNS' \
+ '-DU_USING_ICU_NAMESPACE=0' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
+ $(LOCAL_PATH)/third_party/openssl \
+ $(LOCAL_PATH) \
+ $(LOCAL_PATH)/sdch/open-vcdiff/src \
+ $(PWD)/external/icu4c/common \
+ $(PWD)/external/icu4c/i18n \
+ $(LOCAL_PATH)/third_party/zlib \
+ $(gyp_shared_intermediate_dir)/net \
+ $(LOCAL_PATH)/third_party/openssl/config/x64 \
+ $(LOCAL_PATH)/third_party/openssl/openssl/include \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DNET_IMPLEMENTATION' \
+ '-DPOSIX_AVOID_MMAP' \
+ '-DENABLE_BUILT_IN_DNS' \
+ '-DU_USING_ICU_NAMESPACE=0' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
+ $(LOCAL_PATH)/third_party/openssl \
+ $(LOCAL_PATH) \
+ $(LOCAL_PATH)/sdch/open-vcdiff/src \
+ $(PWD)/external/icu4c/common \
+ $(PWD)/external/icu4c/i18n \
+ $(LOCAL_PATH)/third_party/zlib \
+ $(gyp_shared_intermediate_dir)/net \
+ $(LOCAL_PATH)/third_party/openssl/config/x64 \
+ $(LOCAL_PATH)/third_party/openssl/openssl/include \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+
+LOCAL_LDFLAGS_Debug := \
+ -Wl,--fatal-warnings \
+ -Wl,-z,now \
+ -Wl,-z,relro \
+ -Wl,-z,noexecstack \
+ -fPIC \
+ -m64 \
+ -fuse-ld=gold \
+ -nostdlib \
+ -Wl,--no-undefined \
+ -Wl,--exclude-libs=ALL \
+ -Wl,--gc-sections \
+ -Wl,--warn-shared-textrel \
+ -Wl,-O1 \
+ -Wl,--as-needed
+
+
+LOCAL_LDFLAGS_Release := \
+ -Wl,--fatal-warnings \
+ -Wl,-z,now \
+ -Wl,-z,relro \
+ -Wl,-z,noexecstack \
+ -fPIC \
+ -m64 \
+ -fuse-ld=gold \
+ -nostdlib \
+ -Wl,--no-undefined \
+ -Wl,--exclude-libs=ALL \
+ -Wl,-O1 \
+ -Wl,--as-needed \
+ -Wl,--gc-sections \
+ -Wl,--warn-shared-textrel
+
+
+LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
+
+LOCAL_STATIC_LIBRARIES :=
+
+# Enable grouping to fix circular references
+LOCAL_GROUP_STATIC_LIBRARIES := true
+
+LOCAL_SHARED_LIBRARIES := \
+ libstlport \
+ libdl
+
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_net_gyp
+
+# Alias gyp target name.
+.PHONY: net
+net: net_net_gyp
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/net/net.target.linux-arm.mk b/net/net.target.linux-arm.mk
index 19bb3a027a..eed3235b75 100644
--- a/net/net.target.linux-arm.mk
+++ b/net/net.target.linux-arm.mk
@@ -61,7 +61,6 @@ LOCAL_SRC_FILES := \
net/base/host_port_pair.cc \
net/base/io_buffer.cc \
net/base/ip_endpoint.cc \
- net/base/ip_mapping_rules.cc \
net/base/ip_pattern.cc \
net/base/keygen_handler.cc \
net/base/keygen_handler_openssl.cc \
@@ -134,6 +133,7 @@ LOCAL_SRC_FILES := \
net/disk_cache/blockfile/addr.cc \
net/disk_cache/blockfile/backend_impl.cc \
net/disk_cache/blockfile/backend_impl_v3.cc \
+ net/disk_cache/blockfile/backend_worker_v3.cc \
net/disk_cache/blockfile/bitmap.cc \
net/disk_cache/blockfile/block_bitmaps_v3.cc \
net/disk_cache/blockfile/block_files.cc \
@@ -189,7 +189,6 @@ LOCAL_SRC_FILES := \
net/dns/host_resolver_impl.cc \
net/dns/host_resolver_proc.cc \
net/dns/mapped_host_resolver.cc \
- net/dns/mapped_ip_resolver.cc \
net/dns/serial_worker.cc \
net/dns/single_request_host_resolver.cc \
net/filter/filter.cc \
@@ -332,7 +331,6 @@ LOCAL_SRC_FILES := \
net/quic/crypto/null_encrypter.cc \
net/quic/crypto/p256_key_exchange_openssl.cc \
net/quic/crypto/proof_source_chromium.cc \
- net/quic/crypto/proof_verifier.cc \
net/quic/crypto/proof_verifier_chromium.cc \
net/quic/crypto/quic_crypto_client_config.cc \
net/quic/crypto/quic_crypto_server_config.cc \
@@ -351,6 +349,7 @@ LOCAL_SRC_FILES := \
net/quic/quic_alarm.cc \
net/quic/quic_bandwidth.cc \
net/quic/quic_client_session.cc \
+ net/quic/quic_client_session_base.cc \
net/quic/quic_clock.cc \
net/quic/quic_config.cc \
net/quic/quic_connection.cc \
@@ -458,6 +457,7 @@ LOCAL_SRC_FILES := \
net/ssl/ssl_cert_request_info.cc \
net/ssl/ssl_cipher_suite_names.cc \
net/ssl/ssl_client_auth_cache.cc \
+ net/ssl/ssl_config.cc \
net/ssl/ssl_config_service.cc \
net/ssl/ssl_config_service_defaults.cc \
net/ssl/ssl_info.cc \
@@ -581,6 +581,7 @@ MY_DEFS_Debug := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -678,6 +679,7 @@ MY_DEFS_Release := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net.target.linux-mips.mk b/net/net.target.linux-mips.mk
index 18a34acf72..31da97e641 100644
--- a/net/net.target.linux-mips.mk
+++ b/net/net.target.linux-mips.mk
@@ -61,7 +61,6 @@ LOCAL_SRC_FILES := \
net/base/host_port_pair.cc \
net/base/io_buffer.cc \
net/base/ip_endpoint.cc \
- net/base/ip_mapping_rules.cc \
net/base/ip_pattern.cc \
net/base/keygen_handler.cc \
net/base/keygen_handler_openssl.cc \
@@ -134,6 +133,7 @@ LOCAL_SRC_FILES := \
net/disk_cache/blockfile/addr.cc \
net/disk_cache/blockfile/backend_impl.cc \
net/disk_cache/blockfile/backend_impl_v3.cc \
+ net/disk_cache/blockfile/backend_worker_v3.cc \
net/disk_cache/blockfile/bitmap.cc \
net/disk_cache/blockfile/block_bitmaps_v3.cc \
net/disk_cache/blockfile/block_files.cc \
@@ -189,7 +189,6 @@ LOCAL_SRC_FILES := \
net/dns/host_resolver_impl.cc \
net/dns/host_resolver_proc.cc \
net/dns/mapped_host_resolver.cc \
- net/dns/mapped_ip_resolver.cc \
net/dns/serial_worker.cc \
net/dns/single_request_host_resolver.cc \
net/filter/filter.cc \
@@ -332,7 +331,6 @@ LOCAL_SRC_FILES := \
net/quic/crypto/null_encrypter.cc \
net/quic/crypto/p256_key_exchange_openssl.cc \
net/quic/crypto/proof_source_chromium.cc \
- net/quic/crypto/proof_verifier.cc \
net/quic/crypto/proof_verifier_chromium.cc \
net/quic/crypto/quic_crypto_client_config.cc \
net/quic/crypto/quic_crypto_server_config.cc \
@@ -351,6 +349,7 @@ LOCAL_SRC_FILES := \
net/quic/quic_alarm.cc \
net/quic/quic_bandwidth.cc \
net/quic/quic_client_session.cc \
+ net/quic/quic_client_session_base.cc \
net/quic/quic_clock.cc \
net/quic/quic_config.cc \
net/quic/quic_connection.cc \
@@ -458,6 +457,7 @@ LOCAL_SRC_FILES := \
net/ssl/ssl_cert_request_info.cc \
net/ssl/ssl_cipher_suite_names.cc \
net/ssl/ssl_client_auth_cache.cc \
+ net/ssl/ssl_config.cc \
net/ssl/ssl_config_service.cc \
net/ssl/ssl_config_service_defaults.cc \
net/ssl/ssl_info.cc \
@@ -580,6 +580,7 @@ MY_DEFS_Debug := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -676,6 +677,7 @@ MY_DEFS_Release := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net.target.linux-x86.mk b/net/net.target.linux-x86.mk
index 04a91ae04f..071105f988 100644
--- a/net/net.target.linux-x86.mk
+++ b/net/net.target.linux-x86.mk
@@ -61,7 +61,6 @@ LOCAL_SRC_FILES := \
net/base/host_port_pair.cc \
net/base/io_buffer.cc \
net/base/ip_endpoint.cc \
- net/base/ip_mapping_rules.cc \
net/base/ip_pattern.cc \
net/base/keygen_handler.cc \
net/base/keygen_handler_openssl.cc \
@@ -134,6 +133,7 @@ LOCAL_SRC_FILES := \
net/disk_cache/blockfile/addr.cc \
net/disk_cache/blockfile/backend_impl.cc \
net/disk_cache/blockfile/backend_impl_v3.cc \
+ net/disk_cache/blockfile/backend_worker_v3.cc \
net/disk_cache/blockfile/bitmap.cc \
net/disk_cache/blockfile/block_bitmaps_v3.cc \
net/disk_cache/blockfile/block_files.cc \
@@ -189,7 +189,6 @@ LOCAL_SRC_FILES := \
net/dns/host_resolver_impl.cc \
net/dns/host_resolver_proc.cc \
net/dns/mapped_host_resolver.cc \
- net/dns/mapped_ip_resolver.cc \
net/dns/serial_worker.cc \
net/dns/single_request_host_resolver.cc \
net/filter/filter.cc \
@@ -332,7 +331,6 @@ LOCAL_SRC_FILES := \
net/quic/crypto/null_encrypter.cc \
net/quic/crypto/p256_key_exchange_openssl.cc \
net/quic/crypto/proof_source_chromium.cc \
- net/quic/crypto/proof_verifier.cc \
net/quic/crypto/proof_verifier_chromium.cc \
net/quic/crypto/quic_crypto_client_config.cc \
net/quic/crypto/quic_crypto_server_config.cc \
@@ -351,6 +349,7 @@ LOCAL_SRC_FILES := \
net/quic/quic_alarm.cc \
net/quic/quic_bandwidth.cc \
net/quic/quic_client_session.cc \
+ net/quic/quic_client_session_base.cc \
net/quic/quic_clock.cc \
net/quic/quic_config.cc \
net/quic/quic_connection.cc \
@@ -458,6 +457,7 @@ LOCAL_SRC_FILES := \
net/ssl/ssl_cert_request_info.cc \
net/ssl/ssl_cipher_suite_names.cc \
net/ssl/ssl_client_auth_cache.cc \
+ net/ssl/ssl_config.cc \
net/ssl/ssl_config_service.cc \
net/ssl/ssl_config_service_defaults.cc \
net/ssl/ssl_info.cc \
@@ -581,6 +581,7 @@ MY_DEFS_Debug := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -677,6 +678,7 @@ MY_DEFS_Release := \
'-DENABLE_BUILT_IN_DNS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net.target.linux-x86_64.mk b/net/net.target.linux-x86_64.mk
new file mode 100644
index 0000000000..c05cd6df73
--- /dev/null
+++ b/net/net.target.linux-x86_64.mk
@@ -0,0 +1,786 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+LOCAL_MODULE := net_net_gyp
+LOCAL_MODULE_SUFFIX := .a
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES := \
+ $(call intermediates-dir-for,GYP,third_party_icu_icui18n_gyp)/icui18n.stamp \
+ $(call intermediates-dir-for,GYP,third_party_icu_icuuc_gyp)/icuuc.stamp \
+ $(call intermediates-dir-for,GYP,net_net_resources_gyp)/net_resources.stamp \
+ $(call intermediates-dir-for,GYP,net_net_jni_headers_gyp)/net_jni_headers.stamp
+
+GYP_GENERATED_OUTPUTS :=
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_CPP_EXTENSION := .cc
+LOCAL_GENERATED_SOURCES :=
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES := \
+ net/android/cert_verify_result_android.cc \
+ net/android/gurl_utils.cc \
+ net/android/android_private_key.cc \
+ net/android/keystore.cc \
+ net/android/keystore_openssl.cc \
+ net/android/net_jni_registrar.cc \
+ net/android/network_change_notifier_android.cc \
+ net/android/network_change_notifier_delegate_android.cc \
+ net/android/network_change_notifier_factory_android.cc \
+ net/android/network_library.cc \
+ net/base/address_list.cc \
+ net/base/address_tracker_linux.cc \
+ net/base/auth.cc \
+ net/base/backoff_entry.cc \
+ net/base/bandwidth_metrics.cc \
+ net/base/connection_type_histograms.cc \
+ net/base/crypto_module_openssl.cc \
+ net/base/data_url.cc \
+ net/base/directory_lister.cc \
+ net/base/dns_reloader.cc \
+ net/base/dns_util.cc \
+ net/base/escape.cc \
+ net/base/file_stream.cc \
+ net/base/file_stream_context.cc \
+ net/base/file_stream_context_posix.cc \
+ net/base/file_stream_metrics.cc \
+ net/base/file_stream_metrics_posix.cc \
+ net/base/file_stream_net_log_parameters.cc \
+ net/base/int128.cc \
+ net/base/hash_value.cc \
+ net/base/host_mapping_rules.cc \
+ net/base/host_port_pair.cc \
+ net/base/io_buffer.cc \
+ net/base/ip_endpoint.cc \
+ net/base/ip_pattern.cc \
+ net/base/keygen_handler.cc \
+ net/base/keygen_handler_openssl.cc \
+ net/base/load_timing_info.cc \
+ net/base/mime_sniffer.cc \
+ net/base/mime_util.cc \
+ net/base/net_errors.cc \
+ net/base/net_errors_posix.cc \
+ net/base/net_log.cc \
+ net/base/net_log_logger.cc \
+ net/base/net_module.cc \
+ net/base/net_util.cc \
+ net/base/net_util_posix.cc \
+ net/base/network_change_notifier.cc \
+ net/base/network_delegate.cc \
+ net/base/network_time_notifier.cc \
+ net/base/openssl_private_key_store_android.cc \
+ net/base/platform_mime_util_linux.cc \
+ net/base/prioritized_dispatcher.cc \
+ net/base/registry_controlled_domains/registry_controlled_domain.cc \
+ net/base/request_priority.cc \
+ net/base/sdch_manager.cc \
+ net/base/static_cookie_policy.cc \
+ net/base/test_data_stream.cc \
+ net/base/upload_bytes_element_reader.cc \
+ net/base/upload_data_stream.cc \
+ net/base/upload_element.cc \
+ net/base/upload_element_reader.cc \
+ net/base/upload_file_element_reader.cc \
+ net/base/url_util.cc \
+ net/base/zap.cc \
+ net/cert/asn1_util.cc \
+ net/cert/cert_database.cc \
+ net/cert/cert_database_android.cc \
+ net/cert/cert_status_flags.cc \
+ net/cert/cert_verifier.cc \
+ net/cert/cert_verify_proc.cc \
+ net/cert/cert_verify_proc_android.cc \
+ net/cert/cert_verify_result.cc \
+ net/cert/crl_set.cc \
+ net/cert/ct_known_logs.cc \
+ net/cert/ct_log_verifier.cc \
+ net/cert/ct_log_verifier_openssl.cc \
+ net/cert/ct_objects_extractor_openssl.cc \
+ net/cert/ct_serialization.cc \
+ net/cert/ct_signed_certificate_timestamp_log_param.cc \
+ net/cert/ct_verify_result.cc \
+ net/cert/ev_root_ca_metadata.cc \
+ net/cert/jwk_serializer_openssl.cc \
+ net/cert/multi_log_ct_verifier.cc \
+ net/cert/multi_threaded_cert_verifier.cc \
+ net/cert/pem_tokenizer.cc \
+ net/cert/signed_certificate_timestamp.cc \
+ net/cert/single_request_cert_verifier.cc \
+ net/cert/test_root_certs.cc \
+ net/cert/test_root_certs_android.cc \
+ net/cert/x509_cert_types.cc \
+ net/cert/x509_certificate.cc \
+ net/cert/x509_certificate_net_log_param.cc \
+ net/cert/x509_certificate_openssl.cc \
+ net/cert/x509_util.cc \
+ net/cert/x509_util_android.cc \
+ net/cert/x509_util_openssl.cc \
+ net/cookies/canonical_cookie.cc \
+ net/cookies/cookie_constants.cc \
+ net/cookies/cookie_monster.cc \
+ net/cookies/cookie_store.cc \
+ net/cookies/cookie_util.cc \
+ net/cookies/parsed_cookie.cc \
+ net/disk_cache/blockfile/addr.cc \
+ net/disk_cache/blockfile/backend_impl.cc \
+ net/disk_cache/blockfile/backend_impl_v3.cc \
+ net/disk_cache/blockfile/backend_worker_v3.cc \
+ net/disk_cache/blockfile/bitmap.cc \
+ net/disk_cache/blockfile/block_bitmaps_v3.cc \
+ net/disk_cache/blockfile/block_files.cc \
+ net/disk_cache/blockfile/disk_format.cc \
+ net/disk_cache/blockfile/entry_impl.cc \
+ net/disk_cache/blockfile/entry_impl_v3.cc \
+ net/disk_cache/blockfile/eviction.cc \
+ net/disk_cache/blockfile/eviction_v3.cc \
+ net/disk_cache/blockfile/file.cc \
+ net/disk_cache/blockfile/file_lock.cc \
+ net/disk_cache/blockfile/file_posix.cc \
+ net/disk_cache/blockfile/in_flight_backend_io.cc \
+ net/disk_cache/blockfile/in_flight_io.cc \
+ net/disk_cache/blockfile/index_table_v3.cc \
+ net/disk_cache/blockfile/mapped_file.cc \
+ net/disk_cache/blockfile/mapped_file_avoid_mmap_posix.cc \
+ net/disk_cache/blockfile/rankings.cc \
+ net/disk_cache/blockfile/sparse_control.cc \
+ net/disk_cache/blockfile/stats.cc \
+ net/disk_cache/blockfile/stats_histogram.cc \
+ net/disk_cache/blockfile/trace.cc \
+ net/disk_cache/cache_creator.cc \
+ net/disk_cache/cache_util.cc \
+ net/disk_cache/cache_util_posix.cc \
+ net/disk_cache/memory/mem_backend_impl.cc \
+ net/disk_cache/memory/mem_entry_impl.cc \
+ net/disk_cache/memory/mem_rankings.cc \
+ net/disk_cache/net_log_parameters.cc \
+ net/disk_cache/simple/simple_backend_impl.cc \
+ net/disk_cache/simple/simple_entry_format.cc \
+ net/disk_cache/simple/simple_entry_impl.cc \
+ net/disk_cache/simple/simple_entry_operation.cc \
+ net/disk_cache/simple/simple_index.cc \
+ net/disk_cache/simple/simple_index_file.cc \
+ net/disk_cache/simple/simple_index_file_posix.cc \
+ net/disk_cache/simple/simple_net_log_parameters.cc \
+ net/disk_cache/simple/simple_synchronous_entry.cc \
+ net/disk_cache/simple/simple_util.cc \
+ net/disk_cache/simple/simple_version_upgrade.cc \
+ net/disk_cache/tracing/tracing_cache_backend.cc \
+ net/dns/address_sorter_posix.cc \
+ net/dns/dns_client.cc \
+ net/dns/dns_config_service.cc \
+ net/dns/dns_config_service_posix.cc \
+ net/dns/dns_hosts.cc \
+ net/dns/dns_query.cc \
+ net/dns/dns_response.cc \
+ net/dns/dns_session.cc \
+ net/dns/dns_socket_pool.cc \
+ net/dns/dns_transaction.cc \
+ net/dns/host_cache.cc \
+ net/dns/host_resolver.cc \
+ net/dns/host_resolver_impl.cc \
+ net/dns/host_resolver_proc.cc \
+ net/dns/mapped_host_resolver.cc \
+ net/dns/serial_worker.cc \
+ net/dns/single_request_host_resolver.cc \
+ net/filter/filter.cc \
+ net/filter/gzip_filter.cc \
+ net/filter/gzip_header.cc \
+ net/filter/sdch_filter.cc \
+ net/ftp/ftp_auth_cache.cc \
+ net/ftp/ftp_ctrl_response_buffer.cc \
+ net/ftp/ftp_directory_listing_parser.cc \
+ net/ftp/ftp_directory_listing_parser_ls.cc \
+ net/ftp/ftp_directory_listing_parser_netware.cc \
+ net/ftp/ftp_directory_listing_parser_os2.cc \
+ net/ftp/ftp_directory_listing_parser_vms.cc \
+ net/ftp/ftp_directory_listing_parser_windows.cc \
+ net/ftp/ftp_network_layer.cc \
+ net/ftp/ftp_network_session.cc \
+ net/ftp/ftp_network_transaction.cc \
+ net/ftp/ftp_response_info.cc \
+ net/ftp/ftp_server_type_histograms.cc \
+ net/ftp/ftp_util.cc \
+ net/http/des.cc \
+ net/http/disk_cache_based_quic_server_info.cc \
+ net/http/failing_http_transaction_factory.cc \
+ net/http/http_auth.cc \
+ net/http/http_auth_cache.cc \
+ net/http/http_auth_challenge_tokenizer.cc \
+ net/http/http_auth_controller.cc \
+ net/http/http_auth_filter.cc \
+ net/http/http_auth_handler.cc \
+ net/http/http_auth_handler_basic.cc \
+ net/http/http_auth_handler_digest.cc \
+ net/http/http_auth_handler_factory.cc \
+ net/http/http_auth_handler_ntlm.cc \
+ net/http/http_auth_handler_ntlm_portable.cc \
+ net/http/http_basic_state.cc \
+ net/http/http_basic_stream.cc \
+ net/http/http_byte_range.cc \
+ net/http/http_cache.cc \
+ net/http/http_cache_transaction.cc \
+ net/http/http_content_disposition.cc \
+ net/http/http_chunked_decoder.cc \
+ net/http/http_log_util.cc \
+ net/http/http_network_layer.cc \
+ net/http/http_network_session.cc \
+ net/http/http_network_session_peer.cc \
+ net/http/http_network_transaction.cc \
+ net/http/http_pipelined_connection_impl.cc \
+ net/http/http_pipelined_host.cc \
+ net/http/http_pipelined_host_forced.cc \
+ net/http/http_pipelined_host_impl.cc \
+ net/http/http_pipelined_host_pool.cc \
+ net/http/http_pipelined_stream.cc \
+ net/http/http_proxy_client_socket.cc \
+ net/http/http_proxy_client_socket_pool.cc \
+ net/http/http_request_headers.cc \
+ net/http/http_request_info.cc \
+ net/http/http_response_body_drainer.cc \
+ net/http/http_response_headers.cc \
+ net/http/http_response_info.cc \
+ net/http/http_security_headers.cc \
+ net/http/http_server_properties.cc \
+ net/http/http_server_properties_impl.cc \
+ net/http/http_status_code.cc \
+ net/http/http_stream_factory.cc \
+ net/http/http_stream_factory_impl.cc \
+ net/http/http_stream_factory_impl_job.cc \
+ net/http/http_stream_factory_impl_request.cc \
+ net/http/http_stream_parser.cc \
+ net/http/http_util.cc \
+ net/http/http_util_icu.cc \
+ net/http/http_vary_data.cc \
+ net/http/md4.cc \
+ net/http/partial_data.cc \
+ net/http/proxy_client_socket.cc \
+ net/http/proxy_connect_redirect_http_stream.cc \
+ net/http/transport_security_persister.cc \
+ net/http/transport_security_state.cc \
+ net/http/url_security_manager.cc \
+ net/http/url_security_manager_posix.cc \
+ net/proxy/dhcp_proxy_script_fetcher.cc \
+ net/proxy/dhcp_proxy_script_fetcher_factory.cc \
+ net/proxy/multi_threaded_proxy_resolver.cc \
+ net/proxy/network_delegate_error_observer.cc \
+ net/proxy/polling_proxy_config_service.cc \
+ net/proxy/proxy_bypass_rules.cc \
+ net/proxy/proxy_config.cc \
+ net/proxy/proxy_config_service_android.cc \
+ net/proxy/proxy_config_service_fixed.cc \
+ net/proxy/proxy_config_source.cc \
+ net/proxy/proxy_info.cc \
+ net/proxy/proxy_list.cc \
+ net/proxy/proxy_resolver_script_data.cc \
+ net/proxy/proxy_script_decider.cc \
+ net/proxy/proxy_script_fetcher_impl.cc \
+ net/proxy/proxy_server.cc \
+ net/proxy/proxy_service.cc \
+ net/quic/congestion_control/available_channel_estimator.cc \
+ net/quic/congestion_control/channel_estimator.cc \
+ net/quic/congestion_control/cube_root.cc \
+ net/quic/congestion_control/cubic.cc \
+ net/quic/congestion_control/fix_rate_receiver.cc \
+ net/quic/congestion_control/fix_rate_sender.cc \
+ net/quic/congestion_control/hybrid_slow_start.cc \
+ net/quic/congestion_control/inter_arrival_bitrate_ramp_up.cc \
+ net/quic/congestion_control/inter_arrival_overuse_detector.cc \
+ net/quic/congestion_control/inter_arrival_probe.cc \
+ net/quic/congestion_control/inter_arrival_receiver.cc \
+ net/quic/congestion_control/inter_arrival_sender.cc \
+ net/quic/congestion_control/inter_arrival_state_machine.cc \
+ net/quic/congestion_control/leaky_bucket.cc \
+ net/quic/congestion_control/loss_detection_interface.cc \
+ net/quic/congestion_control/paced_sender.cc \
+ net/quic/congestion_control/pacing_sender.cc \
+ net/quic/congestion_control/receive_algorithm_interface.cc \
+ net/quic/congestion_control/rtt_stats.cc \
+ net/quic/congestion_control/send_algorithm_interface.cc \
+ net/quic/congestion_control/tcp_cubic_sender.cc \
+ net/quic/congestion_control/tcp_loss_algorithm.cc \
+ net/quic/congestion_control/tcp_receiver.cc \
+ net/quic/congestion_control/time_loss_algorithm.cc \
+ net/quic/crypto/aead_base_decrypter_openssl.cc \
+ net/quic/crypto/aead_base_encrypter_openssl.cc \
+ net/quic/crypto/aes_128_gcm_12_decrypter_openssl.cc \
+ net/quic/crypto/aes_128_gcm_12_encrypter_openssl.cc \
+ net/quic/crypto/cert_compressor.cc \
+ net/quic/crypto/chacha20_poly1305_decrypter_openssl.cc \
+ net/quic/crypto/chacha20_poly1305_encrypter_openssl.cc \
+ net/quic/crypto/channel_id.cc \
+ net/quic/crypto/channel_id_openssl.cc \
+ net/quic/crypto/common_cert_set.cc \
+ net/quic/crypto/crypto_framer.cc \
+ net/quic/crypto/crypto_handshake.cc \
+ net/quic/crypto/crypto_handshake_message.cc \
+ net/quic/crypto/crypto_secret_boxer.cc \
+ net/quic/crypto/crypto_server_config_protobuf.cc \
+ net/quic/crypto/crypto_utils.cc \
+ net/quic/crypto/curve25519_key_exchange.cc \
+ net/quic/crypto/local_strike_register_client.cc \
+ net/quic/crypto/null_decrypter.cc \
+ net/quic/crypto/null_encrypter.cc \
+ net/quic/crypto/p256_key_exchange_openssl.cc \
+ net/quic/crypto/proof_source_chromium.cc \
+ net/quic/crypto/proof_verifier_chromium.cc \
+ net/quic/crypto/quic_crypto_client_config.cc \
+ net/quic/crypto/quic_crypto_server_config.cc \
+ net/quic/crypto/quic_decrypter.cc \
+ net/quic/crypto/quic_encrypter.cc \
+ net/quic/crypto/quic_random.cc \
+ net/quic/crypto/quic_server_info.cc \
+ net/quic/crypto/scoped_evp_aead_ctx.cc \
+ net/quic/crypto/strike_register.cc \
+ net/quic/crypto/source_address_token.cc \
+ net/quic/iovector.cc \
+ net/quic/port_suggester.cc \
+ net/quic/quic_ack_notifier.cc \
+ net/quic/quic_ack_notifier_manager.cc \
+ net/quic/quic_address_mismatch.cc \
+ net/quic/quic_alarm.cc \
+ net/quic/quic_bandwidth.cc \
+ net/quic/quic_client_session.cc \
+ net/quic/quic_client_session_base.cc \
+ net/quic/quic_clock.cc \
+ net/quic/quic_config.cc \
+ net/quic/quic_connection.cc \
+ net/quic/quic_connection_helper.cc \
+ net/quic/quic_connection_logger.cc \
+ net/quic/quic_connection_stats.cc \
+ net/quic/quic_crypto_client_stream.cc \
+ net/quic/quic_crypto_server_stream.cc \
+ net/quic/quic_crypto_stream.cc \
+ net/quic/quic_data_reader.cc \
+ net/quic/quic_data_stream.cc \
+ net/quic/quic_data_writer.cc \
+ net/quic/quic_default_packet_writer.cc \
+ net/quic/quic_fec_group.cc \
+ net/quic/quic_framer.cc \
+ net/quic/quic_headers_stream.cc \
+ net/quic/quic_http_stream.cc \
+ net/quic/quic_http_utils.cc \
+ net/quic/quic_packet_creator.cc \
+ net/quic/quic_packet_generator.cc \
+ net/quic/quic_protocol.cc \
+ net/quic/quic_received_packet_manager.cc \
+ net/quic/quic_reliable_client_stream.cc \
+ net/quic/quic_sent_entropy_manager.cc \
+ net/quic/quic_sent_packet_manager.cc \
+ net/quic/quic_session.cc \
+ net/quic/quic_session_key.cc \
+ net/quic/quic_socket_address_coder.cc \
+ net/quic/quic_stream_factory.cc \
+ net/quic/quic_stream_sequencer.cc \
+ net/quic/quic_time.cc \
+ net/quic/quic_unacked_packet_map.cc \
+ net/quic/quic_utils.cc \
+ net/quic/quic_write_blocked_list.cc \
+ net/quic/reliable_quic_stream.cc \
+ net/quic/spdy_utils.cc \
+ net/socket/buffered_write_stream_socket.cc \
+ net/socket/client_socket_factory.cc \
+ net/socket/client_socket_handle.cc \
+ net/socket/client_socket_pool.cc \
+ net/socket/client_socket_pool_base.cc \
+ net/socket/client_socket_pool_histograms.cc \
+ net/socket/client_socket_pool_manager.cc \
+ net/socket/client_socket_pool_manager_impl.cc \
+ net/socket/socket_descriptor.cc \
+ net/socket/socket_net_log_params.cc \
+ net/socket/socks5_client_socket.cc \
+ net/socket/socks_client_socket.cc \
+ net/socket/socks_client_socket_pool.cc \
+ net/socket/ssl_client_socket.cc \
+ net/socket/ssl_client_socket_openssl.cc \
+ net/socket/ssl_client_socket_pool.cc \
+ net/socket/ssl_error_params.cc \
+ net/socket/ssl_server_socket_openssl.cc \
+ net/socket/ssl_session_cache_openssl.cc \
+ net/socket/stream_listen_socket.cc \
+ net/socket/stream_socket.cc \
+ net/socket/tcp_client_socket.cc \
+ net/socket/tcp_listen_socket.cc \
+ net/socket/tcp_server_socket.cc \
+ net/socket/tcp_socket.cc \
+ net/socket/tcp_socket_libevent.cc \
+ net/socket/transport_client_socket_pool.cc \
+ net/socket/unix_domain_socket_posix.cc \
+ net/socket_stream/socket_stream.cc \
+ net/socket_stream/socket_stream_job.cc \
+ net/socket_stream/socket_stream_job_manager.cc \
+ net/socket_stream/socket_stream_metrics.cc \
+ net/spdy/buffered_spdy_framer.cc \
+ net/spdy/hpack_constants.cc \
+ net/spdy/hpack_decoder.cc \
+ net/spdy/hpack_encoder.cc \
+ net/spdy/hpack_encoding_context.cc \
+ net/spdy/hpack_entry.cc \
+ net/spdy/hpack_header_table.cc \
+ net/spdy/hpack_huffman_table.cc \
+ net/spdy/hpack_input_stream.cc \
+ net/spdy/hpack_output_stream.cc \
+ net/spdy/hpack_string_util.cc \
+ net/spdy/spdy_buffer.cc \
+ net/spdy/spdy_buffer_producer.cc \
+ net/spdy/spdy_frame_builder.cc \
+ net/spdy/spdy_frame_reader.cc \
+ net/spdy/spdy_framer.cc \
+ net/spdy/spdy_header_block.cc \
+ net/spdy/spdy_headers_block_parser.cc \
+ net/spdy/spdy_http_stream.cc \
+ net/spdy/spdy_http_utils.cc \
+ net/spdy/spdy_pinnable_buffer_piece.cc \
+ net/spdy/spdy_prefixed_buffer_reader.cc \
+ net/spdy/spdy_protocol.cc \
+ net/spdy/spdy_proxy_client_socket.cc \
+ net/spdy/spdy_read_queue.cc \
+ net/spdy/spdy_session.cc \
+ net/spdy/spdy_session_key.cc \
+ net/spdy/spdy_session_pool.cc \
+ net/spdy/spdy_stream.cc \
+ net/spdy/spdy_websocket_stream.cc \
+ net/spdy/spdy_write_queue.cc \
+ net/ssl/default_server_bound_cert_store.cc \
+ net/ssl/openssl_client_key_store.cc \
+ net/ssl/server_bound_cert_service.cc \
+ net/ssl/server_bound_cert_store.cc \
+ net/ssl/signed_certificate_timestamp_and_status.cc \
+ net/ssl/ssl_cert_request_info.cc \
+ net/ssl/ssl_cipher_suite_names.cc \
+ net/ssl/ssl_client_auth_cache.cc \
+ net/ssl/ssl_config.cc \
+ net/ssl/ssl_config_service.cc \
+ net/ssl/ssl_config_service_defaults.cc \
+ net/ssl/ssl_info.cc \
+ net/udp/udp_client_socket.cc \
+ net/udp/udp_net_log_parameters.cc \
+ net/udp/udp_server_socket.cc \
+ net/udp/udp_socket_libevent.cc \
+ net/url_request/data_protocol_handler.cc \
+ net/url_request/file_protocol_handler.cc \
+ net/url_request/ftp_protocol_handler.cc \
+ net/url_request/protocol_intercept_job_factory.cc \
+ net/url_request/static_http_user_agent_settings.cc \
+ net/url_request/url_fetcher.cc \
+ net/url_request/url_fetcher_core.cc \
+ net/url_request/url_fetcher_delegate.cc \
+ net/url_request/url_fetcher_impl.cc \
+ net/url_request/url_fetcher_response_writer.cc \
+ net/url_request/url_range_request_job.cc \
+ net/url_request/url_request.cc \
+ net/url_request/url_request_about_job.cc \
+ net/url_request/url_request_context.cc \
+ net/url_request/url_request_context_builder.cc \
+ net/url_request/url_request_context_getter.cc \
+ net/url_request/url_request_context_storage.cc \
+ net/url_request/url_request_data_job.cc \
+ net/url_request/url_request_error_job.cc \
+ net/url_request/url_request_file_dir_job.cc \
+ net/url_request/url_request_file_job.cc \
+ net/url_request/url_request_filter.cc \
+ net/url_request/url_request_ftp_job.cc \
+ net/url_request/url_request_http_job.cc \
+ net/url_request/url_request_job.cc \
+ net/url_request/url_request_job_factory.cc \
+ net/url_request/url_request_job_factory_impl.cc \
+ net/url_request/url_request_job_manager.cc \
+ net/url_request/url_request_netlog_params.cc \
+ net/url_request/url_request_redirect_job.cc \
+ net/url_request/url_request_simple_job.cc \
+ net/url_request/url_request_test_job.cc \
+ net/url_request/url_request_throttler_entry.cc \
+ net/url_request/url_request_throttler_header_adapter.cc \
+ net/url_request/url_request_throttler_manager.cc \
+ net/url_request/view_cache_helper.cc \
+ net/url_request/websocket_handshake_userdata_key.cc \
+ net/websockets/websocket_basic_handshake_stream.cc \
+ net/websockets/websocket_basic_stream.cc \
+ net/websockets/websocket_channel.cc \
+ net/websockets/websocket_deflate_predictor_impl.cc \
+ net/websockets/websocket_deflate_stream.cc \
+ net/websockets/websocket_deflater.cc \
+ net/websockets/websocket_errors.cc \
+ net/websockets/websocket_extension.cc \
+ net/websockets/websocket_extension_parser.cc \
+ net/websockets/websocket_frame.cc \
+ net/websockets/websocket_frame_parser.cc \
+ net/websockets/websocket_handshake_constants.cc \
+ net/websockets/websocket_handshake_handler.cc \
+ net/websockets/websocket_handshake_request_info.cc \
+ net/websockets/websocket_handshake_response_info.cc \
+ net/websockets/websocket_handshake_stream_create_helper.cc \
+ net/websockets/websocket_inflater.cc \
+ net/websockets/websocket_job.cc \
+ net/websockets/websocket_net_log_params.cc \
+ net/websockets/websocket_stream.cc \
+ net/websockets/websocket_throttle.cc
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DNET_IMPLEMENTATION' \
+ '-DPOSIX_AVOID_MMAP' \
+ '-DENABLE_BUILT_IN_DNS' \
+ '-DU_USING_ICU_NAMESPACE=0' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
+ $(LOCAL_PATH)/third_party/openssl \
+ $(LOCAL_PATH) \
+ $(LOCAL_PATH)/sdch/open-vcdiff/src \
+ $(PWD)/external/icu4c/common \
+ $(PWD)/external/icu4c/i18n \
+ $(LOCAL_PATH)/third_party/zlib \
+ $(gyp_shared_intermediate_dir)/net \
+ $(LOCAL_PATH)/third_party/openssl/config/x64 \
+ $(LOCAL_PATH)/third_party/openssl/openssl/include \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DNET_IMPLEMENTATION' \
+ '-DPOSIX_AVOID_MMAP' \
+ '-DENABLE_BUILT_IN_DNS' \
+ '-DU_USING_ICU_NAMESPACE=0' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
+ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
+ $(LOCAL_PATH)/third_party/openssl \
+ $(LOCAL_PATH) \
+ $(LOCAL_PATH)/sdch/open-vcdiff/src \
+ $(PWD)/external/icu4c/common \
+ $(PWD)/external/icu4c/i18n \
+ $(LOCAL_PATH)/third_party/zlib \
+ $(gyp_shared_intermediate_dir)/net \
+ $(LOCAL_PATH)/third_party/openssl/config/x64 \
+ $(LOCAL_PATH)/third_party/openssl/openssl/include \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+
+LOCAL_LDFLAGS_Debug := \
+ -Wl,--fatal-warnings \
+ -Wl,-z,now \
+ -Wl,-z,relro \
+ -Wl,-z,noexecstack \
+ -fPIC \
+ -m64 \
+ -fuse-ld=gold \
+ -nostdlib \
+ -Wl,--no-undefined \
+ -Wl,--exclude-libs=ALL \
+ -Wl,--gc-sections \
+ -Wl,--warn-shared-textrel \
+ -Wl,-O1 \
+ -Wl,--as-needed
+
+
+LOCAL_LDFLAGS_Release := \
+ -Wl,--fatal-warnings \
+ -Wl,-z,now \
+ -Wl,-z,relro \
+ -Wl,-z,noexecstack \
+ -fPIC \
+ -m64 \
+ -fuse-ld=gold \
+ -nostdlib \
+ -Wl,--no-undefined \
+ -Wl,--exclude-libs=ALL \
+ -Wl,-O1 \
+ -Wl,--as-needed \
+ -Wl,--gc-sections \
+ -Wl,--warn-shared-textrel
+
+
+LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
+
+LOCAL_STATIC_LIBRARIES :=
+
+# Enable grouping to fix circular references
+LOCAL_GROUP_STATIC_LIBRARIES := true
+
+LOCAL_SHARED_LIBRARIES := \
+ libstlport \
+ libdl
+
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_net_gyp
+
+# Alias gyp target name.
+.PHONY: net
+net: net_net_gyp
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/net/net_errors_java.target.darwin-arm.mk b/net/net_errors_java.target.darwin-arm.mk
index 649f9325d4..a570cbff50 100644
--- a/net/net_errors_java.target.darwin-arm.mk
+++ b/net/net_errors_java.target.darwin-arm.mk
@@ -94,6 +94,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -176,6 +177,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_errors_java.target.darwin-mips.mk b/net/net_errors_java.target.darwin-mips.mk
index 973cb6e70a..55a83d82d5 100644
--- a/net/net_errors_java.target.darwin-mips.mk
+++ b/net/net_errors_java.target.darwin-mips.mk
@@ -93,6 +93,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -174,6 +175,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_errors_java.target.darwin-x86.mk b/net/net_errors_java.target.darwin-x86.mk
index c0bd8cd577..c41c6f336a 100644
--- a/net/net_errors_java.target.darwin-x86.mk
+++ b/net/net_errors_java.target.darwin-x86.mk
@@ -95,6 +95,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -177,6 +178,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_errors_java.target.darwin-x86_64.mk b/net/net_errors_java.target.darwin-x86_64.mk
new file mode 100644
index 0000000000..77466a9d00
--- /dev/null
+++ b/net/net_errors_java.target.darwin-x86_64.mk
@@ -0,0 +1,233 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_net_errors_java_gyp
+LOCAL_MODULE_STEM := net_errors_java
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+
+### Generated for rule "net_net_gyp_net_errors_java_target_generate_java_constants":
+# "{'inputs': ['../build/android/gyp/util/build_utils.py', '../build/android/gyp/gcc_preprocess.py', 'base/net_error_list.h'], 'extension': 'template', 'outputs': ['$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'], 'variables': {'output_path': '$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'}, 'rule_name': 'generate_java_constants', 'rule_sources': ['android/java/NetError.template'], 'action': ['python', '../build/android/gyp/gcc_preprocess.py', '--include-path=..', '--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java', '--template=$(RULE_SOURCES)'], 'message': 'Generating Java from cpp template $(RULE_SOURCES)'}":
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java: $(LOCAL_PATH)/net/android/java/NetError.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/net/base/net_error_list.h $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/net; cd $(gyp_local_path)/net; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java" "--template=android/java/NetError.template"
+
+.PHONY: net_net_errors_java_gyp_rule_trigger
+net_net_errors_java_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java
+
+### Finished generating for all rules
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_GENERATED_SOURCES := \
+ net_net_errors_java_gyp_rule_trigger
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES :=
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_net_errors_java_gyp
+
+# Alias gyp target name.
+.PHONY: net_errors_java
+net_errors_java: net_net_errors_java_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/net_errors_java.target.linux-arm.mk b/net/net_errors_java.target.linux-arm.mk
index 649f9325d4..a570cbff50 100644
--- a/net/net_errors_java.target.linux-arm.mk
+++ b/net/net_errors_java.target.linux-arm.mk
@@ -94,6 +94,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -176,6 +177,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_errors_java.target.linux-mips.mk b/net/net_errors_java.target.linux-mips.mk
index 973cb6e70a..55a83d82d5 100644
--- a/net/net_errors_java.target.linux-mips.mk
+++ b/net/net_errors_java.target.linux-mips.mk
@@ -93,6 +93,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -174,6 +175,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_errors_java.target.linux-x86.mk b/net/net_errors_java.target.linux-x86.mk
index c0bd8cd577..c41c6f336a 100644
--- a/net/net_errors_java.target.linux-x86.mk
+++ b/net/net_errors_java.target.linux-x86.mk
@@ -95,6 +95,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -177,6 +178,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_errors_java.target.linux-x86_64.mk b/net/net_errors_java.target.linux-x86_64.mk
new file mode 100644
index 0000000000..77466a9d00
--- /dev/null
+++ b/net/net_errors_java.target.linux-x86_64.mk
@@ -0,0 +1,233 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_net_errors_java_gyp
+LOCAL_MODULE_STEM := net_errors_java
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+
+### Generated for rule "net_net_gyp_net_errors_java_target_generate_java_constants":
+# "{'inputs': ['../build/android/gyp/util/build_utils.py', '../build/android/gyp/gcc_preprocess.py', 'base/net_error_list.h'], 'extension': 'template', 'outputs': ['$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'], 'variables': {'output_path': '$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'}, 'rule_name': 'generate_java_constants', 'rule_sources': ['android/java/NetError.template'], 'action': ['python', '../build/android/gyp/gcc_preprocess.py', '--include-path=..', '--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java', '--template=$(RULE_SOURCES)'], 'message': 'Generating Java from cpp template $(RULE_SOURCES)'}":
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java: $(LOCAL_PATH)/net/android/java/NetError.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/net/base/net_error_list.h $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/net; cd $(gyp_local_path)/net; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java" "--template=android/java/NetError.template"
+
+.PHONY: net_net_errors_java_gyp_rule_trigger
+net_net_errors_java_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java
+
+### Finished generating for all rules
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/templates/org/chromium/net/NetError.java
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_GENERATED_SOURCES := \
+ net_net_errors_java_gyp_rule_trigger
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES :=
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_net_errors_java_gyp
+
+# Alias gyp target name.
+.PHONY: net_errors_java
+net_errors_java: net_net_errors_java_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/net_jni_headers.target.darwin-arm.mk b/net/net_jni_headers.target.darwin-arm.mk
index 72efa8f587..aa072be114 100644
--- a/net/net_jni_headers.target.darwin-arm.mk
+++ b/net/net_jni_headers.target.darwin-arm.mk
@@ -179,6 +179,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -261,6 +262,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_jni_headers.target.darwin-mips.mk b/net/net_jni_headers.target.darwin-mips.mk
index 1fc9cf36a6..b3d4e33cdc 100644
--- a/net/net_jni_headers.target.darwin-mips.mk
+++ b/net/net_jni_headers.target.darwin-mips.mk
@@ -178,6 +178,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -259,6 +260,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_jni_headers.target.darwin-x86.mk b/net/net_jni_headers.target.darwin-x86.mk
index 2993d90cec..7341032a6e 100644
--- a/net/net_jni_headers.target.darwin-x86.mk
+++ b/net/net_jni_headers.target.darwin-x86.mk
@@ -180,6 +180,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -262,6 +263,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_jni_headers.target.darwin-x86_64.mk b/net/net_jni_headers.target.darwin-x86_64.mk
new file mode 100644
index 0000000000..8bf705f299
--- /dev/null
+++ b/net/net_jni_headers.target.darwin-x86_64.mk
@@ -0,0 +1,318 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_net_jni_headers_gyp
+LOCAL_MODULE_STEM := net_jni_headers
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+
+### Generated for rule "net_net_gyp_net_jni_headers_target_generate_jni_headers":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/net/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/net/AndroidCertVerifyResult.java', 'android/java/src/org/chromium/net/AndroidKeyStore.java', 'android/java/src/org/chromium/net/AndroidNetworkLibrary.java', 'android/java/src/org/chromium/net/AndroidPrivateKey.java', 'android/java/src/org/chromium/net/GURLUtils.java', 'android/java/src/org/chromium/net/NetworkChangeNotifier.java', 'android/java/src/org/chromium/net/ProxyChangeListener.java', 'android/java/src/org/chromium/net/X509Util.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/net/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+$(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/AndroidCertVerifyResult.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/AndroidKeyStore.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/AndroidKeyStore.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/AndroidNetworkLibrary.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/AndroidPrivateKey.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/AndroidPrivateKey.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/GURLUtils.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/GURLUtils.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/NetworkChangeNotifier.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/ProxyChangeListener.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/ProxyChangeListener.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/X509Util.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/X509Util.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h
+
+### Finished generating for all rules
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_GENERATED_SOURCES := \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h \
+ net_net_jni_headers_gyp_rule_trigger
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES :=
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_net_jni_headers_gyp
+
+# Alias gyp target name.
+.PHONY: net_jni_headers
+net_jni_headers: net_net_jni_headers_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/net_jni_headers.target.linux-arm.mk b/net/net_jni_headers.target.linux-arm.mk
index 72efa8f587..aa072be114 100644
--- a/net/net_jni_headers.target.linux-arm.mk
+++ b/net/net_jni_headers.target.linux-arm.mk
@@ -179,6 +179,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -261,6 +262,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_jni_headers.target.linux-mips.mk b/net/net_jni_headers.target.linux-mips.mk
index 1fc9cf36a6..b3d4e33cdc 100644
--- a/net/net_jni_headers.target.linux-mips.mk
+++ b/net/net_jni_headers.target.linux-mips.mk
@@ -178,6 +178,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -259,6 +260,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_jni_headers.target.linux-x86.mk b/net/net_jni_headers.target.linux-x86.mk
index 2993d90cec..7341032a6e 100644
--- a/net/net_jni_headers.target.linux-x86.mk
+++ b/net/net_jni_headers.target.linux-x86.mk
@@ -180,6 +180,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -262,6 +263,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/net_jni_headers.target.linux-x86_64.mk b/net/net_jni_headers.target.linux-x86_64.mk
new file mode 100644
index 0000000000..8bf705f299
--- /dev/null
+++ b/net/net_jni_headers.target.linux-x86_64.mk
@@ -0,0 +1,318 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_net_jni_headers_gyp
+LOCAL_MODULE_STEM := net_jni_headers
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+
+### Generated for rule "net_net_gyp_net_jni_headers_target_generate_jni_headers":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/net/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['android/java/src/org/chromium/net/AndroidCertVerifyResult.java', 'android/java/src/org/chromium/net/AndroidKeyStore.java', 'android/java/src/org/chromium/net/AndroidNetworkLibrary.java', 'android/java/src/org/chromium/net/AndroidPrivateKey.java', 'android/java/src/org/chromium/net/GURLUtils.java', 'android/java/src/org/chromium/net/NetworkChangeNotifier.java', 'android/java/src/org/chromium/net/ProxyChangeListener.java', 'android/java/src/org/chromium/net/X509Util.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/net/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+$(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/AndroidCertVerifyResult.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/AndroidCertVerifyResult.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/AndroidKeyStore.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/AndroidKeyStore.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/AndroidNetworkLibrary.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/AndroidPrivateKey.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/AndroidPrivateKey.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/GURLUtils.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/GURLUtils.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/NetworkChangeNotifier.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/ProxyChangeListener.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/ProxyChangeListener.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h
+
+$(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h: $(LOCAL_PATH)/net/android/java/src/org/chromium/net/X509Util.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/net/jni; cd $(gyp_local_path)/net; ../base/android/jni_generator/jni_generator.py --input_file android/java/src/org/chromium/net/X509Util.java --output_dir "$(gyp_shared_intermediate_dir)/net/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+.PHONY: net_net_jni_headers_gyp_rule_trigger
+net_net_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h
+
+### Finished generating for all rules
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_GENERATED_SOURCES := \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidCertVerifyResult_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidKeyStore_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidNetworkLibrary_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/AndroidPrivateKey_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/GURLUtils_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/NetworkChangeNotifier_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/ProxyChangeListener_jni.h \
+ $(gyp_shared_intermediate_dir)/net/jni/X509Util_jni.h \
+ net_net_jni_headers_gyp_rule_trigger
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES :=
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_net_jni_headers_gyp
+
+# Alias gyp target name.
+.PHONY: net_jni_headers
+net_jni_headers: net_net_jni_headers_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/net_resources.target.darwin-x86.mk b/net/net_resources.target.darwin-x86.mk
index 89ede6f743..80db67d70a 100644
--- a/net/net_resources.target.darwin-x86.mk
+++ b/net/net_resources.target.darwin-x86.mk
@@ -20,7 +20,7 @@ $(gyp_shared_intermediate_dir)/net/grit/net_resources.h: gyp_shared_intermediate
$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/net/base/net_resources.grd $(LOCAL_PATH)/net/base/dir_header.html $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from base/net_resources.grd ($@)"
- $(hide)cd $(gyp_local_path)/net; mkdir -p $(gyp_shared_intermediate_dir)/net/grit $(gyp_shared_intermediate_dir)/net; python ../tools/grit/grit.py -i base/net_resources.grd build -f ../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/net" -D _chromium -E "CHROMIUM_BUILD=chromium" -D use_webaudio_enable_message -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" -D enable_printing -D use_concatenated_impulse_responses
+ $(hide)cd $(gyp_local_path)/net; mkdir -p $(gyp_shared_intermediate_dir)/net/grit $(gyp_shared_intermediate_dir)/net; python ../tools/grit/grit.py -i base/net_resources.grd build -f ../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/net" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" -D enable_printing -D use_concatenated_impulse_responses
$(gyp_shared_intermediate_dir)/net/net_resources.pak: $(gyp_shared_intermediate_dir)/net/grit/net_resources.h ;
$(gyp_shared_intermediate_dir)/net/net_resources.rc: $(gyp_shared_intermediate_dir)/net/grit/net_resources.h ;
diff --git a/net/net_resources.target.darwin-x86_64.mk b/net/net_resources.target.darwin-x86_64.mk
new file mode 100644
index 0000000000..80db67d70a
--- /dev/null
+++ b/net/net_resources.target.darwin-x86_64.mk
@@ -0,0 +1,54 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_net_resources_gyp
+LOCAL_MODULE_STEM := net_resources
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+### Rules for action "net_resources":
+$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/net/base/net_resources.grd $(LOCAL_PATH)/net/base/dir_header.html $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+ @echo "Gyp action: Generating resources from base/net_resources.grd ($@)"
+ $(hide)cd $(gyp_local_path)/net; mkdir -p $(gyp_shared_intermediate_dir)/net/grit $(gyp_shared_intermediate_dir)/net; python ../tools/grit/grit.py -i base/net_resources.grd build -f ../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/net" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" -D enable_printing -D use_concatenated_impulse_responses
+
+$(gyp_shared_intermediate_dir)/net/net_resources.pak: $(gyp_shared_intermediate_dir)/net/grit/net_resources.h ;
+$(gyp_shared_intermediate_dir)/net/net_resources.rc: $(gyp_shared_intermediate_dir)/net/grit/net_resources.h ;
+
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/net/grit/net_resources.h \
+ $(gyp_shared_intermediate_dir)/net/net_resources.pak \
+ $(gyp_shared_intermediate_dir)/net/net_resources.rc
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_net_resources_gyp
+
+# Alias gyp target name.
+.PHONY: net_resources
+net_resources: net_net_resources_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/net_resources.target.linux-x86.mk b/net/net_resources.target.linux-x86.mk
index 89ede6f743..80db67d70a 100644
--- a/net/net_resources.target.linux-x86.mk
+++ b/net/net_resources.target.linux-x86.mk
@@ -20,7 +20,7 @@ $(gyp_shared_intermediate_dir)/net/grit/net_resources.h: gyp_shared_intermediate
$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/net/base/net_resources.grd $(LOCAL_PATH)/net/base/dir_header.html $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
@echo "Gyp action: Generating resources from base/net_resources.grd ($@)"
- $(hide)cd $(gyp_local_path)/net; mkdir -p $(gyp_shared_intermediate_dir)/net/grit $(gyp_shared_intermediate_dir)/net; python ../tools/grit/grit.py -i base/net_resources.grd build -f ../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/net" -D _chromium -E "CHROMIUM_BUILD=chromium" -D use_webaudio_enable_message -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" -D enable_printing -D use_concatenated_impulse_responses
+ $(hide)cd $(gyp_local_path)/net; mkdir -p $(gyp_shared_intermediate_dir)/net/grit $(gyp_shared_intermediate_dir)/net; python ../tools/grit/grit.py -i base/net_resources.grd build -f ../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/net" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" -D enable_printing -D use_concatenated_impulse_responses
$(gyp_shared_intermediate_dir)/net/net_resources.pak: $(gyp_shared_intermediate_dir)/net/grit/net_resources.h ;
$(gyp_shared_intermediate_dir)/net/net_resources.rc: $(gyp_shared_intermediate_dir)/net/grit/net_resources.h ;
diff --git a/net/net_resources.target.linux-x86_64.mk b/net/net_resources.target.linux-x86_64.mk
new file mode 100644
index 0000000000..80db67d70a
--- /dev/null
+++ b/net/net_resources.target.linux-x86_64.mk
@@ -0,0 +1,54 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_net_resources_gyp
+LOCAL_MODULE_STEM := net_resources
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+### Rules for action "net_resources":
+$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/net/grit/net_resources.h: $(LOCAL_PATH)/tools/gritsettings/resource_ids $(LOCAL_PATH)/net/base/net_resources.grd $(LOCAL_PATH)/net/base/dir_header.html $(LOCAL_PATH)/tools/grit/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit.py $(LOCAL_PATH)/tools/grit/grit/__init__.py $(LOCAL_PATH)/tools/grit/grit/clique.py $(LOCAL_PATH)/tools/grit/grit/constants.py $(LOCAL_PATH)/tools/grit/grit/exception.py $(LOCAL_PATH)/tools/grit/grit/extern/BogoFP.py $(LOCAL_PATH)/tools/grit/grit/extern/FP.py $(LOCAL_PATH)/tools/grit/grit/extern/__init__.py $(LOCAL_PATH)/tools/grit/grit/extern/tclib.py $(LOCAL_PATH)/tools/grit/grit/format/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/android_xml.py $(LOCAL_PATH)/tools/grit/grit/format/c_format.py $(LOCAL_PATH)/tools/grit/grit/format/chrome_messages_json.py $(LOCAL_PATH)/tools/grit/grit/format/data_pack.py $(LOCAL_PATH)/tools/grit/grit/format/html_inline.py $(LOCAL_PATH)/tools/grit/grit/format/js_map_format.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/PRESUBMIT.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/policy_template_generator.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/template_formatter.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writer_configuration.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/__init__.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adm_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/adml_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/admx_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/doc_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/json_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/mock_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_helper.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_strings_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/plist_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/reg_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/template_writer.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/writer_unittest_common.py $(LOCAL_PATH)/tools/grit/grit/format/policy_templates/writers/xml_formatted_writer.py $(LOCAL_PATH)/tools/grit/grit/format/rc.py $(LOCAL_PATH)/tools/grit/grit/format/rc_header.py $(LOCAL_PATH)/tools/grit/grit/format/repack.py $(LOCAL_PATH)/tools/grit/grit/format/resource_map.py $(LOCAL_PATH)/tools/grit/grit/gather/__init__.py $(LOCAL_PATH)/tools/grit/grit/gather/admin_template.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_html.py $(LOCAL_PATH)/tools/grit/grit/gather/chrome_scaled_image.py $(LOCAL_PATH)/tools/grit/grit/gather/igoogle_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/interface.py $(LOCAL_PATH)/tools/grit/grit/gather/json_loader.py $(LOCAL_PATH)/tools/grit/grit/gather/muppet_strings.py $(LOCAL_PATH)/tools/grit/grit/gather/policy_json.py $(LOCAL_PATH)/tools/grit/grit/gather/rc.py $(LOCAL_PATH)/tools/grit/grit/gather/regexp.py $(LOCAL_PATH)/tools/grit/grit/gather/skeleton_gatherer.py $(LOCAL_PATH)/tools/grit/grit/gather/tr_html.py $(LOCAL_PATH)/tools/grit/grit/gather/txt.py $(LOCAL_PATH)/tools/grit/grit/grd_reader.py $(LOCAL_PATH)/tools/grit/grit/grit_runner.py $(LOCAL_PATH)/tools/grit/grit/lazy_re.py $(LOCAL_PATH)/tools/grit/grit/node/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/base.py $(LOCAL_PATH)/tools/grit/grit/node/custom/__init__.py $(LOCAL_PATH)/tools/grit/grit/node/custom/filename.py $(LOCAL_PATH)/tools/grit/grit/node/empty.py $(LOCAL_PATH)/tools/grit/grit/node/include.py $(LOCAL_PATH)/tools/grit/grit/node/io.py $(LOCAL_PATH)/tools/grit/grit/node/mapping.py $(LOCAL_PATH)/tools/grit/grit/node/message.py $(LOCAL_PATH)/tools/grit/grit/node/misc.py $(LOCAL_PATH)/tools/grit/grit/node/structure.py $(LOCAL_PATH)/tools/grit/grit/node/variant.py $(LOCAL_PATH)/tools/grit/grit/pseudo.py $(LOCAL_PATH)/tools/grit/grit/pseudo_rtl.py $(LOCAL_PATH)/tools/grit/grit/scons.py $(LOCAL_PATH)/tools/grit/grit/shortcuts.py $(LOCAL_PATH)/tools/grit/grit/shortcuts_unittests.py $(LOCAL_PATH)/tools/grit/grit/tclib.py $(LOCAL_PATH)/tools/grit/grit/test_suite_all.py $(LOCAL_PATH)/tools/grit/grit/tool/__init__.py $(LOCAL_PATH)/tools/grit/grit/tool/android2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/build.py $(LOCAL_PATH)/tools/grit/grit/tool/buildinfo.py $(LOCAL_PATH)/tools/grit/grit/tool/count.py $(LOCAL_PATH)/tools/grit/grit/tool/diff_structures.py $(LOCAL_PATH)/tools/grit/grit/tool/interface.py $(LOCAL_PATH)/tools/grit/grit/tool/menu_from_parts.py $(LOCAL_PATH)/tools/grit/grit/tool/newgrd.py $(LOCAL_PATH)/tools/grit/grit/tool/postprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/preprocess_interface.py $(LOCAL_PATH)/tools/grit/grit/tool/rc2grd.py $(LOCAL_PATH)/tools/grit/grit/tool/resize.py $(LOCAL_PATH)/tools/grit/grit/tool/test.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_postprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/toolbar_preprocess.py $(LOCAL_PATH)/tools/grit/grit/tool/transl2tc.py $(LOCAL_PATH)/tools/grit/grit/tool/unit.py $(LOCAL_PATH)/tools/grit/grit/tool/xmb.py $(LOCAL_PATH)/tools/grit/grit/util.py $(LOCAL_PATH)/tools/grit/grit/xtb_reader.py $(LOCAL_PATH)/tools/grit/grit_info.py $(GYP_TARGET_DEPENDENCIES)
+ @echo "Gyp action: Generating resources from base/net_resources.grd ($@)"
+ $(hide)cd $(gyp_local_path)/net; mkdir -p $(gyp_shared_intermediate_dir)/net/grit $(gyp_shared_intermediate_dir)/net; python ../tools/grit/grit.py -i base/net_resources.grd build -f ../tools/gritsettings/resource_ids -o "$(gyp_shared_intermediate_dir)/net" -D _chromium -E "CHROMIUM_BUILD=chromium" -t android -E "ANDROID_JAVA_TAGGED_ONLY=true" -D enable_printing -D use_concatenated_impulse_responses
+
+$(gyp_shared_intermediate_dir)/net/net_resources.pak: $(gyp_shared_intermediate_dir)/net/grit/net_resources.h ;
+$(gyp_shared_intermediate_dir)/net/net_resources.rc: $(gyp_shared_intermediate_dir)/net/grit/net_resources.h ;
+
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/net/grit/net_resources.h \
+ $(gyp_shared_intermediate_dir)/net/net_resources.pak \
+ $(gyp_shared_intermediate_dir)/net/net_resources.rc
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_net_resources_gyp
+
+# Alias gyp target name.
+.PHONY: net_resources
+net_resources: net_net_resources_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/private_key_types_java.target.darwin-arm.mk b/net/private_key_types_java.target.darwin-arm.mk
index 047e4466a7..96c213cb3a 100644
--- a/net/private_key_types_java.target.darwin-arm.mk
+++ b/net/private_key_types_java.target.darwin-arm.mk
@@ -94,6 +94,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -176,6 +177,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/private_key_types_java.target.darwin-mips.mk b/net/private_key_types_java.target.darwin-mips.mk
index 7911a78315..9358619503 100644
--- a/net/private_key_types_java.target.darwin-mips.mk
+++ b/net/private_key_types_java.target.darwin-mips.mk
@@ -93,6 +93,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -174,6 +175,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/private_key_types_java.target.darwin-x86.mk b/net/private_key_types_java.target.darwin-x86.mk
index 50c0dff470..e1cd167fce 100644
--- a/net/private_key_types_java.target.darwin-x86.mk
+++ b/net/private_key_types_java.target.darwin-x86.mk
@@ -95,6 +95,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -177,6 +178,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/private_key_types_java.target.darwin-x86_64.mk b/net/private_key_types_java.target.darwin-x86_64.mk
new file mode 100644
index 0000000000..6059d01e14
--- /dev/null
+++ b/net/private_key_types_java.target.darwin-x86_64.mk
@@ -0,0 +1,233 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_private_key_types_java_gyp
+LOCAL_MODULE_STEM := private_key_types_java
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+
+### Generated for rule "net_net_gyp_private_key_types_java_target_generate_java_constants":
+# "{'inputs': ['../build/android/gyp/util/build_utils.py', '../build/android/gyp/gcc_preprocess.py', 'android/private_key_type_list.h'], 'extension': 'template', 'outputs': ['$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'], 'variables': {'output_path': '$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'}, 'rule_name': 'generate_java_constants', 'rule_sources': ['android/java/PrivateKeyType.template'], 'action': ['python', '../build/android/gyp/gcc_preprocess.py', '--include-path=..', '--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java', '--template=$(RULE_SOURCES)'], 'message': 'Generating Java from cpp template $(RULE_SOURCES)'}":
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java: $(LOCAL_PATH)/net/android/java/PrivateKeyType.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/net/android/private_key_type_list.h $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/net; cd $(gyp_local_path)/net; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java" "--template=android/java/PrivateKeyType.template"
+
+.PHONY: net_private_key_types_java_gyp_rule_trigger
+net_private_key_types_java_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java
+
+### Finished generating for all rules
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_GENERATED_SOURCES := \
+ net_private_key_types_java_gyp_rule_trigger
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES :=
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_private_key_types_java_gyp
+
+# Alias gyp target name.
+.PHONY: private_key_types_java
+private_key_types_java: net_private_key_types_java_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/private_key_types_java.target.linux-arm.mk b/net/private_key_types_java.target.linux-arm.mk
index 047e4466a7..96c213cb3a 100644
--- a/net/private_key_types_java.target.linux-arm.mk
+++ b/net/private_key_types_java.target.linux-arm.mk
@@ -94,6 +94,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -176,6 +177,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/private_key_types_java.target.linux-mips.mk b/net/private_key_types_java.target.linux-mips.mk
index 7911a78315..9358619503 100644
--- a/net/private_key_types_java.target.linux-mips.mk
+++ b/net/private_key_types_java.target.linux-mips.mk
@@ -93,6 +93,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -174,6 +175,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/private_key_types_java.target.linux-x86.mk b/net/private_key_types_java.target.linux-x86.mk
index 50c0dff470..e1cd167fce 100644
--- a/net/private_key_types_java.target.linux-x86.mk
+++ b/net/private_key_types_java.target.linux-x86.mk
@@ -95,6 +95,7 @@ MY_DEFS_Debug := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
@@ -177,6 +178,7 @@ MY_DEFS_Release := \
'-DENABLE_PRINTING=1' \
'-DENABLE_MANAGED_USERS=1' \
'-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
'-D__STDC_CONSTANT_MACROS' \
'-D__STDC_FORMAT_MACROS' \
'-DANDROID' \
diff --git a/net/private_key_types_java.target.linux-x86_64.mk b/net/private_key_types_java.target.linux-x86_64.mk
new file mode 100644
index 0000000000..6059d01e14
--- /dev/null
+++ b/net/private_key_types_java.target.linux-x86_64.mk
@@ -0,0 +1,233 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := net_private_key_types_java_gyp
+LOCAL_MODULE_STEM := private_key_types_java
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES :=
+
+
+### Generated for rule "net_net_gyp_private_key_types_java_target_generate_java_constants":
+# "{'inputs': ['../build/android/gyp/util/build_utils.py', '../build/android/gyp/gcc_preprocess.py', 'android/private_key_type_list.h'], 'extension': 'template', 'outputs': ['$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'], 'variables': {'output_path': '$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java'}, 'rule_name': 'generate_java_constants', 'rule_sources': ['android/java/PrivateKeyType.template'], 'action': ['python', '../build/android/gyp/gcc_preprocess.py', '--include-path=..', '--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/%(INPUT_ROOT)s.java', '--template=$(RULE_SOURCES)'], 'message': 'Generating Java from cpp template $(RULE_SOURCES)'}":
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java: $(LOCAL_PATH)/net/android/java/PrivateKeyType.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/net/android/private_key_type_list.h $(GYP_TARGET_DEPENDENCIES)
+ mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/net; cd $(gyp_local_path)/net; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java" "--template=android/java/PrivateKeyType.template"
+
+.PHONY: net_private_key_types_java_gyp_rule_trigger
+net_private_key_types_java_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java
+
+### Finished generating for all rules
+
+GYP_GENERATED_OUTPUTS := \
+ $(gyp_shared_intermediate_dir)/templates/org/chromium/net/PrivateKeyType.java
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+LOCAL_GENERATED_SOURCES := \
+ net_private_key_types_java_gyp_rule_trigger
+
+GYP_COPIED_SOURCE_ORIGIN_DIRS :=
+
+LOCAL_SRC_FILES :=
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Debug := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -g \
+ -fomit-frame-pointer \
+ -fdata-sections \
+ -ffunction-sections \
+ -funwind-tables
+
+MY_DEFS_Debug := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
+ '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
+ '-D_DEBUG'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Debug := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Debug := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+# Flags passed to both C and C++ files.
+MY_CFLAGS_Release := \
+ -fstack-protector \
+ --param=ssp-buffer-size=4 \
+ -Werror \
+ -fno-exceptions \
+ -fno-strict-aliasing \
+ -Wall \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -fvisibility=hidden \
+ -pipe \
+ -fPIC \
+ -Wno-unused-local-typedefs \
+ -m64 \
+ -march=x86-64 \
+ -fuse-ld=gold \
+ -ffunction-sections \
+ -funwind-tables \
+ -g \
+ -fstack-protector \
+ -fno-short-enums \
+ -finline-limit=64 \
+ -Wa,--noexecstack \
+ -U_FORTIFY_SOURCE \
+ -Wno-extra \
+ -Wno-ignored-qualifiers \
+ -Wno-type-limits \
+ -Wno-unused-but-set-variable \
+ -Os \
+ -fno-ident \
+ -fdata-sections \
+ -ffunction-sections \
+ -fomit-frame-pointer \
+ -funwind-tables
+
+MY_DEFS_Release := \
+ '-DV8_DEPRECATION_WARNINGS' \
+ '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
+ '-D_FILE_OFFSET_BITS=64' \
+ '-DNO_TCMALLOC' \
+ '-DDISABLE_NACL' \
+ '-DCHROMIUM_BUILD' \
+ '-DUSE_LIBJPEG_TURBO=1' \
+ '-DUSE_PROPRIETARY_CODECS' \
+ '-DENABLE_CONFIGURATION_POLICY' \
+ '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
+ '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
+ '-DENABLE_EGLIMAGE=1' \
+ '-DCLD_VERSION=1' \
+ '-DENABLE_PRINTING=1' \
+ '-DENABLE_MANAGED_USERS=1' \
+ '-DUSE_OPENSSL=1' \
+ '-DUSE_OPENSSL_CERTS=1' \
+ '-D__STDC_CONSTANT_MACROS' \
+ '-D__STDC_FORMAT_MACROS' \
+ '-DANDROID' \
+ '-D__GNU_SOURCE=1' \
+ '-DUSE_STLPORT=1' \
+ '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
+ '-DCHROME_BUILD_ID=""' \
+ '-DNDEBUG' \
+ '-DNVALGRIND' \
+ '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
+ '-D_FORTIFY_SOURCE=2'
+
+
+# Include paths placed before CFLAGS/CPPFLAGS
+LOCAL_C_INCLUDES_Release := \
+ $(PWD)/frameworks/wilhelm/include \
+ $(PWD)/bionic \
+ $(PWD)/external/stlport/stlport
+
+
+# Flags passed to only C++ (and not C) files.
+LOCAL_CPPFLAGS_Release := \
+ -fno-rtti \
+ -fno-threadsafe-statics \
+ -fvisibility-inlines-hidden \
+ -Wsign-compare \
+ -Wno-non-virtual-dtor \
+ -Wno-sign-promo
+
+
+LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
+LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
+LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: net_private_key_types_java_gyp
+
+# Alias gyp target name.
+.PHONY: private_key_types_java
+private_key_types_java: net_private_key_types_java_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+ $(hide) echo "Gyp timestamp: $@"
+ $(hide) mkdir -p $(dir $@)
+ $(hide) touch $@
diff --git a/net/proxy/network_delegate_error_observer_unittest.cc b/net/proxy/network_delegate_error_observer_unittest.cc
index a893cbafd2..1f6330f0dd 100644
--- a/net/proxy/network_delegate_error_observer_unittest.cc
+++ b/net/proxy/network_delegate_error_observer_unittest.cc
@@ -41,7 +41,8 @@ class TestNetworkDelegate : public net::NetworkDelegate {
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE {
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) OVERRIDE {
return net::OK;
}
virtual void OnBeforeRedirect(URLRequest* request,
diff --git a/net/proxy/proxy_script_fetcher_impl_unittest.cc b/net/proxy/proxy_script_fetcher_impl_unittest.cc
index 2dbcfed521..f0505540ed 100644
--- a/net/proxy/proxy_script_fetcher_impl_unittest.cc
+++ b/net/proxy/proxy_script_fetcher_impl_unittest.cc
@@ -126,8 +126,8 @@ class BasicNetworkDelegate : public NetworkDelegate {
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers)
- OVERRIDE {
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) OVERRIDE {
return OK;
}
diff --git a/net/quic/crypto/chacha20_poly1305_decrypter.h b/net/quic/crypto/chacha20_poly1305_decrypter.h
index 638fb4a09f..b53d64a788 100644
--- a/net/quic/crypto/chacha20_poly1305_decrypter.h
+++ b/net/quic/crypto/chacha20_poly1305_decrypter.h
@@ -11,7 +11,8 @@ namespace net {
// A ChaCha20Poly1305Decrypter is a QuicDecrypter that implements the
// AEAD_CHACHA20_POLY1305 algorithm specified in
-// draft-agl-tls-chacha20poly1305-04. Create an instance by calling
+// draft-agl-tls-chacha20poly1305-04, except that it truncates the Poly1305
+// authenticator to 12 bytes. Create an instance by calling
// QuicDecrypter::Create(kCC12).
//
// It uses an authentication tag of 16 bytes (128 bits). There is no
@@ -19,7 +20,7 @@ namespace net {
class NET_EXPORT_PRIVATE ChaCha20Poly1305Decrypter : public AeadBaseDecrypter {
public:
enum {
- kAuthTagSize = 16,
+ kAuthTagSize = 12,
};
ChaCha20Poly1305Decrypter();
diff --git a/net/quic/crypto/chacha20_poly1305_decrypter_test.cc b/net/quic/crypto/chacha20_poly1305_decrypter_test.cc
index 8482e01cf5..1825187bb3 100644
--- a/net/quic/crypto/chacha20_poly1305_decrypter_test.cc
+++ b/net/quic/crypto/chacha20_poly1305_decrypter_test.cc
@@ -33,7 +33,7 @@ const TestVector test_vectors[] = {
"0a1007",
"cd7cf67be39c794a",
"87e229d4500845a079c0",
- "e3e446f7ede9a19b62a4677dabf4e3d24b876bb284753896e1d6",
+ "e3e446f7ede9a19b62a4677dabf4e3d24b876bb28475", // "3896e1d6" truncated.
"86d09974840bded2a5ca"
},
// Modify the ciphertext (ChaCha20 encryption output).
@@ -41,7 +41,7 @@ const TestVector test_vectors[] = {
"0a1007",
"cd7cf67be39c794a",
"87e229d4500845a079c0",
- "f3e446f7ede9a19b62a4677dabf4e3d24b876bb284753896e1d6",
+ "f3e446f7ede9a19b62a4677dabf4e3d24b876bb28475", // "3896e1d6" truncated.
NULL // FAIL
},
// Modify the ciphertext (Poly1305 authenticator).
@@ -49,7 +49,7 @@ const TestVector test_vectors[] = {
"0a1007",
"cd7cf67be39c794a",
"87e229d4500845a079c0",
- "e3e446f7ede9a19b62a4677dabf4e3d24b876bb284753896e1d7",
+ "e3e446f7ede9a19b62a4677dabf4e3d24b876bb28476", // "3896e1d6" truncated.
NULL // FAIL
},
// Modify the associated data.
@@ -57,7 +57,7 @@ const TestVector test_vectors[] = {
"0a1007",
"dd7cf67be39c794a",
"87e229d4500845a079c0",
- "e3e446f7ede9a19b62a4677dabf4e3d24b876bb284753896e1d6",
+ "e3e446f7ede9a19b62a4677dabf4e3d24b876bb28475", // "3896e1d6" truncated.
NULL // FAIL
},
{ NULL }
diff --git a/net/quic/crypto/chacha20_poly1305_encrypter.h b/net/quic/crypto/chacha20_poly1305_encrypter.h
index 29ec3ef1a9..ed1102ce1e 100644
--- a/net/quic/crypto/chacha20_poly1305_encrypter.h
+++ b/net/quic/crypto/chacha20_poly1305_encrypter.h
@@ -11,7 +11,8 @@ namespace net {
// A ChaCha20Poly1305Encrypter is a QuicEncrypter that implements the
// AEAD_CHACHA20_POLY1305 algorithm specified in
-// draft-agl-tls-chacha20poly1305-04. Create an instance by calling
+// draft-agl-tls-chacha20poly1305-04, except that it truncates the Poly1305
+// authenticator to 12 bytes. Create an instance by calling
// QuicEncrypter::Create(kCC12).
//
// It uses an authentication tag of 16 bytes (128 bits). There is no
@@ -19,7 +20,7 @@ namespace net {
class NET_EXPORT_PRIVATE ChaCha20Poly1305Encrypter : public AeadBaseEncrypter {
public:
enum {
- kAuthTagSize = 16,
+ kAuthTagSize = 12,
};
ChaCha20Poly1305Encrypter();
diff --git a/net/quic/crypto/chacha20_poly1305_encrypter_test.cc b/net/quic/crypto/chacha20_poly1305_encrypter_test.cc
index 6fa42593c4..0273b27933 100644
--- a/net/quic/crypto/chacha20_poly1305_encrypter_test.cc
+++ b/net/quic/crypto/chacha20_poly1305_encrypter_test.cc
@@ -29,7 +29,7 @@ const TestVector test_vectors[] = {
"86d09974840bded2a5ca",
"cd7cf67be39c794a",
"87e229d4500845a079c0",
- "e3e446f7ede9a19b62a4677dabf4e3d24b876bb284753896e1d6"
+ "e3e446f7ede9a19b62a4677dabf4e3d24b876bb28475" // "3896e1d6" truncated.
},
{ NULL }
};
@@ -92,16 +92,16 @@ TEST(ChaCha20Poly1305EncrypterTest, Encrypt) {
TEST(ChaCha20Poly1305EncrypterTest, GetMaxPlaintextSize) {
ChaCha20Poly1305Encrypter encrypter;
- EXPECT_EQ(1000u, encrypter.GetMaxPlaintextSize(1016));
- EXPECT_EQ(100u, encrypter.GetMaxPlaintextSize(116));
- EXPECT_EQ(10u, encrypter.GetMaxPlaintextSize(26));
+ EXPECT_EQ(1000u, encrypter.GetMaxPlaintextSize(1012));
+ EXPECT_EQ(100u, encrypter.GetMaxPlaintextSize(112));
+ EXPECT_EQ(10u, encrypter.GetMaxPlaintextSize(22));
}
TEST(ChaCha20Poly1305EncrypterTest, GetCiphertextSize) {
ChaCha20Poly1305Encrypter encrypter;
- EXPECT_EQ(1016u, encrypter.GetCiphertextSize(1000));
- EXPECT_EQ(116u, encrypter.GetCiphertextSize(100));
- EXPECT_EQ(26u, encrypter.GetCiphertextSize(10));
+ EXPECT_EQ(1012u, encrypter.GetCiphertextSize(1000));
+ EXPECT_EQ(112u, encrypter.GetCiphertextSize(100));
+ EXPECT_EQ(22u, encrypter.GetCiphertextSize(10));
}
} // namespace test
diff --git a/net/quic/crypto/proof_test.cc b/net/quic/crypto/proof_test.cc
index df68dd04dd..377bc80839 100644
--- a/net/quic/crypto/proof_test.cc
+++ b/net/quic/crypto/proof_test.cc
@@ -24,74 +24,7 @@ using std::vector;
namespace net {
namespace test {
-
-TEST(ProofTest, Verify) {
- // TODO(rtenneti): Enable testing of ProofVerifier.
-#if 0
- scoped_ptr<ProofSource> source(CryptoTestUtils::ProofSourceForTesting());
- scoped_ptr<ProofVerifier> verifier(
- CryptoTestUtils::ProofVerifierForTesting());
-
- const string server_config = "server config bytes";
- const string hostname = "test.example.com";
- const vector<string>* certs;
- const vector<string>* first_certs;
- string error_details, signature, first_signature;
- CertVerifyResult cert_verify_result;
-
- ASSERT_TRUE(source->GetProof(hostname, server_config, false /* no ECDSA */,
- &first_certs, &first_signature));
- ASSERT_TRUE(source->GetProof(hostname, server_config, false /* no ECDSA */,
- &certs, &signature));
-
- // Check that the proof source is caching correctly:
- ASSERT_EQ(first_certs, certs);
- ASSERT_EQ(signature, first_signature);
-
- int rv;
- TestCompletionCallback callback;
- rv = verifier->VerifyProof(hostname, server_config, *certs, signature,
- &error_details, &cert_verify_result,
- callback.callback());
- rv = callback.GetResult(rv);
- ASSERT_EQ(OK, rv);
- ASSERT_EQ("", error_details);
- ASSERT_FALSE(IsCertStatusError(cert_verify_result.cert_status));
-
- rv = verifier->VerifyProof("foo.com", server_config, *certs, signature,
- &error_details, &cert_verify_result,
- callback.callback());
- rv = callback.GetResult(rv);
- ASSERT_EQ(ERR_FAILED, rv);
- ASSERT_NE("", error_details);
-
- rv = verifier->VerifyProof(hostname, server_config.substr(1, string::npos),
- *certs, signature, &error_details,
- &cert_verify_result, callback.callback());
- rv = callback.GetResult(rv);
- ASSERT_EQ(ERR_FAILED, rv);
- ASSERT_NE("", error_details);
-
- const string corrupt_signature = "1" + signature;
- rv = verifier->VerifyProof(hostname, server_config, *certs,
- corrupt_signature, &error_details,
- &cert_verify_result, callback.callback());
- rv = callback.GetResult(rv);
- ASSERT_EQ(ERR_FAILED, rv);
- ASSERT_NE("", error_details);
-
- vector<string> wrong_certs;
- for (size_t i = 1; i < certs->size(); i++) {
- wrong_certs.push_back((*certs)[i]);
- }
- rv = verifier->VerifyProof("foo.com", server_config, wrong_certs, signature,
- &error_details, &cert_verify_result,
- callback.callback());
- rv = callback.GetResult(rv);
- ASSERT_EQ(ERR_FAILED, rv);
- ASSERT_NE("", error_details);
-#endif // 0
-}
+namespace {
// TestProofVerifierCallback is a simple callback for a ProofVerifier that
// signals a TestCompletionCallback when called and stores the results from the
@@ -122,22 +55,24 @@ class TestProofVerifierCallback : public ProofVerifierCallback {
// RunVerification runs |verifier->VerifyProof| and asserts that the result
// matches |expected_ok|.
-static void RunVerification(ProofVerifier* verifier,
- const string& hostname,
- const string& server_config,
- const vector<string>& certs,
- const string& proof,
- bool expected_ok) {
+void RunVerification(ProofVerifier* verifier,
+ const string& hostname,
+ const string& server_config,
+ const vector<string>& certs,
+ const string& proof,
+ bool expected_ok) {
scoped_ptr<ProofVerifyDetails> details;
TestCompletionCallback comp_callback;
bool ok;
string error_details;
+ scoped_ptr<ProofVerifyContext> verify_context(
+ CryptoTestUtils::ProofVerifyContextForTesting());
TestProofVerifierCallback* callback =
new TestProofVerifierCallback(&comp_callback, &ok, &error_details);
ProofVerifier::Status status = verifier->VerifyProof(
- hostname, server_config, certs, proof, &error_details, &details,
- callback);
+ hostname, server_config, certs, proof, verify_context.get(),
+ &error_details, &details, callback);
switch (status) {
case ProofVerifier::FAILURE:
@@ -155,10 +90,12 @@ static void RunVerification(ProofVerifier* verifier,
}
}
-static string PEMCertFileToDER(const string& file_name) {
+// Reads the certificate named "quic_" + |file_name| in the test data directory.
+// The certificate must be PEM encoded. Returns the DER-encoded certificate.
+string LoadTestCert(const string& file_name) {
base::FilePath certs_dir = GetTestCertsDirectory();
scoped_refptr<X509Certificate> cert =
- ImportCertFromFile(certs_dir, file_name);
+ ImportCertFromFile(certs_dir, "quic_" + file_name);
CHECK_NE(static_cast<X509Certificate*>(NULL), cert);
string der_bytes;
@@ -166,12 +103,58 @@ static string PEMCertFileToDER(const string& file_name) {
return der_bytes;
}
+} // namespace
+
+// TODO(rtenneti): Enable testing of ProofVerifier.
+TEST(ProofTest, DISABLED_Verify) {
+ scoped_ptr<ProofSource> source(CryptoTestUtils::ProofSourceForTesting());
+ scoped_ptr<ProofVerifier> verifier(
+ CryptoTestUtils::ProofVerifierForTesting());
+
+ const string server_config = "server config bytes";
+ const string hostname = "test.example.com";
+ const vector<string>* certs;
+ const vector<string>* first_certs;
+ string error_details, signature, first_signature;
+
+ ASSERT_TRUE(source->GetProof(hostname, server_config, false /* no ECDSA */,
+ &first_certs, &first_signature));
+ ASSERT_TRUE(source->GetProof(hostname, server_config, false /* no ECDSA */,
+ &certs, &signature));
+
+ // Check that the proof source is caching correctly:
+ ASSERT_EQ(first_certs, certs);
+ ASSERT_EQ(signature, first_signature);
+
+ RunVerification(
+ verifier.get(), hostname, server_config, *certs, signature, true);
+
+ RunVerification(
+ verifier.get(), "foo.com", server_config, *certs, signature, false);
+
+ RunVerification(
+ verifier.get(), server_config.substr(1, string::npos), server_config,
+ *certs, signature, false);
+
+ const string corrupt_signature = "1" + signature;
+ RunVerification(
+ verifier.get(), hostname, server_config, *certs, corrupt_signature,
+ false);
+
+ vector<string> wrong_certs;
+ for (size_t i = 1; i < certs->size(); i++) {
+ wrong_certs.push_back((*certs)[i]);
+ }
+ RunVerification(
+ verifier.get(), "foo.com", server_config, wrong_certs, corrupt_signature,
+ false);
+}
+
// A known answer test that allows us to test ProofVerifier without a working
// ProofSource.
TEST(ProofTest, VerifyRSAKnownAnswerTest) {
// These sample signatures were generated by running the Proof.Verify test
// and dumping the bytes of the |signature| output of ProofSource::GetProof().
- // sLen = special value -2 used by OpenSSL.
static const unsigned char signature_data_0[] = {
0x31, 0xd5, 0xfb, 0x40, 0x30, 0x75, 0xd2, 0x7d, 0x61, 0xf9, 0xd7, 0x54,
0x30, 0x06, 0xaf, 0x54, 0x0d, 0xb0, 0x0a, 0xda, 0x63, 0xca, 0x7e, 0x9e,
@@ -250,11 +233,10 @@ TEST(ProofTest, VerifyRSAKnownAnswerTest) {
const string server_config = "server config bytes";
const string hostname = "test.example.com";
- CertVerifyResult cert_verify_result;
vector<string> certs(2);
- certs[0] = PEMCertFileToDER("quic_test.example.com.crt");
- certs[1] = PEMCertFileToDER("quic_intermediate.crt");
+ certs[0] = LoadTestCert("test.example.com.crt");
+ certs[1] = LoadTestCert("intermediate.crt");
// Signatures are nondeterministic, so we test multiple signatures on the
// same server_config.
@@ -333,11 +315,10 @@ TEST(ProofTest, VerifyECDSAKnownAnswerTest) {
const string server_config = "server config bytes";
const string hostname = "test.example.com";
- CertVerifyResult cert_verify_result;
vector<string> certs(2);
- certs[0] = PEMCertFileToDER("quic_test_ecc.example.com.crt");
- certs[1] = PEMCertFileToDER("quic_intermediate.crt");
+ certs[0] = LoadTestCert("test_ecc.example.com.crt");
+ certs[1] = LoadTestCert("intermediate.crt");
// Signatures are nondeterministic, so we test multiple signatures on the
// same server_config.
diff --git a/net/quic/crypto/proof_verifier.cc b/net/quic/crypto/proof_verifier.cc
deleted file mode 100644
index 4132a31c31..0000000000
--- a/net/quic/crypto/proof_verifier.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2013 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/quic/crypto/proof_verifier.h"
-
-namespace net {
-
-ProofVerifierCallback::~ProofVerifierCallback() {}
-
-ProofVerifier::~ProofVerifier() {}
-
-} // namespace net
diff --git a/net/quic/crypto/proof_verifier.h b/net/quic/crypto/proof_verifier.h
index 3b47776130..0cbdb6a014 100644
--- a/net/quic/crypto/proof_verifier.h
+++ b/net/quic/crypto/proof_verifier.h
@@ -21,11 +21,18 @@ class NET_EXPORT_PRIVATE ProofVerifyDetails {
virtual ~ProofVerifyDetails() {}
};
+// ProofVerifyContext is an abstract class that acts as a container for any
+// implementation specific context that a ProofVerifier needs.
+class NET_EXPORT_PRIVATE ProofVerifyContext {
+ public:
+ virtual ~ProofVerifyContext() {}
+};
+
// ProofVerifierCallback provides a generic mechanism for a ProofVerifier to
// call back after an asynchronous verification.
class NET_EXPORT_PRIVATE ProofVerifierCallback {
public:
- virtual ~ProofVerifierCallback();
+ virtual ~ProofVerifierCallback() {}
// Run is called on the original thread to mark the completion of an
// asynchonous verification. If |ok| is true then the certificate is valid
@@ -51,7 +58,7 @@ class NET_EXPORT_PRIVATE ProofVerifier {
PENDING = 2,
};
- virtual ~ProofVerifier();
+ virtual ~ProofVerifier() {}
// VerifyProof checks that |signature| is a valid signature of
// |server_config| by the public key in the leaf certificate of |certs|, and
@@ -60,6 +67,10 @@ class NET_EXPORT_PRIVATE ProofVerifier {
// description of the problem. In either case it may set |*details|, which the
// caller takes ownership of.
//
+ // |context| specifies an implementation specific struct (which may be NULL
+ // for some implementations) that provides useful information for the
+ // verifier, e.g. logging handles.
+ //
// This function may also return PENDING, in which case the ProofVerifier
// will call back, on the original thread, via |callback| when complete.
// In this case, the ProofVerifier will take ownership of |callback|.
@@ -70,6 +81,7 @@ class NET_EXPORT_PRIVATE ProofVerifier {
const std::string& server_config,
const std::vector<std::string>& certs,
const std::string& signature,
+ const ProofVerifyContext* context,
std::string* error_details,
scoped_ptr<ProofVerifyDetails>* details,
ProofVerifierCallback* callback) = 0;
diff --git a/net/quic/crypto/proof_verifier_chromium.cc b/net/quic/crypto/proof_verifier_chromium.cc
index 8584aedda7..fdb6a0d443 100644
--- a/net/quic/crypto/proof_verifier_chromium.cc
+++ b/net/quic/crypto/proof_verifier_chromium.cc
@@ -47,7 +47,7 @@ class ProofVerifierChromium::Job {
const std::vector<std::string>& certs,
const std::string& signature,
std::string* error_details,
- scoped_ptr<ProofVerifyDetails>* details,
+ scoped_ptr<ProofVerifyDetails>* verify_details,
ProofVerifierCallback* callback);
private:
@@ -104,10 +104,10 @@ ProofVerifierChromium::Status ProofVerifierChromium::Job::VerifyProof(
const vector<string>& certs,
const string& signature,
std::string* error_details,
- scoped_ptr<ProofVerifyDetails>* details,
+ scoped_ptr<ProofVerifyDetails>* verify_details,
ProofVerifierCallback* callback) {
DCHECK(error_details);
- DCHECK(details);
+ DCHECK(verify_details);
DCHECK(callback);
callback_.reset(callback);
@@ -125,7 +125,7 @@ ProofVerifierChromium::Status ProofVerifierChromium::Job::VerifyProof(
*error_details = "Failed to create certificate chain. Certs are empty.";
DLOG(WARNING) << *error_details;
verify_details_->cert_verify_result.cert_status = CERT_STATUS_INVALID;
- details->reset(verify_details_.release());
+ verify_details->reset(verify_details_.release());
return FAILURE;
}
@@ -139,7 +139,7 @@ ProofVerifierChromium::Status ProofVerifierChromium::Job::VerifyProof(
*error_details = "Failed to create certificate chain";
DLOG(WARNING) << *error_details;
verify_details_->cert_verify_result.cert_status = CERT_STATUS_INVALID;
- details->reset(verify_details_.release());
+ verify_details->reset(verify_details_.release());
return FAILURE;
}
@@ -149,7 +149,7 @@ ProofVerifierChromium::Status ProofVerifierChromium::Job::VerifyProof(
*error_details = "Failed to verify signature of server config";
DLOG(WARNING) << *error_details;
verify_details_->cert_verify_result.cert_status = CERT_STATUS_INVALID;
- details->reset(verify_details_.release());
+ verify_details->reset(verify_details_.release());
return FAILURE;
}
@@ -158,13 +158,13 @@ ProofVerifierChromium::Status ProofVerifierChromium::Job::VerifyProof(
next_state_ = STATE_VERIFY_CERT;
switch (DoLoop(OK)) {
case OK:
- details->reset(verify_details_.release());
+ verify_details->reset(verify_details_.release());
return SUCCESS;
case ERR_IO_PENDING:
return PENDING;
default:
*error_details = error_details_;
- details->reset(verify_details_.release());
+ verify_details->reset(verify_details_.release());
return FAILURE;
}
}
@@ -310,11 +310,8 @@ bool ProofVerifierChromium::Job::VerifySignature(const string& signed_data,
return true;
}
-ProofVerifierChromium::ProofVerifierChromium(CertVerifier* cert_verifier,
- const BoundNetLog& net_log)
- : cert_verifier_(cert_verifier),
- net_log_(net_log) {
-}
+ProofVerifierChromium::ProofVerifierChromium(CertVerifier* cert_verifier)
+ : cert_verifier_(cert_verifier) {}
ProofVerifierChromium::~ProofVerifierChromium() {
STLDeleteElements(&active_jobs_);
@@ -325,12 +322,19 @@ ProofVerifierChromium::Status ProofVerifierChromium::VerifyProof(
const std::string& server_config,
const std::vector<std::string>& certs,
const std::string& signature,
+ const ProofVerifyContext* verify_context,
std::string* error_details,
- scoped_ptr<ProofVerifyDetails>* details,
+ scoped_ptr<ProofVerifyDetails>* verify_details,
ProofVerifierCallback* callback) {
- scoped_ptr<Job> job(new Job(this, cert_verifier_, net_log_));
+ if (!verify_context) {
+ *error_details = "Missing context";
+ return FAILURE;
+ }
+ const ProofVerifyContextChromium* chromium_context =
+ reinterpret_cast<const ProofVerifyContextChromium*>(verify_context);
+ scoped_ptr<Job> job(new Job(this, cert_verifier_, chromium_context->net_log));
Status status = job->VerifyProof(hostname, server_config, certs, signature,
- error_details, details, callback);
+ error_details, verify_details, callback);
if (status == PENDING) {
active_jobs_.insert(job.release());
}
diff --git a/net/quic/crypto/proof_verifier_chromium.h b/net/quic/crypto/proof_verifier_chromium.h
index 7f695e678e..ebf9a2c41c 100644
--- a/net/quic/crypto/proof_verifier_chromium.h
+++ b/net/quic/crypto/proof_verifier_chromium.h
@@ -15,6 +15,7 @@
#include "net/base/net_export.h"
#include "net/base/net_log.h"
#include "net/cert/cert_verify_result.h"
+#include "net/cert/x509_certificate.h"
#include "net/quic/crypto/proof_verifier.h"
namespace net {
@@ -29,12 +30,21 @@ struct ProofVerifyDetailsChromium : public ProofVerifyDetails {
CertVerifyResult cert_verify_result;
};
+// ProofVerifyContextChromium is the implementation-specific information that a
+// ProofVerifierChromium needs in order to log correctly.
+struct ProofVerifyContextChromium : public ProofVerifyContext {
+ public:
+ explicit ProofVerifyContextChromium(const BoundNetLog& net_log)
+ : net_log(net_log) {}
+
+ BoundNetLog net_log;
+};
+
// ProofVerifierChromium implements the QUIC ProofVerifier interface. It is
// capable of handling multiple simultaneous requests.
class NET_EXPORT_PRIVATE ProofVerifierChromium : public ProofVerifier {
public:
- ProofVerifierChromium(CertVerifier* cert_verifier,
- const BoundNetLog& net_log);
+ explicit ProofVerifierChromium(CertVerifier* cert_verifier);
virtual ~ProofVerifierChromium();
// ProofVerifier interface
@@ -42,8 +52,9 @@ class NET_EXPORT_PRIVATE ProofVerifierChromium : public ProofVerifier {
const std::string& server_config,
const std::vector<std::string>& certs,
const std::string& signature,
+ const ProofVerifyContext* verify_context,
std::string* error_details,
- scoped_ptr<ProofVerifyDetails>* details,
+ scoped_ptr<ProofVerifyDetails>* verify_details,
ProofVerifierCallback* callback) OVERRIDE;
private:
@@ -58,8 +69,6 @@ class NET_EXPORT_PRIVATE ProofVerifierChromium : public ProofVerifier {
// Underlying verifier used to verify certificates.
CertVerifier* const cert_verifier_;
- BoundNetLog net_log_;
-
DISALLOW_COPY_AND_ASSIGN(ProofVerifierChromium);
};
diff --git a/net/quic/crypto/quic_crypto_client_config.cc b/net/quic/crypto/quic_crypto_client_config.cc
index 0fa78a4b91..8f34745cd1 100644
--- a/net/quic/crypto/quic_crypto_client_config.cc
+++ b/net/quic/crypto/quic_crypto_client_config.cc
@@ -5,7 +5,9 @@
#include "net/quic/crypto/quic_crypto_client_config.h"
#include "base/stl_util.h"
+#include "base/strings/string_util.h"
#include "net/quic/crypto/cert_compressor.h"
+#include "net/quic/crypto/chacha20_poly1305_encrypter.h"
#include "net/quic/crypto/channel_id.h"
#include "net/quic/crypto/common_cert_set.h"
#include "net/quic/crypto/crypto_framer.h"
@@ -18,11 +20,8 @@
#include "net/quic/quic_session_key.h"
#include "net/quic/quic_utils.h"
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
using base::StringPiece;
+using std::find;
using std::make_pair;
using std::map;
using std::string;
@@ -30,7 +29,8 @@ using std::vector;
namespace net {
-QuicCryptoClientConfig::QuicCryptoClientConfig() {}
+QuicCryptoClientConfig::QuicCryptoClientConfig()
+ : disable_ecdsa_(false) {}
QuicCryptoClientConfig::~QuicCryptoClientConfig() {
STLDeleteValues(&cached_states_);
@@ -249,26 +249,31 @@ void QuicCryptoClientConfig::SetDefaults() {
kexs[0] = kC255;
kexs[1] = kP256;
- // Authenticated encryption algorithms.
- aead.resize(1);
- aead[0] = kAESG;
+ // Authenticated encryption algorithms. Prefer ChaCha20 by default.
+ aead.clear();
+ if (ChaCha20Poly1305Encrypter::IsSupported()) {
+ aead.push_back(kCC12);
+ }
+ aead.push_back(kAESG);
+
+ disable_ecdsa_ = false;
}
QuicCryptoClientConfig::CachedState* QuicCryptoClientConfig::LookupOrCreate(
const QuicSessionKey& server_key) {
- map<QuicSessionKey, CachedState*>::const_iterator it =
- cached_states_.find(server_key);
+ CachedStateMap::const_iterator it = cached_states_.find(server_key);
if (it != cached_states_.end()) {
return it->second;
}
CachedState* cached = new CachedState;
cached_states_.insert(make_pair(server_key, cached));
+ PopulateFromCanonicalConfig(server_key, cached);
return cached;
}
void QuicCryptoClientConfig::FillInchoateClientHello(
- const string& server_hostname,
+ const QuicSessionKey& server_key,
const QuicVersion preferred_version,
const CachedState* cached,
QuicCryptoNegotiatedParameters* out_params,
@@ -278,8 +283,8 @@ void QuicCryptoClientConfig::FillInchoateClientHello(
// Server name indication. We only send SNI if it's a valid domain name, as
// per the spec.
- if (CryptoUtils::IsValidSNI(server_hostname)) {
- out->SetStringPiece(kSNI, server_hostname);
+ if (CryptoUtils::IsValidSNI(server_key.host())) {
+ out->SetStringPiece(kSNI, server_key.host());
}
out->SetValue(kVER, QuicVersionToQuicTag(preferred_version));
@@ -287,15 +292,8 @@ void QuicCryptoClientConfig::FillInchoateClientHello(
out->SetStringPiece(kSourceAddressTokenTag, cached->source_address_token());
}
- if (proof_verifier_.get()) {
- // Don't request ECDSA proofs on platforms that do not support ECDSA
- // certificates.
- bool disableECDSA = false;
-#if defined(OS_WIN)
- if (base::win::GetVersion() < base::win::VERSION_VISTA)
- disableECDSA = true;
-#endif
- if (disableECDSA) {
+ if (server_key.is_https()) {
+ if (disable_ecdsa_) {
out->SetTaglist(kPDMD, kX59R, 0);
} else {
out->SetTaglist(kPDMD, kX509, 0);
@@ -324,7 +322,7 @@ void QuicCryptoClientConfig::FillInchoateClientHello(
}
QuicErrorCode QuicCryptoClientConfig::FillClientHello(
- const string& server_hostname,
+ const QuicSessionKey& server_key,
QuicConnectionId connection_id,
const QuicVersion preferred_version,
const CachedState* cached,
@@ -335,7 +333,7 @@ QuicErrorCode QuicCryptoClientConfig::FillClientHello(
string* error_details) const {
DCHECK(error_details != NULL);
- FillInchoateClientHello(server_hostname, preferred_version, cached,
+ FillInchoateClientHello(server_key, preferred_version, cached,
out_params, out);
const CryptoHandshakeMessage* scfg = cached->GetServerConfig();
@@ -364,13 +362,18 @@ QuicErrorCode QuicCryptoClientConfig::FillClientHello(
return QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER;
}
+ // AEAD: the work loads on the client and server are symmetric. Since the
+ // client is more likely to be CPU-constrained, break the tie by favoring
+ // the client's preference.
+ // Key exchange: the client does more work than the server, so favor the
+ // client's preference.
size_t key_exchange_index;
if (!QuicUtils::FindMutualTag(
- aead, their_aeads, num_their_aeads, QuicUtils::PEER_PRIORITY,
+ aead, their_aeads, num_their_aeads, QuicUtils::LOCAL_PRIORITY,
&out_params->aead, NULL) ||
!QuicUtils::FindMutualTag(
kexs, their_key_exchanges, num_their_key_exchanges,
- QuicUtils::PEER_PRIORITY, &out_params->key_exchange,
+ QuicUtils::LOCAL_PRIORITY, &out_params->key_exchange,
&key_exchange_index)) {
*error_details = "Unsupported AEAD or KEXS";
return QUIC_CRYPTO_NO_SUPPORT;
@@ -455,7 +458,7 @@ QuicErrorCode QuicCryptoClientConfig::FillClientHello(
hkdf_input.append(cached->server_config());
string key, signature;
- if (!channel_id_signer_->Sign(server_hostname, hkdf_input,
+ if (!channel_id_signer_->Sign(server_key.host(), hkdf_input,
&key, &signature)) {
*error_details = "Channel ID signature failed";
return QUIC_INVALID_CHANNEL_ID_SIGNATURE;
@@ -680,4 +683,60 @@ void QuicCryptoClientConfig::InitializeFrom(
cached->InitializeFrom(*canonical_cached);
}
+void QuicCryptoClientConfig::AddCanonicalSuffix(const string& suffix) {
+ canoncial_suffixes_.push_back(suffix);
+}
+
+void QuicCryptoClientConfig::PreferAesGcm() {
+ DCHECK(!aead.empty());
+ if (aead.size() <= 1) {
+ return;
+ }
+ QuicTagVector::iterator pos = find(aead.begin(), aead.end(), kAESG);
+ if (pos != aead.end()) {
+ aead.erase(pos);
+ aead.insert(aead.begin(), kAESG);
+ }
+}
+
+void QuicCryptoClientConfig::DisableEcdsa() {
+ disable_ecdsa_ = true;
+}
+
+void QuicCryptoClientConfig::PopulateFromCanonicalConfig(
+ const QuicSessionKey& server_key,
+ CachedState* server_state) {
+ DCHECK(server_state->IsEmpty());
+ unsigned i = 0;
+ for (; i < canoncial_suffixes_.size(); ++i) {
+ if (EndsWith(server_key.host(), canoncial_suffixes_[i], false)) {
+ break;
+ }
+ }
+ if (i == canoncial_suffixes_.size())
+ return;
+
+ QuicSessionKey suffix_server_key(canoncial_suffixes_[i], server_key.port(),
+ server_key.is_https(),
+ server_key.privacy_mode());
+ if (!ContainsKey(canonical_server_map_, suffix_server_key)) {
+ // This is the first host we've seen which matches the suffix, so make it
+ // canonical.
+ canonical_server_map_[suffix_server_key] = server_key;
+ return;
+ }
+
+ const QuicSessionKey& canonical_server_key =
+ canonical_server_map_[suffix_server_key];
+ CachedState* canonical_state = cached_states_[canonical_server_key];
+ if (!canonical_state->proof_valid()) {
+ return;
+ }
+
+ // Update canonical version to point at the "most recent" entry.
+ canonical_server_map_[suffix_server_key] = server_key;
+
+ server_state->InitializeFrom(*canonical_state);
+}
+
} // namespace net
diff --git a/net/quic/crypto/quic_crypto_client_config.h b/net/quic/crypto/quic_crypto_client_config.h
index f2e8649bb1..d6ce2e4c4a 100644
--- a/net/quic/crypto/quic_crypto_client_config.h
+++ b/net/quic/crypto/quic_crypto_client_config.h
@@ -143,7 +143,7 @@ class NET_EXPORT_PRIVATE QuicCryptoClientConfig : public QuicCryptoConfig {
// |out_params->cached_certs|. |preferred_version| is the version of the
// QUIC protocol that this client chose to use initially. This allows the
// server to detect downgrade attacks.
- void FillInchoateClientHello(const std::string& server_hostname,
+ void FillInchoateClientHello(const QuicSessionKey& server_key,
const QuicVersion preferred_version,
const CachedState* cached,
QuicCryptoNegotiatedParameters* out_params,
@@ -151,7 +151,7 @@ class NET_EXPORT_PRIVATE QuicCryptoClientConfig : public QuicCryptoConfig {
// FillClientHello sets |out| to be a CHLO message based on the configuration
// of this object. This object must have cached enough information about
- // |server_hostname| in order to perform a handshake. This can be checked
+ // the server's hostname in order to perform a handshake. This can be checked
// with the |IsComplete| member of |CachedState|.
//
// |clock| and |rand| are used to generate the nonce and |out_params| is
@@ -159,7 +159,7 @@ class NET_EXPORT_PRIVATE QuicCryptoClientConfig : public QuicCryptoConfig {
// accept. |preferred_version| is the version of the QUIC protocol that this
// client chose to use initially. This allows the server to detect downgrade
// attacks.
- QuicErrorCode FillClientHello(const std::string& server_hostname,
+ QuicErrorCode FillClientHello(const QuicSessionKey& server_key,
QuicConnectionId connection_id,
const QuicVersion preferred_version,
const CachedState* cached,
@@ -218,14 +218,51 @@ class NET_EXPORT_PRIVATE QuicCryptoClientConfig : public QuicCryptoConfig {
const QuicSessionKey& canonical_server_key,
QuicCryptoClientConfig* canonical_crypto_config);
+ // Adds |suffix| as a domain suffix for which the server's crypto config
+ // is expected to be shared among servers with the domain suffix. If a server
+ // matches this suffix, then the server config from another server with the
+ // suffix will be used to initialize the cached state for this server.
+ void AddCanonicalSuffix(const std::string& suffix);
+
+ // Prefers AES-GCM (kAESG) over other AEAD algorithms. Call this method if
+ // the CPU has hardware acceleration for AES-GCM. This method can only be
+ // called after SetDefaults().
+ void PreferAesGcm();
+
+ // Disables the use of ECDSA for proof verification.
+ // Call this method on platforms that do not support ECDSA.
+ // TODO(rch): remove this method when we drop support for Windows XP.
+ void DisableEcdsa();
+
private:
+ typedef std::map<QuicSessionKey, CachedState*> CachedStateMap;
+
+ // If the suffix of the hostname in |server_key| is in |canoncial_suffixes_|,
+ // then populate |cached| with the canonical cached state from
+ // |canonical_server_map_| for that suffix.
+ void PopulateFromCanonicalConfig(const QuicSessionKey& server_key,
+ CachedState* cached);
+
// cached_states_ maps from the server_key to the cached information about
// that server.
- std::map<QuicSessionKey, CachedState*> cached_states_;
+ CachedStateMap cached_states_;
+
+ // Contains a map of servers which could share the same server config. Map
+ // from a canonical host suffix/port/scheme to a representative server with
+ // the canonical suffix, which has a plausible set of initial certificates
+ // (or at least server public key).
+ std::map<QuicSessionKey, QuicSessionKey> canonical_server_map_;
+
+ // Contains list of suffixes (for exmaple ".c.youtube.com",
+ // ".googlevideo.com") of canoncial hostnames.
+ std::vector<std::string> canoncial_suffixes_;
scoped_ptr<ProofVerifier> proof_verifier_;
scoped_ptr<ChannelIDSigner> channel_id_signer_;
+ // True if ECDSA should be disabled.
+ bool disable_ecdsa_;
+
DISALLOW_COPY_AND_ASSIGN(QuicCryptoClientConfig);
};
diff --git a/net/quic/crypto/quic_crypto_client_config_test.cc b/net/quic/crypto/quic_crypto_client_config_test.cc
index d151e0c329..b74a37a921 100644
--- a/net/quic/crypto/quic_crypto_client_config_test.cc
+++ b/net/quic/crypto/quic_crypto_client_config_test.cc
@@ -56,7 +56,8 @@ TEST(QuicCryptoClientConfigTest, InchoateChlo) {
QuicCryptoClientConfig config;
QuicCryptoNegotiatedParameters params;
CryptoHandshakeMessage msg;
- config.FillInchoateClientHello("www.google.com", QuicVersionMax(), &state,
+ QuicSessionKey server_key("www.google.com", 80, false, kPrivacyModeDisabled);
+ config.FillInchoateClientHello(server_key, QuicVersionMax(), &state,
&params, &msg);
QuicTag cver;
@@ -64,6 +65,44 @@ TEST(QuicCryptoClientConfigTest, InchoateChlo) {
EXPECT_EQ(QuicVersionToQuicTag(QuicVersionMax()), cver);
}
+TEST(QuicCryptoClientConfigTest, PreferAesGcm) {
+ QuicCryptoClientConfig config;
+ config.SetDefaults();
+ if (config.aead.size() > 1)
+ EXPECT_NE(kAESG, config.aead[0]);
+ config.PreferAesGcm();
+ EXPECT_EQ(kAESG, config.aead[0]);
+}
+
+TEST(QuicCryptoClientConfigTest, InchoateChloSecure) {
+ QuicCryptoClientConfig::CachedState state;
+ QuicCryptoClientConfig config;
+ QuicCryptoNegotiatedParameters params;
+ CryptoHandshakeMessage msg;
+ QuicSessionKey server_key("www.google.com", 443, true, kPrivacyModeDisabled);
+ config.FillInchoateClientHello(server_key, QuicVersionMax(), &state,
+ &params, &msg);
+
+ QuicTag pdmd;
+ EXPECT_EQ(QUIC_NO_ERROR, msg.GetUint32(kPDMD, &pdmd));
+ EXPECT_EQ(kX509, pdmd);
+}
+
+TEST(QuicCryptoClientConfigTest, InchoateChloSecureNoEcdsa) {
+ QuicCryptoClientConfig::CachedState state;
+ QuicCryptoClientConfig config;
+ config.DisableEcdsa();
+ QuicCryptoNegotiatedParameters params;
+ CryptoHandshakeMessage msg;
+ QuicSessionKey server_key("www.google.com", 443, true, kPrivacyModeDisabled);
+ config.FillInchoateClientHello(server_key, QuicVersionMax(), &state,
+ &params, &msg);
+
+ QuicTag pdmd;
+ EXPECT_EQ(QUIC_NO_ERROR, msg.GetUint32(kPDMD, &pdmd));
+ EXPECT_EQ(kX59R, pdmd);
+}
+
TEST(QuicCryptoClientConfigTest, ProcessServerDowngradeAttack) {
QuicVersionVector supported_versions = QuicSupportedVersions();
if (supported_versions.size() == 1) {
@@ -91,14 +130,15 @@ TEST(QuicCryptoClientConfigTest, ProcessServerDowngradeAttack) {
TEST(QuicCryptoClientConfigTest, InitializeFrom) {
QuicCryptoClientConfig config;
- QuicSessionKey canonical_key1("www.google.com", 80, false);
+ QuicSessionKey canonical_key1("www.google.com", 80, false,
+ kPrivacyModeDisabled);
QuicCryptoClientConfig::CachedState* state =
config.LookupOrCreate(canonical_key1);
// TODO(rch): Populate other fields of |state|.
state->set_source_address_token("TOKEN");
state->SetProofValid();
- QuicSessionKey other_key("mail.google.com", 80, false);
+ QuicSessionKey other_key("mail.google.com", 80, false, kPrivacyModeDisabled);
config.InitializeFrom(other_key, canonical_key1, &config);
QuicCryptoClientConfig::CachedState* other = config.LookupOrCreate(other_key);
diff --git a/net/quic/crypto/quic_crypto_server_config.cc b/net/quic/crypto/quic_crypto_server_config.cc
index 52e338b184..9d60c5f7d9 100644
--- a/net/quic/crypto/quic_crypto_server_config.cc
+++ b/net/quic/crypto/quic_crypto_server_config.cc
@@ -15,6 +15,7 @@
#include "net/quic/crypto/aes_128_gcm_12_decrypter.h"
#include "net/quic/crypto/aes_128_gcm_12_encrypter.h"
#include "net/quic/crypto/cert_compressor.h"
+#include "net/quic/crypto/chacha20_poly1305_encrypter.h"
#include "net/quic/crypto/channel_id.h"
#include "net/quic/crypto/crypto_framer.h"
#include "net/quic/crypto/crypto_server_config_protobuf.h"
@@ -241,7 +242,11 @@ QuicServerConfigProtobuf* QuicCryptoServerConfig::GenerateConfig(
} else {
msg.SetTaglist(kKEXS, kC255, 0);
}
- msg.SetTaglist(kAEAD, kAESG, 0);
+ if (ChaCha20Poly1305Encrypter::IsSupported()) {
+ msg.SetTaglist(kAEAD, kAESG, kCC12, 0);
+ } else {
+ msg.SetTaglist(kAEAD, kAESG, 0);
+ }
msg.SetStringPiece(kPUBS, encoded_public_values);
if (options.expiry_time.IsZero()) {
diff --git a/net/quic/quic_client_session.cc b/net/quic/quic_client_session.cc
index 865c9b06cd..7dd913545d 100644
--- a/net/quic/quic_client_session.cc
+++ b/net/quic/quic_client_session.cc
@@ -28,6 +28,34 @@ namespace net {
namespace {
+// Histograms for tracking down the crashes from http://crbug.com/354669
+// Note: these values must be kept in sync with the corresponding values in:
+// tools/metrics/histograms/histograms.xml
+enum Location {
+ DESTRUCTOR = 0,
+ ADD_OBSERVER = 1,
+ TRY_CREATE_STREAM = 2,
+ CREATE_OUTGOING_RELIABLE_STREAM = 3,
+ NOTIFY_FACTORY_OF_SESSION_CLOSED_LATER = 4,
+ NOTIFY_FACTORY_OF_SESSION_CLOSED = 5,
+ NUM_LOCATIONS = 6,
+};
+
+void RecordUnexpectedOpenStreams(Location location) {
+ UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.UnexpectedOpenStreams", location,
+ NUM_LOCATIONS);
+}
+
+void RecordUnexpectedObservers(Location location) {
+ UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.UnexpectedObservers", location,
+ NUM_LOCATIONS);
+}
+
+void RecordUnexpectedNotGoingAway(Location location) {
+ UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.UnexpectedNotGoingAway", location,
+ NUM_LOCATIONS);
+}
+
// Note: these values must be kept in sync with the corresponding values in:
// tools/metrics/histograms/histograms.xml
enum HandshakeState {
@@ -95,7 +123,7 @@ QuicClientSession::QuicClientSession(
const QuicConfig& config,
QuicCryptoClientConfig* crypto_config,
NetLog* net_log)
- : QuicSession(connection, config),
+ : QuicClientSessionBase(connection, config),
require_confirmation_(false),
stream_factory_(stream_factory),
socket_(socket.Pass()),
@@ -107,12 +135,15 @@ QuicClientSession::QuicClientSession(
net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_QUIC_SESSION)),
logger_(net_log_),
num_packets_read_(0),
+ going_away_(false),
weak_factory_(this) {
crypto_stream_.reset(
crypto_client_stream_factory ?
crypto_client_stream_factory->CreateQuicCryptoClientStream(
server_key, this, crypto_config) :
- new QuicCryptoClientStream(server_key, this, this, crypto_config));
+ new QuicCryptoClientStream(server_key, this,
+ new ProofVerifyContextChromium(net_log_),
+ crypto_config));
connection->set_debug_visitor(&logger_);
// TODO(rch): pass in full host port proxy pair
@@ -122,6 +153,13 @@ QuicClientSession::QuicClientSession(
}
QuicClientSession::~QuicClientSession() {
+ if (!streams()->empty())
+ RecordUnexpectedOpenStreams(DESTRUCTOR);
+ if (!observers_.empty())
+ RecordUnexpectedObservers(DESTRUCTOR);
+ if (!going_away_)
+ RecordUnexpectedNotGoingAway(DESTRUCTOR);
+
// The session must be closed before it is destroyed.
DCHECK(streams()->empty());
CloseAllStreams(ERR_UNEXPECTED);
@@ -200,6 +238,9 @@ bool QuicClientSession::OnStreamFrames(
}
void QuicClientSession::AddObserver(Observer* observer) {
+ if (going_away_)
+ RecordUnexpectedObservers(ADD_OBSERVER);
+
DCHECK(!ContainsKey(observers_, observer));
observers_.insert(observer);
}
@@ -226,6 +267,11 @@ int QuicClientSession::TryCreateStream(StreamRequest* request,
return ERR_CONNECTION_CLOSED;
}
+ if (going_away_) {
+ RecordUnexpectedOpenStreams(TRY_CREATE_STREAM);
+ return ERR_CONNECTION_CLOSED;
+ }
+
if (GetNumOpenStreams() < get_max_open_streams()) {
*stream = CreateOutgoingReliableStreamImpl();
return OK;
@@ -260,7 +306,10 @@ QuicReliableClientStream* QuicClientSession::CreateOutgoingDataStream() {
<< "Already received goaway.";
return NULL;
}
-
+ if (going_away_) {
+ RecordUnexpectedOpenStreams(CREATE_OUTGOING_RELIABLE_STREAM);
+ return NULL;
+ }
return CreateOutgoingReliableStreamImpl();
}
@@ -376,6 +425,7 @@ void QuicClientSession::OnClosedStream() {
!stream_requests_.empty() &&
crypto_stream_->encryption_established() &&
!goaway_received() &&
+ !going_away_ &&
connection()->connected()) {
StreamRequest* request = stream_requests_.front();
stream_requests_.pop_front();
@@ -616,11 +666,19 @@ void QuicClientSession::OnReadComplete(int result) {
}
void QuicClientSession::NotifyFactoryOfSessionGoingAway() {
+ going_away_ = true;
if (stream_factory_)
stream_factory_->OnSessionGoingAway(this);
}
void QuicClientSession::NotifyFactoryOfSessionClosedLater() {
+ if (!streams()->empty())
+ RecordUnexpectedOpenStreams(NOTIFY_FACTORY_OF_SESSION_CLOSED_LATER);
+
+ if (!going_away_)
+ RecordUnexpectedNotGoingAway(NOTIFY_FACTORY_OF_SESSION_CLOSED_LATER);
+
+ going_away_ = true;
DCHECK_EQ(0u, GetNumOpenStreams());
DCHECK(!connection()->connected());
base::MessageLoop::current()->PostTask(
@@ -630,6 +688,13 @@ void QuicClientSession::NotifyFactoryOfSessionClosedLater() {
}
void QuicClientSession::NotifyFactoryOfSessionClosed() {
+ if (!streams()->empty())
+ RecordUnexpectedOpenStreams(NOTIFY_FACTORY_OF_SESSION_CLOSED);
+
+ if (!going_away_)
+ RecordUnexpectedNotGoingAway(NOTIFY_FACTORY_OF_SESSION_CLOSED);
+
+ going_away_ = true;
DCHECK_EQ(0u, GetNumOpenStreams());
// Will delete |this|.
if (stream_factory_)
diff --git a/net/quic/quic_client_session.h b/net/quic/quic_client_session.h
index f9d3b7fc6e..801ad07ba5 100644
--- a/net/quic/quic_client_session.h
+++ b/net/quic/quic_client_session.h
@@ -17,11 +17,11 @@
#include "base/memory/scoped_ptr.h"
#include "net/base/completion_callback.h"
#include "net/proxy/proxy_server.h"
+#include "net/quic/quic_client_session_base.h"
#include "net/quic/quic_connection_logger.h"
#include "net/quic/quic_crypto_client_stream.h"
#include "net/quic/quic_protocol.h"
#include "net/quic/quic_reliable_client_stream.h"
-#include "net/quic/quic_session.h"
namespace net {
@@ -39,9 +39,7 @@ namespace test {
class QuicClientSessionPeer;
} // namespace test
-class NET_EXPORT_PRIVATE QuicClientSession :
- public QuicSession,
- public QuicCryptoClientStream::Visitor {
+class NET_EXPORT_PRIVATE QuicClientSession : public QuicClientSessionBase {
public:
// An interface for observing events on a session.
class NET_EXPORT_PRIVATE Observer {
@@ -136,7 +134,7 @@ class NET_EXPORT_PRIVATE QuicClientSession :
const CryptoHandshakeMessage& message) OVERRIDE;
virtual bool GetSSLInfo(SSLInfo* ssl_info) const OVERRIDE;
- // QuicCryptoClientStream::Visitor methods:
+ // QuicClientSessionBase methods:
virtual void OnProofValid(
const QuicCryptoClientConfig::CachedState& cached) OVERRIDE;
virtual void OnProofVerifyDetailsAvailable(
@@ -232,6 +230,9 @@ class NET_EXPORT_PRIVATE QuicClientSession :
QuicConnectionLogger logger_;
// Number of packets read in the current read loop.
size_t num_packets_read_;
+ // True when the session is going away, and streams may no longer be created
+ // on this session. Existing stream will continue to be processed.
+ bool going_away_;
base::WeakPtrFactory<QuicClientSession> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(QuicClientSession);
diff --git a/net/quic/quic_client_session_base.cc b/net/quic/quic_client_session_base.cc
new file mode 100644
index 0000000000..b9cbaff07c
--- /dev/null
+++ b/net/quic/quic_client_session_base.cc
@@ -0,0 +1,15 @@
+// Copyright 2014 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/quic/quic_client_session_base.h"
+
+namespace net {
+
+QuicClientSessionBase::QuicClientSessionBase(QuicConnection* connection,
+ const QuicConfig& config)
+ : QuicSession(connection, config) {}
+
+QuicClientSessionBase::~QuicClientSessionBase() {}
+
+} // namespace net
diff --git a/net/quic/quic_client_session_base.h b/net/quic/quic_client_session_base.h
new file mode 100644
index 0000000000..eab5d08df9
--- /dev/null
+++ b/net/quic/quic_client_session_base.h
@@ -0,0 +1,41 @@
+// Copyright 2014 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.
+
+#ifndef NET_QUIC_QUIC_CLIENT_SESSION_BASE_H_
+#define NET_QUIC_QUIC_CLIENT_SESSION_BASE_H_
+
+#include "net/quic/quic_crypto_client_stream.h"
+#include "net/quic/quic_session.h"
+
+namespace net {
+
+// Base class for all client-specific QuicSession subclasses.
+class NET_EXPORT_PRIVATE QuicClientSessionBase : public QuicSession {
+ public:
+ QuicClientSessionBase(QuicConnection* connection,
+ const QuicConfig& config);
+
+ virtual ~QuicClientSessionBase();
+
+ // Called when the proof in |cached| is marked valid. If this is a secure
+ // QUIC session, then this will happen only after the proof verifier
+ // completes. If this is an insecure QUIC connection, this will happen
+ // as soon as a valid config is discovered (either from the cache or
+ // from the server).
+ virtual void OnProofValid(
+ const QuicCryptoClientConfig::CachedState& cached) = 0;
+
+ // Called when proof verification details become available, either because
+ // proof verification is complete, or when cached details are used. This
+ // will only be called for secure QUIC connections.
+ virtual void OnProofVerifyDetailsAvailable(
+ const ProofVerifyDetails& verify_details) = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(QuicClientSessionBase);
+};
+
+} // namespace net
+
+#endif // NET_QUIC_QUIC_CLIENT_SESSION_BASE_H_
diff --git a/net/quic/quic_client_session_test.cc b/net/quic/quic_client_session_test.cc
index 87e338104d..3c8d933eba 100644
--- a/net/quic/quic_client_session_test.cc
+++ b/net/quic/quic_client_session_test.cc
@@ -70,7 +70,8 @@ class QuicClientSessionTest : public ::testing::TestWithParam<QuicVersion> {
new PacketSavingConnection(false, SupportedVersions(GetParam()))),
session_(connection_, GetSocket().Pass(), writer_.Pass(), NULL, NULL,
make_scoped_ptr((QuicServerInfo*)NULL),
- QuicSessionKey(kServerHostname, kServerPort, false),
+ QuicSessionKey(kServerHostname, kServerPort, false,
+ kPrivacyModeDisabled),
DefaultQuicConfig(), &crypto_config_, &net_log_) {
session_.config()->SetDefaults();
crypto_config_.SetDefaults();
diff --git a/net/quic/quic_crypto_client_stream.cc b/net/quic/quic_crypto_client_stream.cc
index 8c574fe9df..d71a097d76 100644
--- a/net/quic/quic_crypto_client_stream.cc
+++ b/net/quic/quic_crypto_client_stream.cc
@@ -8,8 +8,8 @@
#include "net/quic/crypto/crypto_utils.h"
#include "net/quic/crypto/null_encrypter.h"
#include "net/quic/crypto/proof_verifier.h"
+#include "net/quic/quic_client_session_base.h"
#include "net/quic/quic_protocol.h"
-#include "net/quic/quic_session.h"
namespace net {
@@ -44,17 +44,17 @@ void QuicCryptoClientStream::ProofVerifierCallbackImpl::Cancel() {
QuicCryptoClientStream::QuicCryptoClientStream(
const QuicSessionKey& server_key,
- QuicSession* session,
- Visitor* visitor,
+ QuicClientSessionBase* session,
+ ProofVerifyContext* verify_context,
QuicCryptoClientConfig* crypto_config)
: QuicCryptoStream(session),
- visitor_(visitor),
next_state_(STATE_IDLE),
num_client_hellos_(0),
crypto_config_(crypto_config),
server_key_(server_key),
generation_counter_(0),
- proof_verify_callback_(NULL) {
+ proof_verify_callback_(NULL),
+ verify_context_(verify_context) {
}
QuicCryptoClientStream::~QuicCryptoClientStream() {
@@ -105,7 +105,8 @@ void QuicCryptoClientStream::DoHandshakeLoop(
switch (state) {
case STATE_INITIALIZE: {
if (!cached->IsEmpty() && !cached->signature().empty() &&
- crypto_config_->proof_verifier()) {
+ server_key_.is_https()) {
+ DCHECK(crypto_config_->proof_verifier());
// If the cached state needs to be verified, do it now.
next_state_ = STATE_VERIFY_PROOF;
} else {
@@ -124,7 +125,7 @@ void QuicCryptoClientStream::DoHandshakeLoop(
if (!cached->IsComplete(session()->connection()->clock()->WallNow())) {
crypto_config_->FillInchoateClientHello(
- server_key_.host(),
+ server_key_,
session()->connection()->supported_versions().front(),
cached, &crypto_negotiated_params_, &out);
// Pad the inchoate client hello to fill up a packet.
@@ -150,7 +151,7 @@ void QuicCryptoClientStream::DoHandshakeLoop(
}
session()->config()->ToHandshakeMessage(&out);
error = crypto_config_->FillClientHello(
- server_key_.host(),
+ server_key_,
session()->connection()->connection_id(),
session()->connection()->supported_versions().front(),
cached,
@@ -166,8 +167,8 @@ void QuicCryptoClientStream::DoHandshakeLoop(
CloseConnectionWithDetails(error, error_details);
return;
}
- if (visitor_ && cached->proof_verify_details()) {
- visitor_->OnProofVerifyDetailsAvailable(
+ if (cached->proof_verify_details()) {
+ client_session()->OnProofVerifyDetailsAvailable(
*cached->proof_verify_details());
}
next_state_ = STATE_RECV_SHLO;
@@ -212,10 +213,9 @@ void QuicCryptoClientStream::DoHandshakeLoop(
return;
}
if (!cached->proof_valid()) {
- ProofVerifier* verifier = crypto_config_->proof_verifier();
- if (!verifier) {
- // If no verifier is set then we don't check the certificates.
- SetProofValid(cached);
+ if (!server_key_.is_https()) {
+ // We don't check the certificates for insecure QUIC connections.
+ SetCachedProofValid(cached);
} else if (!cached->signature().empty()) {
next_state_ = STATE_VERIFY_PROOF;
break;
@@ -239,6 +239,7 @@ void QuicCryptoClientStream::DoHandshakeLoop(
cached->server_config(),
cached->certs(),
cached->signature(),
+ verify_context_.get(),
&verify_error_details_,
&verify_details_,
proof_verify_callback);
@@ -258,10 +259,7 @@ void QuicCryptoClientStream::DoHandshakeLoop(
}
case STATE_VERIFY_PROOF_COMPLETE:
if (!verify_ok_) {
- if (visitor_) {
- visitor_->OnProofVerifyDetailsAvailable(
- *cached->proof_verify_details());
- }
+ client_session()->OnProofVerifyDetailsAvailable(*verify_details_);
CloseConnectionWithDetails(
QUIC_PROOF_INVALID, "Proof invalid: " + verify_error_details_);
return;
@@ -271,7 +269,7 @@ void QuicCryptoClientStream::DoHandshakeLoop(
if (generation_counter_ != cached->generation_counter()) {
next_state_ = STATE_VERIFY_PROOF;
} else {
- SetProofValid(cached);
+ SetCachedProofValid(cached);
cached->SetProofVerifyDetails(verify_details_.release());
next_state_ = STATE_SEND_CHLO;
}
@@ -349,12 +347,14 @@ void QuicCryptoClientStream::DoHandshakeLoop(
}
}
-void QuicCryptoClientStream::SetProofValid(
+void QuicCryptoClientStream::SetCachedProofValid(
QuicCryptoClientConfig::CachedState* cached) {
cached->SetProofValid();
- if (visitor_) {
- visitor_->OnProofValid(*cached);
- }
+ client_session()->OnProofValid(*cached);
+}
+
+QuicClientSessionBase* QuicCryptoClientStream::client_session() {
+ return reinterpret_cast<QuicClientSessionBase*>(session());
}
} // namespace net
diff --git a/net/quic/quic_crypto_client_stream.h b/net/quic/quic_crypto_client_stream.h
index 8e283605f1..aef96cc2e2 100644
--- a/net/quic/quic_crypto_client_stream.h
+++ b/net/quic/quic_crypto_client_stream.h
@@ -15,7 +15,7 @@
namespace net {
-class QuicSession;
+class QuicClientSessionBase;
namespace test {
class CryptoTestUtils;
@@ -23,28 +23,9 @@ class CryptoTestUtils;
class NET_EXPORT_PRIVATE QuicCryptoClientStream : public QuicCryptoStream {
public:
- class NET_EXPORT_PRIVATE Visitor {
- public:
- ~Visitor() {}
-
- // Called when the proof in |cached| is marked valid. If this is a secure
- // QUIC session, then this will happen only after the proof verifier
- // completes. If this is an insecure QUIC connection, this will happen
- // as soon as a valid config is discovered (either from the cache or
- // from the server).
- virtual void OnProofValid(
- const QuicCryptoClientConfig::CachedState& cached) = 0;
-
- // Called when proof verification details become available, either because
- // proof verification is complete, or when cached details are used. This
- // will only be called for secure QUIC connections.
- virtual void OnProofVerifyDetailsAvailable(
- const ProofVerifyDetails& verify_details) = 0;
- };
-
QuicCryptoClientStream(const QuicSessionKey& server_key,
- QuicSession* session,
- Visitor* visitor,
+ QuicClientSessionBase* session,
+ ProofVerifyContext* verify_context,
QuicCryptoClientConfig* crypto_config);
virtual ~QuicCryptoClientStream();
@@ -62,8 +43,6 @@ class NET_EXPORT_PRIVATE QuicCryptoClientStream : public QuicCryptoStream {
// than the number of round-trips needed for the handshake.
int num_sent_client_hellos() const;
- Visitor* visitor() { return visitor_; }
-
private:
// ProofVerifierCallbackImpl is passed as the callback method to VerifyProof.
// The ProofVerifier calls this class with the result of proof verification
@@ -103,11 +82,11 @@ class NET_EXPORT_PRIVATE QuicCryptoClientStream : public QuicCryptoStream {
// |in| may be NULL if the call did not result from a received message.
void DoHandshakeLoop(const CryptoHandshakeMessage* in);
- // Called to set the proof of |cache| valid. Also invokes the visitor's
+ // Called to set the proof of |cached| valid. Also invokes the session's
// OnProofValid() method.
- void SetProofValid(QuicCryptoClientConfig::CachedState* cached);
+ void SetCachedProofValid(QuicCryptoClientConfig::CachedState* cached);
- Visitor* visitor_;
+ QuicClientSessionBase* client_session();
State next_state_;
// num_client_hellos_ contains the number of client hello messages that this
@@ -134,6 +113,7 @@ class NET_EXPORT_PRIVATE QuicCryptoClientStream : public QuicCryptoStream {
bool verify_ok_;
string verify_error_details_;
scoped_ptr<ProofVerifyDetails> verify_details_;
+ scoped_ptr<ProofVerifyContext> verify_context_;
DISALLOW_COPY_AND_ASSIGN(QuicCryptoClientStream);
};
diff --git a/net/quic/quic_crypto_client_stream_test.cc b/net/quic/quic_crypto_client_stream_test.cc
index 1b64c9c807..a69f126385 100644
--- a/net/quic/quic_crypto_client_stream_test.cc
+++ b/net/quic/quic_crypto_client_stream_test.cc
@@ -27,10 +27,10 @@ class QuicCryptoClientStreamTest : public ::testing::Test {
public:
QuicCryptoClientStreamTest()
: connection_(new PacketSavingConnection(false)),
- session_(new TestSession(connection_, DefaultQuicConfig())),
- server_key_(kServerHostname, kServerPort, false),
- stream_(new QuicCryptoClientStream(server_key_, session_.get(), NULL,
- &crypto_config_)) {
+ session_(new TestClientSession(connection_, DefaultQuicConfig())),
+ server_key_(kServerHostname, kServerPort, false, kPrivacyModeDisabled),
+ stream_(new QuicCryptoClientStream(
+ server_key_, session_.get(), NULL, &crypto_config_)) {
session_->SetCryptoStream(stream_.get());
session_->config()->SetDefaults();
crypto_config_.SetDefaults();
@@ -47,7 +47,7 @@ class QuicCryptoClientStreamTest : public ::testing::Test {
}
PacketSavingConnection* connection_;
- scoped_ptr<TestSession> session_;
+ scoped_ptr<TestClientSession> session_;
QuicSessionKey server_key_;
scoped_ptr<QuicCryptoClientStream> stream_;
CryptoHandshakeMessage message_;
@@ -101,12 +101,12 @@ TEST_F(QuicCryptoClientStreamTest, NegotiatedParameters) {
const QuicCryptoNegotiatedParameters& crypto_params(
stream_->crypto_negotiated_params());
- EXPECT_EQ(kAESG, crypto_params.aead);
- EXPECT_EQ(kC255, crypto_params.key_exchange);
+ EXPECT_EQ(crypto_config_.aead[0], crypto_params.aead);
+ EXPECT_EQ(crypto_config_.kexs[0], crypto_params.key_exchange);
}
TEST_F(QuicCryptoClientStreamTest, InvalidHostname) {
- QuicSessionKey server_key("invalid", 80, false);
+ QuicSessionKey server_key("invalid", 80, false, kPrivacyModeDisabled);
stream_.reset(new QuicCryptoClientStream(server_key, session_.get(), NULL,
&crypto_config_));
session_->SetCryptoStream(stream_.get());
@@ -121,7 +121,7 @@ TEST_F(QuicCryptoClientStreamTest, ExpiredServerConfig) {
CompleteCryptoHandshake();
connection_ = new PacketSavingConnection(true);
- session_.reset(new TestSession(connection_, DefaultQuicConfig()));
+ session_.reset(new TestClientSession(connection_, DefaultQuicConfig()));
stream_.reset(new QuicCryptoClientStream(server_key_, session_.get(), NULL,
&crypto_config_));
diff --git a/net/quic/quic_crypto_server_stream_test.cc b/net/quic/quic_crypto_server_stream_test.cc
index 4135187879..d0c87e85f2 100644
--- a/net/quic/quic_crypto_server_stream_test.cc
+++ b/net/quic/quic_crypto_server_stream_test.cc
@@ -105,7 +105,7 @@ class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> {
protected:
PacketSavingConnection* connection_;
- TestSession session_;
+ TestClientSession session_;
QuicConfig config_;
QuicCryptoServerConfig crypto_config_;
QuicCryptoServerStream stream_;
@@ -140,12 +140,13 @@ TEST_P(QuicCryptoServerStreamTest, ZeroRTT) {
QuicConfig client_config;
client_config.SetDefaults();
- scoped_ptr<TestSession> client_session(
- new TestSession(client_conn, client_config));
+ scoped_ptr<TestClientSession> client_session(
+ new TestClientSession(client_conn, client_config));
QuicCryptoClientConfig client_crypto_config;
client_crypto_config.SetDefaults();
- QuicSessionKey server_key(kServerHostname, kServerPort, false);
+ QuicSessionKey server_key(kServerHostname, kServerPort, false,
+ kPrivacyModeDisabled);
scoped_ptr<QuicCryptoClientStream> client(new QuicCryptoClientStream(
server_key, client_session.get(), NULL, &client_crypto_config));
client_session->SetCryptoStream(client.get());
@@ -155,7 +156,8 @@ TEST_P(QuicCryptoServerStreamTest, ZeroRTT) {
CHECK(client->CryptoConnect());
CHECK_EQ(1u, client_conn->packets_.size());
- scoped_ptr<TestSession> server_session(new TestSession(server_conn, config_));
+ scoped_ptr<TestClientSession> server_session(
+ new TestClientSession(server_conn, config_));
scoped_ptr<QuicCryptoServerStream> server(
new QuicCryptoServerStream(crypto_config_, server_session.get()));
server_session->SetCryptoStream(server.get());
@@ -177,8 +179,8 @@ TEST_P(QuicCryptoServerStreamTest, ZeroRTT) {
// This causes the client's nonce to be different and thus stops the
// strike-register from rejecting the repeated nonce.
reinterpret_cast<MockRandom*>(client_conn->random_generator())->ChangeValue();
- client_session.reset(new TestSession(client_conn, client_config));
- server_session.reset(new TestSession(server_conn, config_));
+ client_session.reset(new TestClientSession(client_conn, client_config));
+ server_session.reset(new TestClientSession(server_conn, config_));
client.reset(new QuicCryptoClientStream(
server_key, client_session.get(), NULL, &client_crypto_config));
client_session->SetCryptoStream(client.get());
diff --git a/net/quic/quic_http_stream.cc b/net/quic/quic_http_stream.cc
index 3c96fbefcf..77bfc8de80 100644
--- a/net/quic/quic_http_stream.cc
+++ b/net/quic/quic_http_stream.cc
@@ -5,6 +5,7 @@
#include "net/quic/quic_http_stream.h"
#include "base/callback_helpers.h"
+#include "base/metrics/histogram.h"
#include "base/strings/stringprintf.h"
#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
@@ -61,9 +62,11 @@ int QuicHttpStream::InitializeStream(const HttpRequestInfo* request_info,
if (request_info->url.SchemeIsSecure()) {
SSLInfo ssl_info;
- if (!session_->GetSSLInfo(&ssl_info) || !ssl_info.cert) {
+ bool secure_session = session_->GetSSLInfo(&ssl_info) && ssl_info.cert;
+ UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.SecureResourceSecureSession",
+ secure_session);
+ if (!secure_session)
return ERR_REQUEST_FOR_SECURE_RESOURCE_OVER_INSECURE_QUIC;
- }
}
stream_net_log_ = stream_net_log;
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc
index 1eb7ebe736..ac1f715b1a 100644
--- a/net/quic/quic_http_stream_test.cc
+++ b/net/quic/quic_http_stream_test.cc
@@ -209,7 +209,7 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<QuicVersion> {
&crypto_client_stream_factory_,
make_scoped_ptr((QuicServerInfo*)NULL),
QuicSessionKey(kServerHostname, kServerPort,
- false),
+ false, kPrivacyModeDisabled),
DefaultQuicConfig(), &crypto_config_, NULL));
session_->GetCryptoStream()->CryptoConnect();
EXPECT_TRUE(session_->IsCryptoHandshakeConfirmed());
diff --git a/net/quic/quic_session_key.cc b/net/quic/quic_session_key.cc
index 385a1dea95..8ffd52490a 100644
--- a/net/quic/quic_session_key.cc
+++ b/net/quic/quic_session_key.cc
@@ -11,15 +11,19 @@ namespace net {
QuicSessionKey::QuicSessionKey() {}
QuicSessionKey::QuicSessionKey(const HostPortPair& host_port_pair,
- bool is_https)
+ bool is_https,
+ PrivacyMode privacy_mode)
: host_port_pair_(host_port_pair),
- is_https_(is_https) {}
+ is_https_(is_https),
+ privacy_mode_(privacy_mode) {}
QuicSessionKey::QuicSessionKey(const string& host,
uint16 port,
- bool is_https)
+ bool is_https,
+ PrivacyMode privacy_mode)
: host_port_pair_(host, port),
- is_https_(is_https) {}
+ is_https_(is_https),
+ privacy_mode_(privacy_mode) {}
QuicSessionKey::~QuicSessionKey() {}
@@ -27,16 +31,21 @@ bool QuicSessionKey::operator<(const QuicSessionKey& other) const {
if (!host_port_pair_.Equals(other.host_port_pair_)) {
return host_port_pair_ < other.host_port_pair_;
}
- return is_https_ < other.is_https_;
+ if (is_https_ != other.is_https_) {
+ return is_https_ < other.is_https_;
+ }
+ return privacy_mode_ < other.privacy_mode_;
}
bool QuicSessionKey::operator==(const QuicSessionKey& other) const {
return is_https_ == other.is_https_ &&
+ privacy_mode_ == other.privacy_mode_ &&
host_port_pair_.Equals(other.host_port_pair_);
}
string QuicSessionKey::ToString() const {
- return (is_https_ ? "https://" : "http://") + host_port_pair_.ToString();
+ return (is_https_ ? "https://" : "http://") + host_port_pair_.ToString() +
+ (privacy_mode_ == kPrivacyModeEnabled ? "/private" : "");
}
} // namespace net
diff --git a/net/quic/quic_session_key.h b/net/quic/quic_session_key.h
index 12975fa5d2..6cd43e7b9c 100644
--- a/net/quic/quic_session_key.h
+++ b/net/quic/quic_session_key.h
@@ -9,6 +9,7 @@
#include "net/base/host_port_pair.h"
#include "net/base/net_export.h"
+#include "net/base/privacy_mode.h"
namespace net {
@@ -16,8 +17,13 @@ namespace net {
class NET_EXPORT_PRIVATE QuicSessionKey {
public:
QuicSessionKey();
- QuicSessionKey(const HostPortPair& host_port_pair, bool is_https);
- QuicSessionKey(const std::string& host, uint16 port, bool is_https);
+ QuicSessionKey(const HostPortPair& host_port_pair,
+ bool is_https,
+ PrivacyMode privacy_mode);
+ QuicSessionKey(const std::string& host,
+ uint16 port,
+ bool is_https,
+ PrivacyMode privacy_mode);
~QuicSessionKey();
// Needed to be an element of std::set.
@@ -38,9 +44,12 @@ class NET_EXPORT_PRIVATE QuicSessionKey {
bool is_https() const { return is_https_; }
+ PrivacyMode privacy_mode() const { return privacy_mode_; }
+
private:
HostPortPair host_port_pair_;
bool is_https_;
+ PrivacyMode privacy_mode_;
};
} // namespace net
diff --git a/net/quic/quic_session_key_test.cc b/net/quic/quic_session_key_test.cc
index b07b3b7bcf..e8fd4fd57a 100644
--- a/net/quic/quic_session_key_test.cc
+++ b/net/quic/quic_session_key_test.cc
@@ -15,13 +15,25 @@ namespace {
TEST(QuicSessionKeyTest, ToString) {
HostPortPair google_host_port_pair("google.com", 10);
- QuicSessionKey google_http_key(google_host_port_pair, false);
+ QuicSessionKey google_http_key(google_host_port_pair, false,
+ kPrivacyModeDisabled);
string google_http_key_str = google_http_key.ToString();
EXPECT_EQ("http://google.com:10", google_http_key_str);
- QuicSessionKey google_https_key(google_host_port_pair, true);
+ QuicSessionKey google_https_key(google_host_port_pair, true,
+ kPrivacyModeDisabled);
string google_https_key_str = google_https_key.ToString();
EXPECT_EQ("https://google.com:10", google_https_key_str);
+
+ QuicSessionKey private_http_key(google_host_port_pair, false,
+ kPrivacyModeEnabled);
+ string private_http_key_str = private_http_key.ToString();
+ EXPECT_EQ("http://google.com:10/private", private_http_key_str);
+
+ QuicSessionKey private_https_key(google_host_port_pair, true,
+ kPrivacyModeEnabled);
+ string private_https_key_str = private_https_key.ToString();
+ EXPECT_EQ("https://google.com:10/private", private_https_key_str);
}
} // namespace
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index 7324511779..3aec036970 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -6,6 +6,7 @@
#include <set>
+#include "base/cpu.h"
#include "base/message_loop/message_loop.h"
#include "base/message_loop/message_loop_proxy.h"
#include "base/metrics/histogram.h"
@@ -34,6 +35,10 @@
#include "net/quic/quic_session_key.h"
#include "net/socket/client_socket_factory.h"
+#if defined(OS_WIN)
+#include "base/win/windows_version.h"
+#endif
+
using std::string;
using std::vector;
@@ -41,8 +46,29 @@ namespace net {
namespace {
+enum CreateSessionFailure {
+ CREATION_ERROR_CONNECTING_SOCKET,
+ CREATION_ERROR_SETTING_RECEIVE_BUFFER,
+ CREATION_ERROR_SETTING_SEND_BUFFER,
+ CREATION_ERROR_MAX
+};
+
const uint64 kBrokenAlternateProtocolDelaySecs = 300;
+void HistogramCreateSessionFailure(enum CreateSessionFailure error) {
+ UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.CreationError", error,
+ CREATION_ERROR_MAX);
+}
+
+bool IsEcdsaSupported() {
+#if defined(OS_WIN)
+ if (base::win::GetVersion() < base::win::VERSION_VISTA)
+ return false;
+#endif
+
+ return true;
+}
+
} // namespace
QuicStreamFactory::IpAliasKey::IpAliasKey() {}
@@ -76,8 +102,8 @@ class QuicStreamFactory::Job {
HostResolver* host_resolver,
const HostPortPair& host_port_pair,
bool is_https,
+ PrivacyMode privacy_mode,
base::StringPiece method,
- CertVerifier* cert_verifier,
QuicServerInfo* server_info,
const BoundNetLog& net_log);
@@ -117,10 +143,8 @@ class QuicStreamFactory::Job {
QuicStreamFactory* factory_;
SingleRequestHostResolver host_resolver_;
- bool is_https_;
QuicSessionKey session_key_;
bool is_post_;
- CertVerifier* cert_verifier_;
scoped_ptr<QuicServerInfo> server_info_;
const BoundNetLog net_log_;
QuicClientSession* session_;
@@ -135,16 +159,14 @@ QuicStreamFactory::Job::Job(QuicStreamFactory* factory,
HostResolver* host_resolver,
const HostPortPair& host_port_pair,
bool is_https,
+ PrivacyMode privacy_mode,
base::StringPiece method,
- CertVerifier* cert_verifier,
QuicServerInfo* server_info,
const BoundNetLog& net_log)
: factory_(factory),
host_resolver_(host_resolver),
- is_https_(is_https),
- session_key_(host_port_pair, is_https),
+ session_key_(host_port_pair, is_https, privacy_mode),
is_post_(method == "POST"),
- cert_verifier_(cert_verifier),
server_info_(server_info),
net_log_(net_log),
session_(NULL),
@@ -265,8 +287,7 @@ int QuicStreamFactory::Job::DoLoadServerInfoComplete(int rv) {
int QuicStreamFactory::Job::DoConnect() {
io_state_ = STATE_CONNECT_COMPLETE;
- int rv = factory_->CreateSession(session_key_.host_port_pair(), is_https_,
- cert_verifier_, server_info_.Pass(),
+ int rv = factory_->CreateSession(session_key_, server_info_.Pass(),
address_list_, net_log_, &session_);
if (rv != OK) {
DCHECK(rv != ERR_IO_PENDING);
@@ -279,7 +300,7 @@ int QuicStreamFactory::Job::DoConnect() {
return ERR_QUIC_PROTOCOL_ERROR;
}
rv = session_->CryptoConnect(
- factory_->require_confirmation() || is_https_,
+ factory_->require_confirmation() || session_key_.is_https() || is_post_,
base::Bind(&QuicStreamFactory::Job::OnIOComplete,
base::Unretained(this)));
return rv;
@@ -314,19 +335,18 @@ QuicStreamRequest::~QuicStreamRequest() {
int QuicStreamRequest::Request(const HostPortPair& host_port_pair,
bool is_https,
+ PrivacyMode privacy_mode,
base::StringPiece method,
- CertVerifier* cert_verifier,
const BoundNetLog& net_log,
const CompletionCallback& callback) {
DCHECK(!stream_);
DCHECK(callback_.is_null());
DCHECK(factory_);
- int rv = factory_->Create(host_port_pair, is_https,
- method, cert_verifier, net_log, this);
+ int rv = factory_->Create(host_port_pair, is_https, privacy_mode, method,
+ net_log, this);
if (rv == ERR_IO_PENDING) {
host_port_pair_ = host_port_pair;
is_https_ = is_https;
- cert_verifier_ = cert_verifier;
net_log_ = net_log;
callback_ = callback;
} else {
@@ -356,6 +376,7 @@ QuicStreamFactory::QuicStreamFactory(
HostResolver* host_resolver,
ClientSocketFactory* client_socket_factory,
base::WeakPtr<HttpServerProperties> http_server_properties,
+ CertVerifier* cert_verifier,
QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory,
QuicRandom* random_generator,
QuicClock* clock,
@@ -367,6 +388,7 @@ QuicStreamFactory::QuicStreamFactory(
host_resolver_(host_resolver),
client_socket_factory_(client_socket_factory),
http_server_properties_(http_server_properties),
+ cert_verifier_(cert_verifier),
quic_server_info_factory_(NULL),
quic_crypto_client_stream_factory_(quic_crypto_client_stream_factory),
random_generator_(random_generator),
@@ -383,24 +405,30 @@ QuicStreamFactory::QuicStreamFactory(
QuicTime::Delta::FromSeconds(30),
QuicTime::Delta::FromSeconds(30));
- canoncial_suffixes_.push_back(string(".c.youtube.com"));
- canoncial_suffixes_.push_back(string(".googlevideo.com"));
+ crypto_config_.SetDefaults();
+ crypto_config_.AddCanonicalSuffix(".c.youtube.com");
+ crypto_config_.AddCanonicalSuffix(".googlevideo.com");
+ crypto_config_.SetProofVerifier(new ProofVerifierChromium(cert_verifier));
+ base::CPU cpu;
+ if (cpu.has_aesni() && cpu.has_avx())
+ crypto_config_.PreferAesGcm();
+ if (!IsEcdsaSupported())
+ crypto_config_.DisableEcdsa();
}
QuicStreamFactory::~QuicStreamFactory() {
CloseAllSessions(ERR_ABORTED);
STLDeleteElements(&all_sessions_);
STLDeleteValues(&active_jobs_);
- STLDeleteValues(&all_crypto_configs_);
}
int QuicStreamFactory::Create(const HostPortPair& host_port_pair,
bool is_https,
+ PrivacyMode privacy_mode,
base::StringPiece method,
- CertVerifier* cert_verifier,
const BoundNetLog& net_log,
QuicStreamRequest* request) {
- QuicSessionKey session_key(host_port_pair, is_https);
+ QuicSessionKey session_key(host_port_pair, is_https, privacy_mode);
if (HasActiveSession(session_key)) {
request->set_stream(CreateIfSessionExists(session_key, net_log));
return OK;
@@ -415,18 +443,15 @@ int QuicStreamFactory::Create(const HostPortPair& host_port_pair,
QuicServerInfo* quic_server_info = NULL;
if (quic_server_info_factory_) {
- QuicCryptoClientConfig* crypto_config =
- GetOrCreateCryptoConfig(session_key);
QuicCryptoClientConfig::CachedState* cached =
- crypto_config->LookupOrCreate(session_key);
+ crypto_config_.LookupOrCreate(session_key);
DCHECK(cached);
if (cached->IsEmpty()) {
quic_server_info = quic_server_info_factory_->GetForServer(session_key);
}
}
- scoped_ptr<Job> job(new Job(this, host_resolver_, host_port_pair,
- is_https, method, cert_verifier,
- quic_server_info, net_log));
+ scoped_ptr<Job> job(new Job(this, host_resolver_, host_port_pair, is_https,
+ privacy_mode, method, quic_server_info, net_log));
int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete,
base::Unretained(this), job.get()));
@@ -649,15 +674,12 @@ bool QuicStreamFactory::HasActiveSession(
}
int QuicStreamFactory::CreateSession(
- const HostPortPair& host_port_pair,
- bool is_https,
- CertVerifier* cert_verifier,
+ const QuicSessionKey& session_key,
scoped_ptr<QuicServerInfo> server_info,
const AddressList& address_list,
const BoundNetLog& net_log,
QuicClientSession** session) {
bool enable_port_selection = enable_port_selection_;
- QuicSessionKey session_key(host_port_pair, is_https);
if (enable_port_selection &&
ContainsKey(gone_away_aliases_, session_key)) {
// Disable port selection when the server is going away.
@@ -670,7 +692,7 @@ int QuicStreamFactory::CreateSession(
QuicConnectionId connection_id = random_generator_->RandUint64();
IPEndPoint addr = *address_list.begin();
scoped_refptr<PortSuggester> port_suggester =
- new PortSuggester(host_port_pair, port_seed_);
+ new PortSuggester(session_key.host_port_pair(), port_seed_);
DatagramSocket::BindType bind_type = enable_port_selection ?
DatagramSocket::RANDOM_BIND : // Use our callback.
DatagramSocket::DEFAULT_BIND; // Use OS to randomize.
@@ -680,8 +702,10 @@ int QuicStreamFactory::CreateSession(
base::Bind(&PortSuggester::SuggestPort, port_suggester),
net_log.net_log(), net_log.source()));
int rv = socket->Connect(addr);
- if (rv != OK)
+ if (rv != OK) {
+ HistogramCreateSessionFailure(CREATION_ERROR_CONNECTING_SOCKET);
return rv;
+ }
UMA_HISTOGRAM_COUNTS("Net.QuicEphemeralPortsSuggested",
port_suggester->call_count());
if (enable_port_selection) {
@@ -695,11 +719,17 @@ int QuicStreamFactory::CreateSession(
// does not consume "too much" memory. If we see bursty packet loss, we may
// revisit this setting and test for its impact.
const int32 kSocketBufferSize(TcpReceiver::kReceiveWindowTCP);
- socket->SetReceiveBufferSize(kSocketBufferSize);
+ if (!socket->SetReceiveBufferSize(kSocketBufferSize)) {
+ HistogramCreateSessionFailure(CREATION_ERROR_SETTING_RECEIVE_BUFFER);
+ return ERR_SOCKET_SET_RECEIVE_BUFFER_SIZE_ERROR;
+ }
// Set a buffer large enough to contain the initial CWND's worth of packet
// to work around the problem with CHLO packets being sent out with the
// wrong encryption level, when the send buffer is full.
- socket->SetSendBufferSize(kMaxPacketSize * 20); // Support 20 packets.
+ if (!socket->SetSendBufferSize(kMaxPacketSize * 20)) {
+ HistogramCreateSessionFailure(CREATION_ERROR_SETTING_SEND_BUFFER);
+ return ERR_SOCKET_SET_SEND_BUFFER_SIZE_ERROR;
+ }
scoped_ptr<QuicDefaultPacketWriter> writer(
new QuicDefaultPacketWriter(socket.get()));
@@ -717,14 +747,13 @@ int QuicStreamFactory::CreateSession(
writer->SetConnection(connection);
connection->options()->max_packet_length = max_packet_length_;
- QuicCryptoClientConfig* crypto_config = GetOrCreateCryptoConfig(session_key);
- InitializeCachedState(session_key, crypto_config, server_info);
- DCHECK(crypto_config);
+ InitializeCachedState(session_key, server_info);
QuicConfig config = config_;
if (http_server_properties_) {
const HttpServerProperties::NetworkStats* stats =
- http_server_properties_->GetServerNetworkStats(host_port_pair);
+ http_server_properties_->GetServerNetworkStats(
+ session_key.host_port_pair());
if (stats != NULL) {
config.set_initial_round_trip_time_us(stats->rtt.InMicroseconds(),
stats->rtt.InMicroseconds());
@@ -734,12 +763,8 @@ int QuicStreamFactory::CreateSession(
*session = new QuicClientSession(
connection, socket.Pass(), writer.Pass(), this,
quic_crypto_client_stream_factory_, server_info.Pass(), session_key,
- config, crypto_config, net_log.net_log());
+ config, &crypto_config_, net_log.net_log());
all_sessions_.insert(*session); // owning pointer
- if (is_https) {
- crypto_config->SetProofVerifier(
- new ProofVerifierChromium(cert_verifier, net_log));
- }
return OK;
}
@@ -759,72 +784,14 @@ void QuicStreamFactory::ActivateSession(
ip_aliases_[ip_alias_key].insert(session);
}
-QuicCryptoClientConfig* QuicStreamFactory::GetOrCreateCryptoConfig(
- const QuicSessionKey& session_key) {
- QuicCryptoClientConfig* crypto_config;
-
- if (ContainsKey(all_crypto_configs_, session_key)) {
- crypto_config = all_crypto_configs_[session_key];
- DCHECK(crypto_config);
- } else {
- // TODO(rtenneti): if two quic_sessions for the same host_port_pair
- // share the same crypto_config, will it cause issues?
- crypto_config = new QuicCryptoClientConfig();
- crypto_config->SetDefaults();
- all_crypto_configs_[session_key] = crypto_config;
- PopulateFromCanonicalConfig(session_key, crypto_config);
- }
- return crypto_config;
-}
-
-void QuicStreamFactory::PopulateFromCanonicalConfig(
- const QuicSessionKey& session_key,
- QuicCryptoClientConfig* crypto_config) {
- const string server_hostname = session_key.host();
- unsigned i = 0;
- for (; i < canoncial_suffixes_.size(); ++i) {
- if (EndsWith(server_hostname, canoncial_suffixes_[i], false)) {
- break;
- }
- }
- if (i == canoncial_suffixes_.size())
- return;
-
- HostPortPair suffix_host_port_pair(canoncial_suffixes_[i],
- session_key.port());
- QuicSessionKey suffix_session_key(suffix_host_port_pair,
- session_key.is_https());
- if (!ContainsKey(canonical_hostname_to_origin_map_, suffix_session_key)) {
- // This is the first host we've seen which matches the suffix, so make it
- // canonical.
- canonical_hostname_to_origin_map_[suffix_session_key] = session_key;
- return;
- }
-
- const QuicSessionKey& canonical_session_key =
- canonical_hostname_to_origin_map_[suffix_session_key];
- QuicCryptoClientConfig* canonical_crypto_config =
- all_crypto_configs_[canonical_session_key];
- DCHECK(canonical_crypto_config);
-
- // Copy the CachedState for the canonical server from canonical_crypto_config
- // as the initial CachedState for the server_hostname in crypto_config.
- crypto_config->InitializeFrom(session_key, canonical_session_key,
- canonical_crypto_config);
- // Update canonical version to point at the "most recent" crypto_config.
- canonical_hostname_to_origin_map_[suffix_session_key] =
- canonical_session_key;
-}
-
void QuicStreamFactory::InitializeCachedState(
const QuicSessionKey& session_key,
- QuicCryptoClientConfig* crypto_config,
const scoped_ptr<QuicServerInfo>& server_info) {
if (!server_info)
return;
QuicCryptoClientConfig::CachedState* cached =
- crypto_config->LookupOrCreate(session_key);
+ crypto_config_.LookupOrCreate(session_key);
if (!cached->IsEmpty())
return;
@@ -835,8 +802,8 @@ void QuicStreamFactory::InitializeCachedState(
clock_->WallNow()))
return;
- if (!crypto_config->proof_verifier()) {
- // If no verifier is set then we don't check the certificates.
+ if (!session_key.is_https()) {
+ // Don't check the certificates for insecure QUIC.
cached->SetProofValid();
}
}
diff --git a/net/quic/quic_stream_factory.h b/net/quic/quic_stream_factory.h
index 61806a75c4..1e22cdb062 100644
--- a/net/quic/quic_stream_factory.h
+++ b/net/quic/quic_stream_factory.h
@@ -54,8 +54,8 @@ class NET_EXPORT_PRIVATE QuicStreamRequest {
// For http, |is_https| is false and |cert_verifier| can be null.
int Request(const HostPortPair& host_port_pair,
bool is_https,
+ PrivacyMode privacy_mode,
base::StringPiece method,
- CertVerifier* cert_verifier,
const BoundNetLog& net_log,
const CompletionCallback& callback);
@@ -73,7 +73,6 @@ class NET_EXPORT_PRIVATE QuicStreamRequest {
QuicStreamFactory* factory_;
HostPortPair host_port_pair_;
bool is_https_;
- CertVerifier* cert_verifier_;
BoundNetLog net_log_;
CompletionCallback callback_;
scoped_ptr<QuicHttpStream> stream_;
@@ -91,6 +90,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
HostResolver* host_resolver,
ClientSocketFactory* client_socket_factory,
base::WeakPtr<HttpServerProperties> http_server_properties,
+ CertVerifier* cert_verifier,
QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory,
QuicRandom* random_generator,
QuicClock* clock,
@@ -109,8 +109,8 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
// asynchronously.
int Create(const HostPortPair& host_port_pair,
bool is_https,
+ PrivacyMode privacy_mode,
base::StringPiece method,
- CertVerifier* cert_verifier,
const BoundNetLog& net_log,
QuicStreamRequest* request);
@@ -166,7 +166,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
class Job;
friend class test::QuicStreamFactoryPeer;
- // The key used to find session by hostname. Includes
+ // The key used to find session by ip. Includes
// the ip address, port, and scheme.
struct NET_EXPORT_PRIVATE IpAliasKey {
IpAliasKey();
@@ -187,7 +187,6 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
typedef std::set<QuicClientSession*> SessionSet;
typedef std::map<IpAliasKey, SessionSet> IPAliasMap;
typedef std::map<QuicSessionKey, QuicCryptoClientConfig*> CryptoConfigMap;
- typedef std::map<QuicSessionKey, QuicSessionKey> CanonicalHostMap;
typedef std::map<QuicSessionKey, Job*> JobMap;
typedef std::map<QuicStreamRequest*, Job*> RequestMap;
typedef std::set<QuicStreamRequest*> RequestSet;
@@ -203,9 +202,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
void OnJobComplete(Job* job, int rv);
bool HasActiveSession(const QuicSessionKey& session_key) const;
bool HasActiveJob(const QuicSessionKey& session_key) const;
- int CreateSession(const HostPortPair& host_port_pair,
- bool is_https,
- CertVerifier* cert_verifier,
+ int CreateSession(const QuicSessionKey& session_key,
scoped_ptr<QuicServerInfo> quic_server_info,
const AddressList& address_list,
const BoundNetLog& net_log,
@@ -213,20 +210,9 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
void ActivateSession(const QuicSessionKey& key,
QuicClientSession* session);
- QuicCryptoClientConfig* GetOrCreateCryptoConfig(
- const QuicSessionKey& session_key);
-
- // If the suffix of the hostname in |session_key| is in |canoncial_suffixes_|,
- // then populate |crypto_config| with a canonical server config data from
- // |canonical_hostname_to_origin_map_| for that suffix.
- void PopulateFromCanonicalConfig(
- const QuicSessionKey& session_key,
- QuicCryptoClientConfig* crypto_config);
-
// Initializes the cached state associated with |session_key| in
- // |crypto_config| with the information in |server_info|.
+ // |crypto_config_| with the information in |server_info|.
void InitializeCachedState(const QuicSessionKey& session_key,
- QuicCryptoClientConfig* crypto_config,
const scoped_ptr<QuicServerInfo>& server_info);
void ExpireBrokenAlternateProtocolMappings();
@@ -236,6 +222,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
HostResolver* host_resolver_;
ClientSocketFactory* client_socket_factory_;
base::WeakPtr<HttpServerProperties> http_server_properties_;
+ CertVerifier* cert_verifier_;
QuicServerInfoFactory* quic_server_info_factory_;
QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory_;
QuicRandom* random_generator_;
@@ -258,23 +245,6 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
// Origins which have gone away recently.
AliasSet gone_away_aliases_;
- // Contains owning pointers to QuicCryptoClientConfig. QuicCryptoClientConfig
- // contains configuration and cached state about servers.
- // TODO(rtenneti): Persist all_crypto_configs_ to disk and decide when to
- // clear the data in the map.
- CryptoConfigMap all_crypto_configs_;
-
- // Contains a map of servers which could share the same server config. Map
- // from a Canonical host/port/scheme (host is some postfix of host names) to
- // an actual origin, which has a plausible set of initial certificates (or at
- // least server public key).
- CanonicalHostMap canonical_hostname_to_origin_map_;
-
- // Contains list of suffixes (for exmaple ".c.youtube.com",
- // ".googlevideo.com") of canoncial hostnames.
- std::vector<std::string> canoncial_suffixes_;
-
-
// List of broken host:ports and the times when they can be expired.
struct BrokenAlternateProtocolEntry {
HostPortPair origin;
@@ -290,6 +260,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
BrokenAlternateProtocolMap broken_alternate_protocol_map_;
QuicConfig config_;
+ QuicCryptoClientConfig crypto_config_;
JobMap active_jobs_;
JobRequestsMap job_requests_map_;
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index f7e271cadd..780c5cb8e4 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -41,18 +41,14 @@ const int kDefaultServerPort = 443;
class QuicStreamFactoryPeer {
public:
- static QuicCryptoClientConfig* GetOrCreateCryptoConfig(
- QuicStreamFactory* factory,
- const HostPortPair& host_port_pair,
- bool is_https) {
- QuicSessionKey server_key(host_port_pair, is_https);
- return factory->GetOrCreateCryptoConfig(server_key);
+ static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
+ return &factory->crypto_config_;
}
static bool HasActiveSession(QuicStreamFactory* factory,
const HostPortPair& host_port_pair,
bool is_https) {
- QuicSessionKey server_key(host_port_pair, is_https);
+ QuicSessionKey server_key(host_port_pair, is_https, kPrivacyModeDisabled);
return factory->HasActiveSession(server_key);
}
@@ -60,7 +56,7 @@ class QuicStreamFactoryPeer {
QuicStreamFactory* factory,
const HostPortPair& host_port_pair,
bool is_https) {
- QuicSessionKey server_key(host_port_pair, is_https);
+ QuicSessionKey server_key(host_port_pair, is_https, kPrivacyModeDisabled);
DCHECK(factory->HasActiveSession(server_key));
return factory->active_sessions_[server_key];
}
@@ -70,7 +66,7 @@ class QuicStreamFactoryPeer {
const HostPortPair& host_port_pair,
bool is_https,
const BoundNetLog& net_log) {
- QuicSessionKey server_key(host_port_pair, is_https);
+ QuicSessionKey server_key(host_port_pair, is_https, kPrivacyModeDisabled);
return factory->CreateIfSessionExists(server_key, net_log);
}
@@ -92,14 +88,16 @@ class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
: random_generator_(0),
maker_(GetParam(), 0),
clock_(new MockClock()),
+ cert_verifier_(CertVerifier::CreateDefault()),
factory_(&host_resolver_, &socket_factory_,
base::WeakPtr<HttpServerProperties>(),
+ cert_verifier_.get(),
&crypto_client_stream_factory_,
&random_generator_, clock_, kDefaultMaxPacketSize,
SupportedVersions(GetParam()), true, true),
host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
is_https_(false),
- cert_verifier_(CertVerifier::CreateDefault()) {
+ privacy_mode_(kPrivacyModeDisabled) {
factory_.set_require_confirmation(false);
}
@@ -136,8 +134,8 @@ class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(destination,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -181,10 +179,11 @@ class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
MockRandom random_generator_;
QuicTestPacketMaker maker_;
MockClock* clock_; // Owned by factory_.
+ scoped_ptr<CertVerifier> cert_verifier_;
QuicStreamFactory factory_;
HostPortPair host_port_pair_;
bool is_https_;
- scoped_ptr<CertVerifier> cert_verifier_;
+ PrivacyMode privacy_mode_;
BoundNetLog net_log_;
TestCompletionCallback callback_;
};
@@ -208,8 +207,8 @@ TEST_P(QuicStreamFactoryTest, Create) {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -227,8 +226,8 @@ TEST_P(QuicStreamFactoryTest, Create) {
EXPECT_EQ(OK,
request2.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
stream = request2.ReleaseStream(); // Will reset stream 5.
@@ -238,6 +237,70 @@ TEST_P(QuicStreamFactoryTest, Create) {
EXPECT_TRUE(socket_data.at_write_eof());
}
+TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
+ MockRead reads[] = {
+ MockRead(ASYNC, OK, 0) // EOF
+ };
+ DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
+ socket_factory_.AddSocketDataProvider(&socket_data);
+ socket_data.StopAfter(1);
+
+ crypto_client_stream_factory_.set_handshake_mode(
+ MockCryptoClientStream::ZERO_RTT);
+ host_resolver_.set_synchronous_mode(true);
+ host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
+ "192.168.0.1", "");
+
+ QuicStreamRequest request(&factory_);
+ EXPECT_EQ(OK,
+ request.Request(host_port_pair_,
+ is_https_,
+ privacy_mode_,
+ "GET",
+ net_log_,
+ callback_.callback()));
+
+ scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
+ EXPECT_TRUE(stream.get());
+ EXPECT_TRUE(socket_data.at_read_eof());
+ EXPECT_TRUE(socket_data.at_write_eof());
+}
+
+TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
+ MockRead reads[] = {
+ MockRead(ASYNC, OK, 0) // EOF
+ };
+ DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
+ socket_factory_.AddSocketDataProvider(&socket_data);
+ socket_data.StopAfter(1);
+
+ crypto_client_stream_factory_.set_handshake_mode(
+ MockCryptoClientStream::ZERO_RTT);
+ host_resolver_.set_synchronous_mode(true);
+ host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
+ "192.168.0.1", "");
+
+ QuicStreamRequest request(&factory_);
+ // Posts require handshake confirmation, so this will return asynchronously.
+ EXPECT_EQ(ERR_IO_PENDING,
+ request.Request(host_port_pair_,
+ is_https_,
+ privacy_mode_,
+ "POST",
+ net_log_,
+ callback_.callback()));
+
+ // Confirm the handshake and verify that the stream is created.
+ crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
+ QuicSession::HANDSHAKE_CONFIRMED);
+
+ EXPECT_EQ(OK, callback_.WaitForResult());
+ scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
+ EXPECT_TRUE(stream.get());
+ EXPECT_TRUE(socket_data.at_read_eof());
+ EXPECT_TRUE(socket_data.at_write_eof());
+}
+
TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
MockRead reads[] = {
MockRead(ASYNC, OK, 0) // EOF
@@ -253,8 +316,8 @@ TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -266,8 +329,8 @@ TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(host_port_pair_,
!is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -305,8 +368,8 @@ TEST_P(QuicStreamFactoryTest, Pooling) {
EXPECT_EQ(OK,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
@@ -317,8 +380,8 @@ TEST_P(QuicStreamFactoryTest, Pooling) {
EXPECT_EQ(OK,
request2.Request(server2,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback.callback()));
scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
@@ -355,8 +418,8 @@ TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
EXPECT_EQ(OK,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
@@ -367,8 +430,8 @@ TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
EXPECT_EQ(OK,
request2.Request(server2,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback.callback()));
scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
@@ -386,8 +449,8 @@ TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
EXPECT_EQ(OK,
request3.Request(server2,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback3.callback()));
scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
@@ -434,8 +497,8 @@ TEST_P(QuicStreamFactoryTest, HttpsPooling) {
EXPECT_EQ(OK,
request.Request(server1,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
@@ -446,8 +509,8 @@ TEST_P(QuicStreamFactoryTest, HttpsPooling) {
EXPECT_EQ(OK,
request2.Request(server2,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
@@ -499,8 +562,8 @@ TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
EXPECT_EQ(OK,
request.Request(server1,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
@@ -511,8 +574,8 @@ TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
EXPECT_EQ(OK,
request2.Request(server2,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
@@ -544,8 +607,8 @@ TEST_P(QuicStreamFactoryTest, Goaway) {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -569,8 +632,8 @@ TEST_P(QuicStreamFactoryTest, Goaway) {
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -617,8 +680,8 @@ TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
QuicStreamRequest request(&factory_);
int rv = request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback());
if (i == 0) {
@@ -638,8 +701,8 @@ TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
EXPECT_EQ(OK,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
CompletionCallback()));
scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
@@ -669,8 +732,8 @@ TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -691,8 +754,8 @@ TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -713,8 +776,8 @@ TEST_P(QuicStreamFactoryTest, CancelCreate) {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
}
@@ -781,8 +844,8 @@ TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -805,8 +868,8 @@ TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -845,8 +908,8 @@ TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -870,8 +933,8 @@ TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -910,8 +973,8 @@ TEST_P(QuicStreamFactoryTest, OnCertAdded) {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -935,8 +998,8 @@ TEST_P(QuicStreamFactoryTest, OnCertAdded) {
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -975,8 +1038,8 @@ TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -1000,8 +1063,8 @@ TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(host_port_pair_,
is_https_,
+ privacy_mode_,
"GET",
- cert_verifier_.get(),
net_log_,
callback_.callback()));
@@ -1027,13 +1090,11 @@ TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
r2_host_name.append(cannoncial_suffixes[i]);
HostPortPair host_port_pair1(r1_host_name, 80);
- QuicCryptoClientConfig* crypto_config1 =
- QuicStreamFactoryPeer::GetOrCreateCryptoConfig(
- &factory_, host_port_pair1, is_https_);
- DCHECK(crypto_config1);
- QuicSessionKey server_key1(host_port_pair1, is_https_);
+ QuicCryptoClientConfig* crypto_config =
+ QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
+ QuicSessionKey server_key1(host_port_pair1, is_https_, privacy_mode_);
QuicCryptoClientConfig::CachedState* cached1 =
- crypto_config1->LookupOrCreate(server_key1);
+ crypto_config->LookupOrCreate(server_key1);
EXPECT_FALSE(cached1->proof_valid());
EXPECT_TRUE(cached1->source_address_token().empty());
@@ -1043,13 +1104,9 @@ TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
cached1->SetProofValid();
HostPortPair host_port_pair2(r2_host_name, 80);
- QuicCryptoClientConfig* crypto_config2 =
- QuicStreamFactoryPeer::GetOrCreateCryptoConfig(
- &factory_, host_port_pair2, is_https_);
- DCHECK(crypto_config2);
- QuicSessionKey server_key2(host_port_pair2, is_https_);
+ QuicSessionKey server_key2(host_port_pair2, is_https_, privacy_mode_);
QuicCryptoClientConfig::CachedState* cached2 =
- crypto_config2->LookupOrCreate(server_key2);
+ crypto_config->LookupOrCreate(server_key2);
EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
EXPECT_TRUE(cached2->proof_valid());
}
@@ -1067,13 +1124,11 @@ TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
r4_host_name.append(cannoncial_suffixes[i]);
HostPortPair host_port_pair1(r3_host_name, 80);
- QuicCryptoClientConfig* crypto_config1 =
- QuicStreamFactoryPeer::GetOrCreateCryptoConfig(
- &factory_, host_port_pair1, is_https_);
- DCHECK(crypto_config1);
- QuicSessionKey server_key1(host_port_pair1, is_https_);
+ QuicCryptoClientConfig* crypto_config =
+ QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
+ QuicSessionKey server_key1(host_port_pair1, is_https_, privacy_mode_);
QuicCryptoClientConfig::CachedState* cached1 =
- crypto_config1->LookupOrCreate(server_key1);
+ crypto_config->LookupOrCreate(server_key1);
EXPECT_FALSE(cached1->proof_valid());
EXPECT_TRUE(cached1->source_address_token().empty());
@@ -1083,13 +1138,9 @@ TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
cached1->SetProofInvalid();
HostPortPair host_port_pair2(r4_host_name, 80);
- QuicCryptoClientConfig* crypto_config2 =
- QuicStreamFactoryPeer::GetOrCreateCryptoConfig(
- &factory_, host_port_pair2, is_https_);
- DCHECK(crypto_config2);
- QuicSessionKey server_key2(host_port_pair2, is_https_);
+ QuicSessionKey server_key2(host_port_pair2, is_https_, privacy_mode_);
QuicCryptoClientConfig::CachedState* cached2 =
- crypto_config2->LookupOrCreate(server_key2);
+ crypto_config->LookupOrCreate(server_key2);
EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
EXPECT_TRUE(cached2->source_address_token().empty());
EXPECT_FALSE(cached2->proof_valid());
diff --git a/net/quic/test_tools/crypto_test_utils.cc b/net/quic/test_tools/crypto_test_utils.cc
index c3ccf722a3..45fc5a02e8 100644
--- a/net/quic/test_tools/crypto_test_utils.cc
+++ b/net/quic/test_tools/crypto_test_utils.cc
@@ -167,7 +167,7 @@ int CryptoTestUtils::HandshakeWithFakeClient(
QuicCryptoServerStream* server,
const FakeClientOptions& options) {
PacketSavingConnection* client_conn = new PacketSavingConnection(false);
- TestSession client_session(client_conn, DefaultQuicConfig());
+ TestClientSession client_session(client_conn, DefaultQuicConfig());
QuicCryptoClientConfig crypto_config;
client_session.config()->SetDefaults();
@@ -179,7 +179,8 @@ int CryptoTestUtils::HandshakeWithFakeClient(
if (options.channel_id_enabled) {
crypto_config.SetChannelIDSigner(ChannelIDSignerForTesting());
}
- QuicSessionKey server_key(kServerHostname, kServerPort, false);
+ QuicSessionKey server_key(kServerHostname, kServerPort, false,
+ kPrivacyModeDisabled);
QuicCryptoClientStream client(server_key, &client_session, NULL,
&crypto_config);
client_session.SetCryptoStream(&client);
diff --git a/net/quic/test_tools/crypto_test_utils.h b/net/quic/test_tools/crypto_test_utils.h
index 65ba9ee900..1d26dc7e7e 100644
--- a/net/quic/test_tools/crypto_test_utils.h
+++ b/net/quic/test_tools/crypto_test_utils.h
@@ -23,6 +23,7 @@ class ChannelIDSigner;
class CommonCertSets;
class ProofSource;
class ProofVerifier;
+class ProofVerifyContext;
class QuicClock;
class QuicConfig;
class QuicCryptoClientStream;
@@ -96,6 +97,10 @@ class CryptoTestUtils {
// Returns a |ProofVerifier| that uses the QUIC testing root CA.
static ProofVerifier* ProofVerifierForTesting();
+ // Returns a |ProofVerifyContext| that must be used with the verifier
+ // returned by |ProofVerifierForTesting|.
+ static ProofVerifyContext* ProofVerifyContextForTesting();
+
// MockCommonCertSets returns a CommonCertSets that contains a single set with
// hash |hash|, consisting of the certificate |cert| at index |index|.
static CommonCertSets* MockCommonCertSets(base::StringPiece cert,
diff --git a/net/quic/test_tools/crypto_test_utils_chromium.cc b/net/quic/test_tools/crypto_test_utils_chromium.cc
index 8aaef425da..eb4fec03af 100644
--- a/net/quic/test_tools/crypto_test_utils_chromium.cc
+++ b/net/quic/test_tools/crypto_test_utils_chromium.cc
@@ -22,7 +22,7 @@ class TestProofVerifierChromium : public ProofVerifierChromium {
public:
TestProofVerifierChromium(CertVerifier* cert_verifier,
const std::string& cert_file)
- : ProofVerifierChromium(cert_verifier, BoundNetLog()),
+ : ProofVerifierChromium(cert_verifier),
cert_verifier_(cert_verifier) {
// Load and install the root for the validated chain.
scoped_refptr<X509Certificate> root_cert =
@@ -48,6 +48,11 @@ ProofVerifier* CryptoTestUtils::ProofVerifierForTesting() {
return proof_verifier;
}
+// static
+ProofVerifyContext* CryptoTestUtils::ProofVerifyContextForTesting() {
+ return new ProofVerifyContextChromium(BoundNetLog());
+}
+
} // namespace test
} // namespace net
diff --git a/net/quic/test_tools/mock_crypto_client_stream.cc b/net/quic/test_tools/mock_crypto_client_stream.cc
index b0112d5939..a5ff1734be 100644
--- a/net/quic/test_tools/mock_crypto_client_stream.cc
+++ b/net/quic/test_tools/mock_crypto_client_stream.cc
@@ -4,6 +4,7 @@
#include "net/quic/test_tools/mock_crypto_client_stream.h"
+#include "net/quic/quic_client_session_base.h"
#include "net/quic/quic_session_key.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -11,12 +12,13 @@ namespace net {
MockCryptoClientStream::MockCryptoClientStream(
const QuicSessionKey& server_key,
- QuicSession* session,
- QuicCryptoClientStream::Visitor* visitor,
+ QuicClientSessionBase* session,
+ ProofVerifyContext* verify_context,
QuicCryptoClientConfig* crypto_config,
HandshakeMode handshake_mode,
const ProofVerifyDetails* proof_verify_details)
- : QuicCryptoClientStream(server_key, session, visitor, crypto_config),
+ : QuicCryptoClientStream(server_key, session, verify_context,
+ crypto_config),
handshake_mode_(handshake_mode),
proof_verify_details_(proof_verify_details) {
}
@@ -43,7 +45,7 @@ bool MockCryptoClientStream::CryptoConnect() {
encryption_established_ = true;
handshake_confirmed_ = true;
if (proof_verify_details_) {
- visitor()->OnProofVerifyDetailsAvailable(*proof_verify_details_);
+ client_session()->OnProofVerifyDetailsAvailable(*proof_verify_details_);
}
SetConfigNegotiated();
session()->OnCryptoHandshakeEvent(QuicSession::HANDSHAKE_CONFIRMED);
@@ -90,4 +92,8 @@ void MockCryptoClientStream::SetConfigNegotiated() {
ASSERT_TRUE(session()->config()->negotiated());
}
+QuicClientSessionBase* MockCryptoClientStream::client_session() {
+ return reinterpret_cast<QuicClientSessionBase*>(session());
+}
+
} // namespace net
diff --git a/net/quic/test_tools/mock_crypto_client_stream.h b/net/quic/test_tools/mock_crypto_client_stream.h
index 444f88dd1b..85679451b8 100644
--- a/net/quic/test_tools/mock_crypto_client_stream.h
+++ b/net/quic/test_tools/mock_crypto_client_stream.h
@@ -37,8 +37,8 @@ class MockCryptoClientStream : public QuicCryptoClientStream {
MockCryptoClientStream(
const QuicSessionKey& server_key,
- QuicSession* session,
- QuicCryptoClientStream::Visitor* visitor,
+ QuicClientSessionBase* session,
+ ProofVerifyContext* verify_context,
QuicCryptoClientConfig* crypto_config,
HandshakeMode handshake_mode,
const ProofVerifyDetails* proof_verify_details_);
@@ -59,6 +59,7 @@ class MockCryptoClientStream : public QuicCryptoClientStream {
private:
void SetConfigNegotiated();
+ QuicClientSessionBase* client_session();
const ProofVerifyDetails* proof_verify_details_;
};
diff --git a/net/quic/test_tools/mock_crypto_client_stream_factory.cc b/net/quic/test_tools/mock_crypto_client_stream_factory.cc
index 686fd5641e..83dac36928 100644
--- a/net/quic/test_tools/mock_crypto_client_stream_factory.cc
+++ b/net/quic/test_tools/mock_crypto_client_stream_factory.cc
@@ -25,7 +25,7 @@ MockCryptoClientStreamFactory::CreateQuicCryptoClientStream(
QuicClientSession* session,
QuicCryptoClientConfig* crypto_config) {
last_stream_ = new MockCryptoClientStream(
- server_key, session, session, crypto_config, handshake_mode_,
+ server_key, session, NULL, crypto_config, handshake_mode_,
proof_verify_details_);
return last_stream_;
}
diff --git a/net/quic/test_tools/quic_test_utils.cc b/net/quic/test_tools/quic_test_utils.cc
index c3e20ae5ef..7d24b2f3f9 100644
--- a/net/quic/test_tools/quic_test_utils.cc
+++ b/net/quic/test_tools/quic_test_utils.cc
@@ -23,6 +23,7 @@ using std::max;
using std::min;
using std::string;
using testing::_;
+using testing::AnyNumber;
namespace net {
namespace test {
@@ -364,6 +365,23 @@ QuicCryptoStream* TestSession::GetCryptoStream() {
return crypto_stream_;
}
+TestClientSession::TestClientSession(QuicConnection* connection,
+ const QuicConfig& config)
+ : QuicClientSessionBase(connection, config),
+ crypto_stream_(NULL) {
+ EXPECT_CALL(*this, OnProofValid(_)).Times(AnyNumber());
+}
+
+TestClientSession::~TestClientSession() {}
+
+void TestClientSession::SetCryptoStream(QuicCryptoStream* stream) {
+ crypto_stream_ = stream;
+}
+
+QuicCryptoStream* TestClientSession::GetCryptoStream() {
+ return crypto_stream_;
+}
+
MockPacketWriter::MockPacketWriter() {
}
diff --git a/net/quic/test_tools/quic_test_utils.h b/net/quic/test_tools/quic_test_utils.h
index f6e188acc5..1cca4e860e 100644
--- a/net/quic/test_tools/quic_test_utils.h
+++ b/net/quic/test_tools/quic_test_utils.h
@@ -13,7 +13,9 @@
#include "base/strings/string_piece.h"
#include "net/quic/congestion_control/loss_detection_interface.h"
#include "net/quic/congestion_control/send_algorithm_interface.h"
+#include "net/quic/crypto/quic_crypto_client_config.h"
#include "net/quic/quic_ack_notifier.h"
+#include "net/quic/quic_client_session_base.h"
#include "net/quic/quic_connection.h"
#include "net/quic/quic_framer.h"
#include "net/quic/quic_session.h"
@@ -396,13 +398,37 @@ class TestSession : public QuicSession {
void SetCryptoStream(QuicCryptoStream* stream);
- virtual QuicCryptoStream* GetCryptoStream();
+ virtual QuicCryptoStream* GetCryptoStream() OVERRIDE;
private:
QuicCryptoStream* crypto_stream_;
DISALLOW_COPY_AND_ASSIGN(TestSession);
};
+class TestClientSession : public QuicClientSessionBase {
+ public:
+ TestClientSession(QuicConnection* connection, const QuicConfig& config);
+ virtual ~TestClientSession();
+
+ // QuicClientSessionBase
+ MOCK_METHOD1(OnProofValid,
+ void(const QuicCryptoClientConfig::CachedState& cached));
+ MOCK_METHOD1(OnProofVerifyDetailsAvailable,
+ void(const ProofVerifyDetails& verify_details));
+
+ // TestClientSession
+ MOCK_METHOD1(CreateIncomingDataStream, QuicDataStream*(QuicStreamId id));
+ MOCK_METHOD0(CreateOutgoingDataStream, QuicDataStream*());
+
+ void SetCryptoStream(QuicCryptoStream* stream);
+
+ virtual QuicCryptoStream* GetCryptoStream() OVERRIDE;
+
+ private:
+ QuicCryptoStream* crypto_stream_;
+ DISALLOW_COPY_AND_ASSIGN(TestClientSession);
+};
+
class MockPacketWriter : public QuicPacketWriter {
public:
MockPacketWriter();
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc
index e20b355daf..9e1abf482a 100644
--- a/net/socket/client_socket_pool_base.cc
+++ b/net/socket/client_socket_pool_base.cc
@@ -448,7 +448,7 @@ bool ClientSocketPoolBaseHelper::AssignIdleSocketToRequest(
// the |idle_socket_it| will be set to the newest used idle socket.
for (std::list<IdleSocket>::iterator it = idle_sockets->begin();
it != idle_sockets->end();) {
- if (!it->socket->IsConnectedAndIdle()) {
+ if (!it->IsUsable()) {
DecrementIdleCount();
delete it->socket;
it = idle_sockets->erase(it);
@@ -648,15 +648,19 @@ base::DictionaryValue* ClientSocketPoolBaseHelper::GetInfoAsValue(
return dict;
}
+bool ClientSocketPoolBaseHelper::IdleSocket::IsUsable() const {
+ if (socket->WasEverUsed())
+ return socket->IsConnectedAndIdle();
+ return socket->IsConnected();
+}
+
bool ClientSocketPoolBaseHelper::IdleSocket::ShouldCleanup(
base::TimeTicks now,
base::TimeDelta timeout) const {
bool timed_out = (now - start_time) >= timeout;
if (timed_out)
return true;
- if (socket->WasEverUsed())
- return !socket->IsConnectedAndIdle();
- return !socket->IsConnected();
+ return !IsUsable();
}
void ClientSocketPoolBaseHelper::CleanupIdleSockets(bool force) {
diff --git a/net/socket/client_socket_pool_base.h b/net/socket/client_socket_pool_base.h
index 8a0a1f3c10..8079cd4e5c 100644
--- a/net/socket/client_socket_pool_base.h
+++ b/net/socket/client_socket_pool_base.h
@@ -339,14 +339,19 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper
struct IdleSocket {
IdleSocket() : socket(NULL) {}
+ // An idle socket can't be used if it is disconnected or has been used
+ // before and has received data unexpectedly (hence no longer idle). The
+ // unread data would be mistaken for the beginning of the next response if
+ // we were to use the socket for a new request.
+ //
+ // Note that a socket that has never been used before (like a preconnected
+ // socket) may be used even with unread data. This may be, e.g., a SPDY
+ // SETTINGS frame.
+ bool IsUsable() const;
+
// An idle socket should be removed if it can't be reused, or has been idle
// for too long. |now| is the current time value (TimeTicks::Now()).
// |timeout| is the length of time to wait before timing out an idle socket.
- //
- // An idle socket can't be reused if it is disconnected or has received
- // data unexpectedly (hence no longer idle). The unread data would be
- // mistaken for the beginning of the next response if we were to reuse the
- // socket for a new request.
bool ShouldCleanup(base::TimeTicks now, base::TimeDelta timeout) const;
StreamSocket* socket;
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc
index 46f4e40c0d..605af728c5 100644
--- a/net/socket/client_socket_pool_base_unittest.cc
+++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -116,14 +116,26 @@ class MockClientSocket : public StreamSocket {
public:
explicit MockClientSocket(net::NetLog* net_log)
: connected_(false),
+ has_unread_data_(false),
net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_SOCKET)),
was_used_to_convey_data_(false) {
}
+ // Sets whether the socket has unread data. If true, the next call to Read()
+ // will return 1 byte and IsConnectedAndIdle() will return false.
+ void set_has_unread_data(bool has_unread_data) {
+ has_unread_data_ = has_unread_data;
+ }
+
// Socket implementation.
virtual int Read(
IOBuffer* /* buf */, int len,
const CompletionCallback& /* callback */) OVERRIDE {
+ if (has_unread_data_ && len > 0) {
+ has_unread_data_ = false;
+ was_used_to_convey_data_ = true;
+ return 1;
+ }
return ERR_UNEXPECTED;
}
@@ -144,7 +156,9 @@ class MockClientSocket : public StreamSocket {
virtual void Disconnect() OVERRIDE { connected_ = false; }
virtual bool IsConnected() const OVERRIDE { return connected_; }
- virtual bool IsConnectedAndIdle() const OVERRIDE { return connected_; }
+ virtual bool IsConnectedAndIdle() const OVERRIDE {
+ return connected_ && !has_unread_data_;
+ }
virtual int GetPeerAddress(IPEndPoint* /* address */) const OVERRIDE {
return ERR_UNEXPECTED;
@@ -176,6 +190,7 @@ class MockClientSocket : public StreamSocket {
private:
bool connected_;
+ bool has_unread_data_;
BoundNetLog net_log_;
bool was_used_to_convey_data_;
@@ -245,6 +260,7 @@ class TestConnectJob : public ConnectJob {
kMockPendingRecoverableJob,
kMockAdditionalErrorStateJob,
kMockPendingAdditionalErrorStateJob,
+ kMockUnreadDataJob,
};
// The kMockPendingJob uses a slight delay before allowing the connect
@@ -372,6 +388,12 @@ class TestConnectJob : public ConnectJob {
false /* recoverable */),
base::TimeDelta::FromMilliseconds(2));
return ERR_IO_PENDING;
+ case kMockUnreadDataJob: {
+ int ret = DoConnect(true /* successful */, false /* sync */,
+ false /* recoverable */);
+ static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
+ return ret;
+ }
default:
NOTREACHED();
SetSocket(scoped_ptr<StreamSocket>());
@@ -3541,7 +3563,7 @@ TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
ASSERT_EQ(OK, callback1.WaitForResult());
- // Make sure if a preconneced socket is not fully connected when a request
+ // Make sure if a preconnected socket is not fully connected when a request
// starts, it has a connect start time.
TestLoadTimingInfoConnectedNotReused(handle1);
handle1.Reset();
@@ -3720,6 +3742,46 @@ TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
}
+// Tests that a preconnect that starts out with unread data can still be used.
+// http://crbug.com/334467
+TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
+ CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
+ connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
+
+ pool_->RequestSockets("a", &params_, 1, BoundNetLog());
+
+ ASSERT_TRUE(pool_->HasGroup("a"));
+ EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
+ EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
+ EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
+
+ // Fail future jobs to be sure that handle receives the preconnected socket
+ // rather than closing it and making a new one.
+ connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
+ ClientSocketHandle handle;
+ TestCompletionCallback callback;
+ EXPECT_EQ(OK, handle.Init("a",
+ params_,
+ DEFAULT_PRIORITY,
+ callback.callback(),
+ pool_.get(),
+ BoundNetLog()));
+
+ ASSERT_TRUE(pool_->HasGroup("a"));
+ EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
+ EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
+ EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
+
+ // Drain the pending read.
+ EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback()));
+
+ TestLoadTimingInfoConnectedReused(handle);
+ handle.Reset();
+
+ // The socket should be usable now that it's idle again.
+ EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
+}
+
class MockLayeredPool : public HigherLayeredPool {
public:
MockLayeredPool(TestClientSocketPool* pool,
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc
index 24d6b70ced..7ade7318c9 100644
--- a/net/socket/client_socket_pool_manager.cc
+++ b/net/socket/client_socket_pool_manager.cc
@@ -132,8 +132,7 @@ int InitSocketPoolHelper(const GURL& request_url,
// should be the same for all connections, whereas version_max may
// change for version fallbacks.
std::string prefix = "ssl/";
- if (ssl_config_for_origin.version_max !=
- SSLConfigService::default_version_max()) {
+ if (ssl_config_for_origin.version_max != net::kDefaultSSLVersionMax) {
switch (ssl_config_for_origin.version_max) {
case SSL_PROTOCOL_VERSION_TLS1_2:
prefix = "ssl(max:3.3)/";
diff --git a/net/socket/nss_ssl_util.cc b/net/socket/nss_ssl_util.cc
index 20911d5a67..7b068545a5 100644
--- a/net/socket/nss_ssl_util.cc
+++ b/net/socket/nss_ssl_util.cc
@@ -357,12 +357,16 @@ int MapNSSError(PRErrorCode err) {
return ERR_SSL_INAPPROPRIATE_FALLBACK;
default: {
+ const char* err_name = PR_ErrorToName(err);
+ if (err_name == NULL)
+ err_name = "";
if (IS_SSL_ERROR(err)) {
- LOG(WARNING) << "Unknown SSL error " << err
+ LOG(WARNING) << "Unknown SSL error " << err << " (" << err_name << ")"
<< " mapped to net::ERR_SSL_PROTOCOL_ERROR";
return ERR_SSL_PROTOCOL_ERROR;
}
- LOG(WARNING) << "Unknown error " << err << " mapped to net::ERR_FAILED";
+ LOG(WARNING) << "Unknown error " << err << " (" << err_name << ")"
+ << " mapped to net::ERR_FAILED";
return ERR_FAILED;
}
}
diff --git a/net/socket/socks5_client_socket.cc b/net/socket/socks5_client_socket.cc
index 004b67c669..777ce0c26a 100644
--- a/net/socket/socks5_client_socket.cc
+++ b/net/socket/socks5_client_socket.cc
@@ -5,6 +5,7 @@
#include "net/socket/socks5_client_socket.h"
#include "base/basictypes.h"
+#include "base/callback_helpers.h"
#include "base/compiler_specific.h"
#include "base/debug/trace_event.h"
#include "base/format_macros.h"
@@ -38,6 +39,7 @@ SOCKS5ClientSocket::SOCKS5ClientSocket(
bytes_sent_(0),
bytes_received_(0),
read_header_size(kReadHeaderSize),
+ was_ever_used_(false),
host_request_info_(req_info),
net_log_(transport_->socket()->NetLog()) {
}
@@ -109,11 +111,7 @@ void SOCKS5ClientSocket::SetOmniboxSpeculation() {
}
bool SOCKS5ClientSocket::WasEverUsed() const {
- if (transport_.get() && transport_->socket()) {
- return transport_->socket()->WasEverUsed();
- }
- NOTREACHED();
- return false;
+ return was_ever_used_;
}
bool SOCKS5ClientSocket::UsingTCPFastOpen() const {
@@ -156,19 +154,33 @@ int SOCKS5ClientSocket::Read(IOBuffer* buf, int buf_len,
DCHECK(completed_handshake_);
DCHECK_EQ(STATE_NONE, next_state_);
DCHECK(user_callback_.is_null());
-
- return transport_->socket()->Read(buf, buf_len, callback);
+ DCHECK(!callback.is_null());
+
+ int rv = transport_->socket()->Read(
+ buf, buf_len,
+ base::Bind(&SOCKS5ClientSocket::OnReadWriteComplete,
+ base::Unretained(this), callback));
+ if (rv > 0)
+ was_ever_used_ = true;
+ return rv;
}
// Write is called by the transport layer. This can only be done if the
// SOCKS handshake is complete.
int SOCKS5ClientSocket::Write(IOBuffer* buf, int buf_len,
- const CompletionCallback& callback) {
+ const CompletionCallback& callback) {
DCHECK(completed_handshake_);
DCHECK_EQ(STATE_NONE, next_state_);
DCHECK(user_callback_.is_null());
-
- return transport_->socket()->Write(buf, buf_len, callback);
+ DCHECK(!callback.is_null());
+
+ int rv = transport_->socket()->Write(
+ buf, buf_len,
+ base::Bind(&SOCKS5ClientSocket::OnReadWriteComplete,
+ base::Unretained(this), callback));
+ if (rv > 0)
+ was_ever_used_ = true;
+ return rv;
}
bool SOCKS5ClientSocket::SetReceiveBufferSize(int32 size) {
@@ -185,9 +197,7 @@ void SOCKS5ClientSocket::DoCallback(int result) {
// Since Run() may result in Read being called,
// clear user_callback_ up front.
- CompletionCallback c = user_callback_;
- user_callback_.Reset();
- c.Run(result);
+ base::ResetAndReturn(&user_callback_).Run(result);
}
void SOCKS5ClientSocket::OnIOComplete(int result) {
@@ -199,6 +209,16 @@ void SOCKS5ClientSocket::OnIOComplete(int result) {
}
}
+void SOCKS5ClientSocket::OnReadWriteComplete(const CompletionCallback& callback,
+ int result) {
+ DCHECK_NE(ERR_IO_PENDING, result);
+ DCHECK(!callback.is_null());
+
+ if (result > 0)
+ was_ever_used_ = true;
+ callback.Run(result);
+}
+
int SOCKS5ClientSocket::DoLoop(int last_io_result) {
DCHECK_NE(next_state_, STATE_NONE);
int rv = last_io_result;
diff --git a/net/socket/socks5_client_socket.h b/net/socket/socks5_client_socket.h
index 45216244f1..75f75310d7 100644
--- a/net/socket/socks5_client_socket.h
+++ b/net/socket/socks5_client_socket.h
@@ -99,6 +99,7 @@ class NET_EXPORT_PRIVATE SOCKS5ClientSocket : public StreamSocket {
void DoCallback(int result);
void OnIOComplete(int result);
+ void OnReadWriteComplete(const CompletionCallback& callback, int result);
int DoLoop(int last_io_result);
int DoHandshakeRead();
@@ -143,6 +144,8 @@ class NET_EXPORT_PRIVATE SOCKS5ClientSocket : public StreamSocket {
size_t read_header_size;
+ bool was_ever_used_;
+
HostResolver::RequestInfo host_request_info_;
BoundNetLog net_log_;
diff --git a/net/socket/socks_client_socket.cc b/net/socket/socks_client_socket.cc
index 67089589cc..654509210a 100644
--- a/net/socket/socks_client_socket.cc
+++ b/net/socket/socks_client_socket.cc
@@ -6,6 +6,7 @@
#include "base/basictypes.h"
#include "base/bind.h"
+#include "base/callback_helpers.h"
#include "base/compiler_specific.h"
#include "base/sys_byteorder.h"
#include "net/base/io_buffer.h"
@@ -65,6 +66,7 @@ SOCKSClientSocket::SOCKSClientSocket(
completed_handshake_(false),
bytes_sent_(0),
bytes_received_(0),
+ was_ever_used_(false),
host_resolver_(host_resolver),
host_request_info_(req_info),
priority_(priority),
@@ -137,11 +139,7 @@ void SOCKSClientSocket::SetOmniboxSpeculation() {
}
bool SOCKSClientSocket::WasEverUsed() const {
- if (transport_.get() && transport_->socket()) {
- return transport_->socket()->WasEverUsed();
- }
- NOTREACHED();
- return false;
+ return was_ever_used_;
}
bool SOCKSClientSocket::UsingTCPFastOpen() const {
@@ -184,8 +182,15 @@ int SOCKSClientSocket::Read(IOBuffer* buf, int buf_len,
DCHECK(completed_handshake_);
DCHECK_EQ(STATE_NONE, next_state_);
DCHECK(user_callback_.is_null());
-
- return transport_->socket()->Read(buf, buf_len, callback);
+ DCHECK(!callback.is_null());
+
+ int rv = transport_->socket()->Read(
+ buf, buf_len,
+ base::Bind(&SOCKSClientSocket::OnReadWriteComplete,
+ base::Unretained(this), callback));
+ if (rv > 0)
+ was_ever_used_ = true;
+ return rv;
}
// Write is called by the transport layer. This can only be done if the
@@ -195,8 +200,15 @@ int SOCKSClientSocket::Write(IOBuffer* buf, int buf_len,
DCHECK(completed_handshake_);
DCHECK_EQ(STATE_NONE, next_state_);
DCHECK(user_callback_.is_null());
-
- return transport_->socket()->Write(buf, buf_len, callback);
+ DCHECK(!callback.is_null());
+
+ int rv = transport_->socket()->Write(
+ buf, buf_len,
+ base::Bind(&SOCKSClientSocket::OnReadWriteComplete,
+ base::Unretained(this), callback));
+ if (rv > 0)
+ was_ever_used_ = true;
+ return rv;
}
bool SOCKSClientSocket::SetReceiveBufferSize(int32 size) {
@@ -213,10 +225,8 @@ void SOCKSClientSocket::DoCallback(int result) {
// Since Run() may result in Read being called,
// clear user_callback_ up front.
- CompletionCallback c = user_callback_;
- user_callback_.Reset();
DVLOG(1) << "Finished setting up SOCKS handshake";
- c.Run(result);
+ base::ResetAndReturn(&user_callback_).Run(result);
}
void SOCKSClientSocket::OnIOComplete(int result) {
@@ -228,6 +238,16 @@ void SOCKSClientSocket::OnIOComplete(int result) {
}
}
+void SOCKSClientSocket::OnReadWriteComplete(const CompletionCallback& callback,
+ int result) {
+ DCHECK_NE(ERR_IO_PENDING, result);
+ DCHECK(!callback.is_null());
+
+ if (result > 0)
+ was_ever_used_ = true;
+ callback.Run(result);
+}
+
int SOCKSClientSocket::DoLoop(int last_io_result) {
DCHECK_NE(next_state_, STATE_NONE);
int rv = last_io_result;
diff --git a/net/socket/socks_client_socket.h b/net/socket/socks_client_socket.h
index d4f058a62b..be05ce0fad 100644
--- a/net/socket/socks_client_socket.h
+++ b/net/socket/socks_client_socket.h
@@ -84,6 +84,7 @@ class NET_EXPORT_PRIVATE SOCKSClientSocket : public StreamSocket {
void DoCallback(int result);
void OnIOComplete(int result);
+ void OnReadWriteComplete(const CompletionCallback& callback, int result);
int DoLoop(int last_io_result);
int DoResolveHost();
@@ -100,7 +101,7 @@ class NET_EXPORT_PRIVATE SOCKSClientSocket : public StreamSocket {
State next_state_;
- // Stores the callback to the layer above, called on completing Connect().
+ // Stores the callbacks to the layer above, called on completing Connect().
CompletionCallback user_callback_;
// This IOBuffer is used by the class to read and write
@@ -120,6 +121,9 @@ class NET_EXPORT_PRIVATE SOCKSClientSocket : public StreamSocket {
size_t bytes_sent_;
size_t bytes_received_;
+ // This becomes true when the socket is used to send or receive data.
+ bool was_ever_used_;
+
// Used to resolve the hostname to which the SOCKS proxy will connect.
SingleRequestHostResolver host_resolver_;
AddressList addresses_;
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
index ca5a6891b8..b3c8e0ee7b 100644
--- a/net/socket/ssl_client_socket_nss.cc
+++ b/net/socket/ssl_client_socket_nss.cc
@@ -330,7 +330,6 @@ class PeerCertificateChain {
std::vector<base::StringPiece> AsStringPieceVector() const;
bool empty() const { return certs_.empty(); }
- size_t size() const { return certs_.size(); }
CERTCertificate* operator[](size_t index) const {
DCHECK_LT(index, certs_.size());
@@ -636,9 +635,10 @@ class SSLClientSocketNSS::Core : public base::RefCountedThreadSafe<Core> {
int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback);
// Called on the network task runner.
- bool IsConnected();
- bool HasPendingAsyncOperation();
- bool HasUnhandledReceivedData();
+ bool IsConnected() const;
+ bool HasPendingAsyncOperation() const;
+ bool HasUnhandledReceivedData() const;
+ bool WasEverUsed() const;
// Called on the network task runner.
// Causes the associated SSL/TLS session ID to be added to NSS's session
@@ -841,6 +841,10 @@ class SSLClientSocketNSS::Core : public base::RefCountedThreadSafe<Core> {
bool nss_waiting_write_;
bool nss_is_closed_;
+ // Set when Read() or Write() successfully reads or writes data to or from the
+ // network.
+ bool was_ever_used_;
+
////////////////////////////////////////////////////////////////////////////
// Members that are ONLY accessed on the NSS task runner:
////////////////////////////////////////////////////////////////////////////
@@ -936,6 +940,7 @@ SSLClientSocketNSS::Core::Core(
nss_waiting_read_(false),
nss_waiting_write_(false),
nss_is_closed_(false),
+ was_ever_used_(false),
host_and_port_(host_and_port),
ssl_config_(ssl_config),
nss_fd_(NULL),
@@ -1148,8 +1153,11 @@ int SSLClientSocketNSS::Core::Read(IOBuffer* buf, int buf_len,
return ERR_IO_PENDING;
} else {
DCHECK(!nss_waiting_read_);
- if (rv <= 0)
+ if (rv <= 0) {
nss_is_closed_ = true;
+ } else {
+ was_ever_used_ = true;
+ }
}
}
@@ -1202,29 +1210,37 @@ int SSLClientSocketNSS::Core::Write(IOBuffer* buf, int buf_len,
return ERR_IO_PENDING;
} else {
DCHECK(!nss_waiting_write_);
- if (rv < 0)
+ if (rv < 0) {
nss_is_closed_ = true;
+ } else if (rv > 0) {
+ was_ever_used_ = true;
+ }
}
}
return rv;
}
-bool SSLClientSocketNSS::Core::IsConnected() {
+bool SSLClientSocketNSS::Core::IsConnected() const {
DCHECK(OnNetworkTaskRunner());
return !nss_is_closed_;
}
-bool SSLClientSocketNSS::Core::HasPendingAsyncOperation() {
+bool SSLClientSocketNSS::Core::HasPendingAsyncOperation() const {
DCHECK(OnNetworkTaskRunner());
return nss_waiting_read_ || nss_waiting_write_;
}
-bool SSLClientSocketNSS::Core::HasUnhandledReceivedData() {
+bool SSLClientSocketNSS::Core::HasUnhandledReceivedData() const {
DCHECK(OnNetworkTaskRunner());
return unhandled_buffer_size_ != 0;
}
+bool SSLClientSocketNSS::Core::WasEverUsed() const {
+ DCHECK(OnNetworkTaskRunner());
+ return was_ever_used_;
+}
+
void SSLClientSocketNSS::Core::CacheSessionIfNecessary() {
// TODO(rsleevi): This should occur on the NSS task runner, due to the use of
// nss_fd_. However, it happens on the network task runner in order to match
@@ -2656,16 +2672,22 @@ void SSLClientSocketNSS::Core::DidNSSRead(int result) {
DCHECK(OnNetworkTaskRunner());
DCHECK(nss_waiting_read_);
nss_waiting_read_ = false;
- if (result <= 0)
+ if (result <= 0) {
nss_is_closed_ = true;
+ } else {
+ was_ever_used_ = true;
+ }
}
void SSLClientSocketNSS::Core::DidNSSWrite(int result) {
DCHECK(OnNetworkTaskRunner());
DCHECK(nss_waiting_write_);
nss_waiting_write_ = false;
- if (result < 0)
+ if (result < 0) {
nss_is_closed_ = true;
+ } else if (result > 0) {
+ was_ever_used_ = true;
+ }
}
void SSLClientSocketNSS::Core::BufferSendComplete(int result) {
@@ -3025,11 +3047,9 @@ void SSLClientSocketNSS::SetOmniboxSpeculation() {
}
bool SSLClientSocketNSS::WasEverUsed() const {
- if (transport_.get() && transport_->socket()) {
- return transport_->socket()->WasEverUsed();
- }
- NOTREACHED();
- return false;
+ DCHECK(core_.get());
+
+ return core_->WasEverUsed();
}
bool SSLClientSocketNSS::UsingTCPFastOpen() const {
@@ -3243,7 +3263,7 @@ int SSLClientSocketNSS::InitializeSSLPeerName() {
SockaddrStorage storage;
if (!peer_address.ToSockAddr(storage.addr, &storage.addr_len))
- return ERR_UNEXPECTED;
+ return ERR_ADDRESS_INVALID;
PRNetAddr peername;
memset(&peername, 0, sizeof(peername));
diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc
index f97c4697cf..ef3b130c5d 100644
--- a/net/socket/ssl_client_socket_openssl.cc
+++ b/net/socket/ssl_client_socket_openssl.cc
@@ -389,7 +389,7 @@ SSLClientSocketOpenSSL::PeerCertificateChain::operator=(
return *this;
}
-#if defined(USE_OPENSSL)
+#if defined(USE_OPENSSL_CERTS)
// When OSCertHandle is typedef'ed to X509, this implementation does a short cut
// to avoid converting back and forth between der and X509 struct.
void SSLClientSocketOpenSSL::PeerCertificateChain::Reset(
@@ -417,7 +417,7 @@ void SSLClientSocketOpenSSL::PeerCertificateChain::Reset(
CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509);
}
}
-#else // !defined(USE_OPENSSL)
+#else // !defined(USE_OPENSSL_CERTS)
void SSLClientSocketOpenSSL::PeerCertificateChain::Reset(
STACK_OF(X509)* chain) {
openssl_chain_.reset(NULL);
@@ -455,7 +455,7 @@ void SSLClientSocketOpenSSL::PeerCertificateChain::Reset(
os_chain_ = NULL;
}
}
-#endif // USE_OPENSSL
+#endif // defined(USE_OPENSSL_CERTS)
// static
SSLSessionCacheOpenSSL::Config
@@ -471,7 +471,9 @@ void SSLClientSocket::ClearSessionCache() {
SSLClientSocketOpenSSL::SSLContext* context =
SSLClientSocketOpenSSL::SSLContext::GetInstance();
context->session_cache()->Flush();
+#if defined(USE_OPENSSL_CERTS)
OpenSSLClientKeyStore::GetInstance()->Flush();
+#endif
}
SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
@@ -487,6 +489,7 @@ SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
transport_write_error_(OK),
server_cert_chain_(new PeerCertificateChain(NULL)),
completed_handshake_(false),
+ was_ever_used_(false),
client_auth_cert_needed_(false),
cert_verifier_(context.cert_verifier),
server_bound_cert_service_(context.server_bound_cert_service),
@@ -675,11 +678,7 @@ void SSLClientSocketOpenSSL::SetOmniboxSpeculation() {
}
bool SSLClientSocketOpenSSL::WasEverUsed() const {
- if (transport_.get() && transport_->socket())
- return transport_->socket()->WasEverUsed();
-
- NOTREACHED();
- return false;
+ return was_ever_used_;
}
bool SSLClientSocketOpenSSL::UsingTCPFastOpen() const {
@@ -750,6 +749,8 @@ int SSLClientSocketOpenSSL::Read(IOBuffer* buf,
if (rv == ERR_IO_PENDING) {
user_read_callback_ = callback;
} else {
+ if (rv > 0)
+ was_ever_used_ = true;
user_read_buf_ = NULL;
user_read_buf_len_ = 0;
}
@@ -768,6 +769,8 @@ int SSLClientSocketOpenSSL::Write(IOBuffer* buf,
if (rv == ERR_IO_PENDING) {
user_write_callback_ = callback;
} else {
+ if (rv > 0)
+ was_ever_used_ = true;
user_write_buf_ = NULL;
user_write_buf_len_ = 0;
}
@@ -907,6 +910,8 @@ bool SSLClientSocketOpenSSL::Init() {
void SSLClientSocketOpenSSL::DoReadCallback(int rv) {
// Since Run may result in Read being called, clear |user_read_callback_|
// up front.
+ if (rv > 0)
+ was_ever_used_ = true;
user_read_buf_ = NULL;
user_read_buf_len_ = 0;
base::ResetAndReturn(&user_read_callback_).Run(rv);
@@ -915,6 +920,8 @@ void SSLClientSocketOpenSSL::DoReadCallback(int rv) {
void SSLClientSocketOpenSSL::DoWriteCallback(int rv) {
// Since Run may result in Write being called, clear |user_write_callback_|
// up front.
+ if (rv > 0)
+ was_ever_used_ = true;
user_write_buf_ = NULL;
user_write_buf_len_ = 0;
base::ResetAndReturn(&user_write_callback_).Run(rv);
@@ -1414,7 +1421,7 @@ int SSLClientSocketOpenSSL::ClientCertRequestCallback(SSL* ssl,
DCHECK(ssl == ssl_);
DCHECK(*x509 == NULL);
DCHECK(*pkey == NULL);
-
+#if defined(USE_OPENSSL_CERTS)
if (!ssl_config_.send_client_cert) {
// First pass: we know that a client certificate is needed, but we do not
// have one at hand.
@@ -1451,6 +1458,10 @@ int SSLClientSocketOpenSSL::ClientCertRequestCallback(SSL* ssl,
}
LOG(WARNING) << "Client cert found without private key";
}
+#else // !defined(USE_OPENSSL_CERTS)
+ // OS handling of client certificates is not yet implemented.
+ NOTIMPLEMENTED();
+#endif // defined(USE_OPENSSL_CERTS)
// Send no client certificate.
return 0;
diff --git a/net/socket/ssl_client_socket_openssl.h b/net/socket/ssl_client_socket_openssl.h
index 8952fefb12..6187c72e9f 100644
--- a/net/socket/ssl_client_socket_openssl.h
+++ b/net/socket/ssl_client_socket_openssl.h
@@ -187,6 +187,10 @@ class SSLClientSocketOpenSSL : public SSLClientSocket {
CertVerifyResult server_cert_verify_result_;
bool completed_handshake_;
+ // Set when Read() or Write() successfully reads or writes data to or from the
+ // network.
+ bool was_ever_used_;
+
// Stores client authentication information between ClientAuthHandler and
// GetSSLCertRequestInfo calls.
bool client_auth_cert_needed_;
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc
index 20ba8967bf..0c6b33563a 100644
--- a/net/socket/ssl_client_socket_unittest.cc
+++ b/net/socket/ssl_client_socket_unittest.cc
@@ -2127,4 +2127,60 @@ TEST_F(SSLClientSocketTest, ConnectSignedCertTimestampsDisabled) {
EXPECT_FALSE(sock->IsConnected());
}
+// Tests that IsConnectedAndIdle and WasEverUsed behave as expected.
+TEST_F(SSLClientSocketTest, ReuseStates) {
+ SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
+ SpawnedTestServer::kLocalhost,
+ base::FilePath());
+ ASSERT_TRUE(test_server.Start());
+
+ AddressList addr;
+ ASSERT_TRUE(test_server.GetAddressList(&addr));
+
+ TestCompletionCallback callback;
+ scoped_ptr<StreamSocket> transport(
+ new TCPClientSocket(addr, NULL, NetLog::Source()));
+ int rv = transport->Connect(callback.callback());
+ if (rv == ERR_IO_PENDING)
+ rv = callback.WaitForResult();
+ EXPECT_EQ(OK, rv);
+
+ scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
+ transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+
+ rv = sock->Connect(callback.callback());
+ if (rv == ERR_IO_PENDING)
+ rv = callback.WaitForResult();
+ EXPECT_EQ(OK, rv);
+
+ // The socket was just connected. It should be idle because it is speaking
+ // HTTP. Although the transport has been used for the handshake, WasEverUsed()
+ // returns false.
+ EXPECT_TRUE(sock->IsConnected());
+ EXPECT_TRUE(sock->IsConnectedAndIdle());
+ EXPECT_FALSE(sock->WasEverUsed());
+
+ const char kRequestText[] = "GET / HTTP/1.0\r\n\r\n";
+ const size_t kRequestLen = arraysize(kRequestText) - 1;
+ scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kRequestLen));
+ memcpy(request_buffer->data(), kRequestText, kRequestLen);
+
+ rv = sock->Write(request_buffer.get(), kRequestLen, callback.callback());
+ EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
+
+ if (rv == ERR_IO_PENDING)
+ rv = callback.WaitForResult();
+ EXPECT_EQ(static_cast<int>(kRequestLen), rv);
+
+ // The socket has now been used.
+ EXPECT_TRUE(sock->WasEverUsed());
+
+ // TODO(davidben): Read one byte to ensure the test server has responded and
+ // then assert IsConnectedAndIdle is false. This currently doesn't work
+ // because neither SSLClientSocketNSS nor SSLClientSocketOpenSSL check their
+ // SSL implementation's internal buffers. Either call PR_Available and
+ // SSL_pending, although the former isn't actually implemented or perhaps
+ // attempt to read one byte extra.
+}
+
} // namespace net
diff --git a/net/socket/stream_listen_socket.cc b/net/socket/stream_listen_socket.cc
index e5232afdf8..d17ce75fec 100644
--- a/net/socket/stream_listen_socket.cc
+++ b/net/socket/stream_listen_socket.cc
@@ -96,7 +96,7 @@ int StreamListenSocket::GetLocalAddress(IPEndPoint* address) {
return MapSystemError(err);
}
if (!address->FromSockAddr(storage.addr, storage.addr_len))
- return ERR_FAILED;
+ return ERR_ADDRESS_INVALID;
return OK;
}
diff --git a/net/socket/stream_socket.h b/net/socket/stream_socket.h
index 38eec86dd9..72088103a3 100644
--- a/net/socket/stream_socket.h
+++ b/net/socket/stream_socket.h
@@ -70,9 +70,9 @@ class NET_EXPORT_PRIVATE StreamSocket : public Socket {
virtual void SetSubresourceSpeculation() = 0;
virtual void SetOmniboxSpeculation() = 0;
- // Returns true if the underlying transport socket ever had any reads or
- // writes. StreamSockets layered on top of transport sockets should forward
- // this call to the transport socket.
+ // Returns true if the socket ever had any reads or writes. StreamSockets
+ // layered on top of transport sockets should return if their own Read() or
+ // Write() methods had been called, not the underlying transport's.
virtual bool WasEverUsed() const = 0;
// Returns true if the underlying transport socket is using TCP FastOpen.
diff --git a/net/socket/tcp_socket_libevent.cc b/net/socket/tcp_socket_libevent.cc
index 94d289708c..a7022fd857 100644
--- a/net/socket/tcp_socket_libevent.cc
+++ b/net/socket/tcp_socket_libevent.cc
@@ -611,9 +611,9 @@ int TCPSocketLibevent::AcceptInternal(scoped_ptr<TCPSocketLibevent>* socket,
NOTREACHED();
if (IGNORE_EINTR(close(new_socket)) < 0)
PLOG(ERROR) << "close";
- net_log_.EndEventWithNetErrorCode(NetLog::TYPE_TCP_ACCEPT,
- ERR_ADDRESS_INVALID);
- return ERR_ADDRESS_INVALID;
+ int net_error = ERR_ADDRESS_INVALID;
+ net_log_.EndEventWithNetErrorCode(NetLog::TYPE_TCP_ACCEPT, net_error);
+ return net_error;
}
scoped_ptr<TCPSocketLibevent> tcp_socket(new TCPSocketLibevent(
net_log_.net_log(), net_log_.source()));
@@ -639,7 +639,7 @@ int TCPSocketLibevent::DoConnect() {
if (!use_tcp_fastopen_) {
SockaddrStorage storage;
if (!peer_address_->ToSockAddr(storage.addr, &storage.addr_len))
- return ERR_INVALID_ARGUMENT;
+ return ERR_ADDRESS_INVALID;
if (!HANDLE_EINTR(connect(socket_, storage.addr, storage.addr_len))) {
// Connected without waiting!
@@ -825,7 +825,9 @@ int TCPSocketLibevent::InternalWrite(IOBuffer* buf, int buf_len) {
if (use_tcp_fastopen_ && !tcp_fastopen_connected_) {
SockaddrStorage storage;
if (!peer_address_->ToSockAddr(storage.addr, &storage.addr_len)) {
- errno = EINVAL;
+ // Set errno to EADDRNOTAVAIL so that MapSystemError will map it to
+ // ERR_ADDRESS_INVALID later.
+ errno = EADDRNOTAVAIL;
return -1;
}
diff --git a/net/socket/tcp_socket_win.cc b/net/socket/tcp_socket_win.cc
index 5f8cd5c3e8..b777f21307 100644
--- a/net/socket/tcp_socket_win.cc
+++ b/net/socket/tcp_socket_win.cc
@@ -711,8 +711,9 @@ int TCPSocketWin::AcceptInternal(scoped_ptr<TCPSocketWin>* socket,
NOTREACHED();
if (closesocket(new_socket) < 0)
PLOG(ERROR) << "closesocket";
- net_log_.EndEventWithNetErrorCode(NetLog::TYPE_TCP_ACCEPT, ERR_FAILED);
- return ERR_FAILED;
+ int net_error = ERR_ADDRESS_INVALID;
+ net_log_.EndEventWithNetErrorCode(NetLog::TYPE_TCP_ACCEPT, net_error);
+ return net_error;
}
scoped_ptr<TCPSocketWin> tcp_socket(new TCPSocketWin(
net_log_.net_log(), net_log_.source()));
@@ -767,7 +768,7 @@ int TCPSocketWin::DoConnect() {
SockaddrStorage storage;
if (!peer_address_->ToSockAddr(storage.addr, &storage.addr_len))
- return ERR_INVALID_ARGUMENT;
+ return ERR_ADDRESS_INVALID;
if (!connect(socket_, storage.addr, storage.addr_len)) {
// Connected without waiting!
//
diff --git a/net/spdy/spdy_http_stream_unittest.cc b/net/spdy/spdy_http_stream_unittest.cc
index 5a5870365b..2142d586eb 100644
--- a/net/spdy/spdy_http_stream_unittest.cc
+++ b/net/spdy/spdy_http_stream_unittest.cc
@@ -8,6 +8,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop_proxy.h"
+#include "base/run_loop.h"
#include "base/stl_util.h"
#include "crypto/ec_private_key.h"
#include "crypto/ec_signature_creator.h"
@@ -149,6 +150,9 @@ TEST_P(SpdyHttpStreamTest, GetUploadProgressBeforeInitialization) {
UploadProgress progress = stream.GetUploadProgress();
EXPECT_EQ(0u, progress.size());
EXPECT_EQ(0u, progress.position());
+
+ // Pump the event loop so |reads| is consumed before the function returns.
+ base::RunLoop().RunUntilIdle();
}
TEST_P(SpdyHttpStreamTest, SendRequest) {
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index c20d89e4a0..5f0e285afc 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -532,7 +532,7 @@ SpdySession::~SpdySession() {
net_log_.EndEvent(NetLog::TYPE_SPDY_SESSION);
}
-Error SpdySession::InitializeWithSocket(
+void SpdySession::InitializeWithSocket(
scoped_ptr<ClientSocketHandle> connection,
SpdySessionPool* pool,
bool is_secure,
@@ -593,19 +593,17 @@ Error SpdySession::InitializeWithSocket(
NetLog::TYPE_SPDY_SESSION_INITIALIZED,
connection_->socket()->NetLog().source().ToEventParametersCallback());
- int error = DoReadLoop(READ_STATE_DO_READ, OK);
- if (error == ERR_IO_PENDING)
- error = OK;
- if (error == OK) {
- DCHECK_NE(availability_state_, STATE_CLOSED);
- connection_->AddHigherLayeredPool(this);
- if (enable_sending_initial_data_)
- SendInitialData();
- pool_ = pool;
- } else {
- DcheckClosed();
- }
- return static_cast<Error>(error);
+ DCHECK_NE(availability_state_, STATE_CLOSED);
+ connection_->AddHigherLayeredPool(this);
+ if (enable_sending_initial_data_)
+ SendInitialData();
+ pool_ = pool;
+
+ // Bootstrap the read loop.
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&SpdySession::PumpReadLoop,
+ weak_factory_.GetWeakPtr(), READ_STATE_DO_READ, OK));
}
bool SpdySession::VerifyDomainAuthentication(const std::string& domain) {
@@ -1554,9 +1552,8 @@ SpdySession::CloseSessionResult SpdySession::DoCloseSession(
UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySession.BytesRead.OtherErrors",
total_bytes_received_, 1, 100000000, 50);
- // |pool_| will be NULL when |InitializeWithSocket()| is in the
- // call stack.
- if (pool_ && availability_state_ != STATE_GOING_AWAY)
+ DCHECK(pool_);
+ if (availability_state_ != STATE_GOING_AWAY)
pool_->MakeSessionUnavailable(GetWeakPtr());
availability_state_ = STATE_CLOSED;
@@ -1628,10 +1625,8 @@ void SpdySession::CloseSessionOnError(Error err,
void SpdySession::MakeUnavailable() {
if (availability_state_ < STATE_GOING_AWAY) {
availability_state_ = STATE_GOING_AWAY;
- // |pool_| will be NULL when |InitializeWithSocket()| is in the
- // call stack.
- if (pool_)
- pool_->MakeSessionUnavailable(GetWeakPtr());
+ DCHECK(pool_);
+ pool_->MakeSessionUnavailable(GetWeakPtr());
}
}
@@ -1686,7 +1681,8 @@ base::Value* SpdySession::GetInfoAsValue() const {
}
bool SpdySession::IsReused() const {
- return buffered_spdy_framer_->frames_received() > 0;
+ return buffered_spdy_framer_->frames_received() > 0 ||
+ connection_->reuse_type() == ClientSocketHandle::UNUSED_IDLE;
}
bool SpdySession::GetLoadTimingInfo(SpdyStreamId stream_id,
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h
index cbb87bf8c6..203f1ef052 100644
--- a/net/spdy/spdy_session.h
+++ b/net/spdy/spdy_session.h
@@ -256,13 +256,13 @@ class NET_EXPORT SpdySession : public BufferedSpdyFramerVisitorInterface,
// |certificate_error_code| must either be OK or less than
// ERR_IO_PENDING.
//
- // Returns OK on success, or an error on failure. Never returns
- // ERR_IO_PENDING. If an error is returned, the session must be
- // destroyed immediately.
- Error InitializeWithSocket(scoped_ptr<ClientSocketHandle> connection,
- SpdySessionPool* pool,
- bool is_secure,
- int certificate_error_code);
+ // The session begins reading from |connection| on a subsequent event loop
+ // iteration, so the SpdySession may close immediately afterwards if the first
+ // read of |connection| fails.
+ void InitializeWithSocket(scoped_ptr<ClientSocketHandle> connection,
+ SpdySessionPool* pool,
+ bool is_secure,
+ int certificate_error_code);
// Returns the protocol used by this session. Always between
// kProtoSPDYMinimumVersion and kProtoSPDYMaximumVersion.
@@ -367,7 +367,8 @@ class NET_EXPORT SpdySession : public BufferedSpdyFramerVisitorInterface,
base::Value* GetInfoAsValue() const;
// Indicates whether the session is being reused after having successfully
- // used to send/receive data in the past.
+ // used to send/receive data in the past or if the underlying socket was idle
+ // before being used for a SPDY session.
bool IsReused() const;
// Returns true if the underlying transport socket ever had any reads or
@@ -617,8 +618,7 @@ class NET_EXPORT SpdySession : public BufferedSpdyFramerVisitorInterface,
// Advance the ReadState state machine. |expected_read_state| is the
// expected starting read state.
//
- // This function must always be called via PumpReadLoop() except for
- // from InitializeWithSocket().
+ // This function must always be called via PumpReadLoop().
int DoReadLoop(ReadState expected_read_state, int result);
// The implementations of the states of the ReadState state machine.
int DoRead();
diff --git a/net/spdy/spdy_session_pool.cc b/net/spdy/spdy_session_pool.cc
index 093db1eb9e..6ce0a937b3 100644
--- a/net/spdy/spdy_session_pool.cc
+++ b/net/spdy/spdy_session_pool.cc
@@ -77,12 +77,11 @@ SpdySessionPool::~SpdySessionPool() {
CertDatabase::GetInstance()->RemoveObserver(this);
}
-net::Error SpdySessionPool::CreateAvailableSessionFromSocket(
+base::WeakPtr<SpdySession> SpdySessionPool::CreateAvailableSessionFromSocket(
const SpdySessionKey& key,
scoped_ptr<ClientSocketHandle> connection,
const BoundNetLog& net_log,
int certificate_error_code,
- base::WeakPtr<SpdySession>* available_session,
bool is_secure) {
DCHECK_GE(default_protocol_, kProtoSPDYMinimumVersion);
DCHECK_LE(default_protocol_, kProtoSPDYMaximumVersion);
@@ -105,22 +104,16 @@ net::Error SpdySessionPool::CreateAvailableSessionFromSocket(
trusted_spdy_proxy_,
net_log.net_log()));
- Error error = new_session->InitializeWithSocket(
+ new_session->InitializeWithSocket(
connection.Pass(), this, is_secure, certificate_error_code);
- DCHECK_NE(error, ERR_IO_PENDING);
- if (error != OK) {
- available_session->reset();
- return error;
- }
-
- *available_session = new_session->GetWeakPtr();
+ base::WeakPtr<SpdySession> available_session = new_session->GetWeakPtr();
sessions_.insert(new_session.release());
- MapKeyToAvailableSession(key, *available_session);
+ MapKeyToAvailableSession(key, available_session);
net_log.AddEvent(
NetLog::TYPE_SPDY_SESSION_POOL_IMPORTED_SESSION_FROM_SOCKET,
- (*available_session)->net_log().source().ToEventParametersCallback());
+ available_session->net_log().source().ToEventParametersCallback());
// Look up the IP address for this session so that we can match
// future sessions (potentially to different domains) which can
@@ -129,11 +122,11 @@ net::Error SpdySessionPool::CreateAvailableSessionFromSocket(
// to see if this is a direct connection.
if (key.proxy_server().is_direct()) {
IPEndPoint address;
- if ((*available_session)->GetPeerAddress(&address) == OK)
+ if (available_session->GetPeerAddress(&address) == OK)
aliases_[address] = key;
}
- return error;
+ return available_session;
}
base::WeakPtr<SpdySession> SpdySessionPool::FindAvailableSession(
diff --git a/net/spdy/spdy_session_pool.h b/net/spdy/spdy_session_pool.h
index c44e9de51b..0fad5d2d46 100644
--- a/net/spdy/spdy_session_pool.h
+++ b/net/spdy/spdy_session_pool.h
@@ -79,15 +79,14 @@ class NET_EXPORT SpdySessionPool
// encountered when connecting the SSL socket, with OK meaning there
// was no error.
//
- // If successful, OK is returned and |available_session| will be
- // non-NULL and available. Otherwise, an error is returned and
- // |available_session| will be NULL.
- net::Error CreateAvailableSessionFromSocket(
+ // Returns the new SpdySession. Note that the SpdySession begins reading from
+ // |connection| on a subsequent event loop iteration, so it may be closed
+ // immediately afterwards if the first read of |connection| fails.
+ base::WeakPtr<SpdySession> CreateAvailableSessionFromSocket(
const SpdySessionKey& key,
scoped_ptr<ClientSocketHandle> connection,
const BoundNetLog& net_log,
int certificate_error_code,
- base::WeakPtr<SpdySession>* available_session,
bool is_secure);
// Find an available session for the given key, or NULL if there isn't one.
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc
index 0e8b3707e8..a5d9292741 100644
--- a/net/spdy/spdy_session_unittest.cc
+++ b/net/spdy/spdy_session_unittest.cc
@@ -190,8 +190,12 @@ INSTANTIATE_TEST_CASE_P(
TEST_P(SpdySessionTest, InitialReadError) {
CreateDeterministicNetworkSession();
- TryCreateFakeSpdySessionExpectingFailure(
+ base::WeakPtr<SpdySession> session = TryCreateFakeSpdySessionExpectingFailure(
spdy_session_pool_, key_, ERR_FAILED);
+ EXPECT_TRUE(session);
+ // Flush the read.
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(session);
}
namespace {
@@ -277,8 +281,6 @@ TEST_P(SpdySessionTest, PendingStreamCancellingAnother) {
session->CloseSessionOnError(ERR_ABORTED, "Aborting session");
EXPECT_EQ(ERR_ABORTED, callback1.WaitForResult());
-
- data.RunFor(1);
}
// A session receiving a GOAWAY frame with no active streams should
@@ -330,9 +332,12 @@ TEST_P(SpdySessionTest, GoAwayImmediatelyWithNoActiveStreams) {
data.StopAfter(1);
- TryCreateInsecureSpdySessionExpectingFailure(
- http_session_, key_, ERR_CONNECTION_CLOSED, BoundNetLog());
+ base::WeakPtr<SpdySession> session =
+ TryCreateInsecureSpdySessionExpectingFailure(
+ http_session_, key_, ERR_CONNECTION_CLOSED, BoundNetLog());
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(session);
EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_));
}
@@ -1045,8 +1050,6 @@ TEST_P(SpdySessionTest, FailedPing) {
EXPECT_TRUE(session == NULL);
EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_));
-
- data.RunFor(1);
EXPECT_EQ(NULL, spdy_stream1.get());
}
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc
index ce9ddd306e..3988905930 100644
--- a/net/spdy/spdy_stream.cc
+++ b/net/spdy/spdy_stream.cc
@@ -103,7 +103,8 @@ SpdyStream::SpdyStream(SpdyStreamType type,
net_log_(net_log),
raw_received_bytes_(0),
send_bytes_(0),
- recv_bytes_(0) {
+ recv_bytes_(0),
+ write_handler_guard_(false) {
CHECK(type_ == SPDY_BIDIRECTIONAL_STREAM ||
type_ == SPDY_REQUEST_RESPONSE_STREAM ||
type_ == SPDY_PUSH_STREAM);
@@ -112,6 +113,7 @@ SpdyStream::SpdyStream(SpdyStreamType type,
}
SpdyStream::~SpdyStream() {
+ CHECK(!write_handler_guard_);
UpdateHistograms();
}
@@ -457,7 +459,6 @@ void SpdyStream::OnDataReceived(scoped_ptr<SpdyBuffer> buffer) {
// PushedStreamReplayData().
if (io_state_ == STATE_HALF_CLOSED_LOCAL_UNCLAIMED) {
DCHECK_EQ(type_, SPDY_PUSH_STREAM);
- CHECK(!delegate_);
// It should be valid for this to happen in the server push case.
// We'll return received data when delegate gets attached to the stream.
if (buffer) {
@@ -545,12 +546,14 @@ void SpdyStream::OnFrameWriteComplete(SpdyFrameType frame_type,
CHECK(delegate_);
{
base::WeakPtr<SpdyStream> weak_this = GetWeakPtr();
+ write_handler_guard_ = true;
if (frame_type == SYN_STREAM) {
delegate_->OnRequestHeadersSent();
} else {
delegate_->OnDataSent();
}
CHECK(weak_this);
+ write_handler_guard_ = false;
}
if (io_state_ == STATE_CLOSED) {
diff --git a/net/spdy/spdy_stream.h b/net/spdy/spdy_stream.h
index a8cc7dcde3..4e3c61a143 100644
--- a/net/spdy/spdy_stream.h
+++ b/net/spdy/spdy_stream.h
@@ -557,6 +557,11 @@ class NET_EXPORT_PRIVATE SpdyStream {
std::string domain_bound_cert_;
ServerBoundCertService::RequestHandle domain_bound_cert_request_handle_;
+ // Guards calls of delegate write handlers ensuring |this| is not destroyed.
+ // TODO(jgraettinger): Consider removing after crbug.com/35511 is tracked
+ // down.
+ bool write_handler_guard_;
+
DISALLOW_COPY_AND_ASSIGN(SpdyStream);
};
diff --git a/net/spdy/spdy_test_util_common.cc b/net/spdy/spdy_test_util_common.cc
index 66a6f8c3fd..22ff5f6f09 100644
--- a/net/spdy/spdy_test_util_common.cc
+++ b/net/spdy/spdy_test_util_common.cc
@@ -540,15 +540,12 @@ base::WeakPtr<SpdySession> CreateSpdySessionHelper(
EXPECT_EQ(OK, rv);
- base::WeakPtr<SpdySession> spdy_session;
- EXPECT_EQ(
- expected_status,
+ base::WeakPtr<SpdySession> spdy_session =
http_session->spdy_session_pool()->CreateAvailableSessionFromSocket(
- key, connection.Pass(), net_log, OK, &spdy_session,
- is_secure));
- EXPECT_EQ(expected_status == OK, spdy_session != NULL);
- EXPECT_EQ(expected_status == OK,
- HasSpdySession(http_session->spdy_session_pool(), key));
+ key, connection.Pass(), net_log, OK, is_secure);
+ // Failure is reported asynchronously.
+ EXPECT_TRUE(spdy_session != NULL);
+ EXPECT_TRUE(HasSpdySession(http_session->spdy_session_pool(), key));
return spdy_session;
}
@@ -562,14 +559,14 @@ base::WeakPtr<SpdySession> CreateInsecureSpdySession(
OK, false /* is_secure */);
}
-void TryCreateInsecureSpdySessionExpectingFailure(
+base::WeakPtr<SpdySession> TryCreateInsecureSpdySessionExpectingFailure(
const scoped_refptr<HttpNetworkSession>& http_session,
const SpdySessionKey& key,
Error expected_error,
const BoundNetLog& net_log) {
DCHECK_LT(expected_error, ERR_IO_PENDING);
- CreateSpdySessionHelper(http_session, key, net_log,
- expected_error, false /* is_secure */);
+ return CreateSpdySessionHelper(http_session, key, net_log,
+ expected_error, false /* is_secure */);
}
base::WeakPtr<SpdySession> CreateSecureSpdySession(
@@ -643,17 +640,15 @@ base::WeakPtr<SpdySession> CreateFakeSpdySessionHelper(
Error expected_status) {
EXPECT_NE(expected_status, ERR_IO_PENDING);
EXPECT_FALSE(HasSpdySession(pool, key));
- base::WeakPtr<SpdySession> spdy_session;
scoped_ptr<ClientSocketHandle> handle(new ClientSocketHandle());
handle->SetSocket(scoped_ptr<StreamSocket>(new FakeSpdySessionClientSocket(
expected_status == OK ? ERR_IO_PENDING : expected_status)));
- EXPECT_EQ(
- expected_status,
+ base::WeakPtr<SpdySession> spdy_session =
pool->CreateAvailableSessionFromSocket(
- key, handle.Pass(), BoundNetLog(), OK, &spdy_session,
- true /* is_secure */));
- EXPECT_EQ(expected_status == OK, spdy_session != NULL);
- EXPECT_EQ(expected_status == OK, HasSpdySession(pool, key));
+ key, handle.Pass(), BoundNetLog(), OK, true /* is_secure */);
+ // Failure is reported asynchronously.
+ EXPECT_TRUE(spdy_session != NULL);
+ EXPECT_TRUE(HasSpdySession(pool, key));
return spdy_session;
}
@@ -664,11 +659,12 @@ base::WeakPtr<SpdySession> CreateFakeSpdySession(SpdySessionPool* pool,
return CreateFakeSpdySessionHelper(pool, key, OK);
}
-void TryCreateFakeSpdySessionExpectingFailure(SpdySessionPool* pool,
- const SpdySessionKey& key,
- Error expected_error) {
+base::WeakPtr<SpdySession> TryCreateFakeSpdySessionExpectingFailure(
+ SpdySessionPool* pool,
+ const SpdySessionKey& key,
+ Error expected_error) {
DCHECK_LT(expected_error, ERR_IO_PENDING);
- CreateFakeSpdySessionHelper(pool, key, expected_error);
+ return CreateFakeSpdySessionHelper(pool, key, expected_error);
}
SpdySessionPoolPeer::SpdySessionPoolPeer(SpdySessionPool* pool) : pool_(pool) {
diff --git a/net/spdy/spdy_test_util_common.h b/net/spdy/spdy_test_util_common.h
index 42b595b689..668a7e84dc 100644
--- a/net/spdy/spdy_test_util_common.h
+++ b/net/spdy/spdy_test_util_common.h
@@ -247,8 +247,9 @@ base::WeakPtr<SpdySession> CreateInsecureSpdySession(
// Tries to create a SPDY session for the given key but expects the
// attempt to fail with the given error. A SPDY session for |key| must
-// not already exist.
-void TryCreateInsecureSpdySessionExpectingFailure(
+// not already exist. The session will be created but close in the
+// next event loop iteration.
+base::WeakPtr<SpdySession> TryCreateInsecureSpdySessionExpectingFailure(
const scoped_refptr<HttpNetworkSession>& http_session,
const SpdySessionKey& key,
Error expected_error,
@@ -269,10 +270,12 @@ base::WeakPtr<SpdySession> CreateFakeSpdySession(SpdySessionPool* pool,
// Tries to create an insecure SPDY session for the given key but
// expects the attempt to fail with the given error. The session will
// neither receive nor send any data. A SPDY session for |key| must
-// not already exist.
-void TryCreateFakeSpdySessionExpectingFailure(SpdySessionPool* pool,
- const SpdySessionKey& key,
- Error expected_error);
+// not already exist. The session will be created but close in the
+// next event loop iteration.
+base::WeakPtr<SpdySession> TryCreateFakeSpdySessionExpectingFailure(
+ SpdySessionPool* pool,
+ const SpdySessionKey& key,
+ Error expected_error);
class SpdySessionPoolPeer {
public:
diff --git a/net/ssl/server_bound_cert_service_unittest.cc b/net/ssl/server_bound_cert_service_unittest.cc
index 4df003913a..2be073bb16 100644
--- a/net/ssl/server_bound_cert_service_unittest.cc
+++ b/net/ssl/server_bound_cert_service_unittest.cc
@@ -24,7 +24,6 @@ namespace net {
namespace {
-#if !defined(USE_OPENSSL)
void FailTest(int /* result */) {
FAIL();
}
@@ -117,8 +116,6 @@ MockServerBoundCertStoreWithAsyncGet::CallGetServerBoundCertCallbackWithResult(
cert));
}
-#endif // !defined(USE_OPENSSL)
-
class ServerBoundCertServiceTest : public testing::Test {
public:
ServerBoundCertServiceTest()
@@ -150,9 +147,6 @@ TEST_F(ServerBoundCertServiceTest, GetDomainForHost) {
ServerBoundCertService::GetDomainForHost("127.0.0.1"));
}
-// See http://crbug.com/91512 - implement OpenSSL version of CreateSelfSigned.
-#if !defined(USE_OPENSSL)
-
TEST_F(ServerBoundCertServiceTest, GetCacheMiss) {
std::string host("encrypted.google.com");
@@ -775,8 +769,6 @@ TEST_F(ServerBoundCertServiceTest, AsyncStoreGetThenCreateNoCertsInStore) {
EXPECT_FALSE(request_handle2.is_active());
}
-#endif // !defined(USE_OPENSSL)
-
} // namespace
} // namespace net
diff --git a/net/ssl/ssl_config.cc b/net/ssl/ssl_config.cc
new file mode 100644
index 0000000000..02829918ed
--- /dev/null
+++ b/net/ssl/ssl_config.cc
@@ -0,0 +1,69 @@
+// Copyright 2014 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/ssl/ssl_config.h"
+
+#if defined(USE_OPENSSL)
+#include <openssl/ssl.h>
+#endif
+
+namespace net {
+
+const uint16 kDefaultSSLVersionMin = SSL_PROTOCOL_VERSION_SSL3;
+
+const uint16 kDefaultSSLVersionMax =
+#if defined(USE_OPENSSL)
+#if defined(SSL_OP_NO_TLSv1_2)
+ SSL_PROTOCOL_VERSION_TLS1_2;
+#elif defined(SSL_OP_NO_TLSv1_1)
+ SSL_PROTOCOL_VERSION_TLS1_1;
+#else
+ SSL_PROTOCOL_VERSION_TLS1;
+#endif
+#else
+ SSL_PROTOCOL_VERSION_TLS1_2;
+#endif
+
+SSLConfig::CertAndStatus::CertAndStatus() : cert_status(0) {}
+
+SSLConfig::CertAndStatus::~CertAndStatus() {}
+
+SSLConfig::SSLConfig()
+ : rev_checking_enabled(false),
+ rev_checking_required_local_anchors(false),
+ version_min(kDefaultSSLVersionMin),
+ version_max(kDefaultSSLVersionMax),
+ channel_id_enabled(true),
+ false_start_enabled(true),
+ signed_cert_timestamps_enabled(true),
+ require_forward_secrecy(false),
+ send_client_cert(false),
+ verify_ev_cert(false),
+ version_fallback(false),
+ cert_io_enabled(true) {
+}
+
+SSLConfig::~SSLConfig() {}
+
+bool SSLConfig::IsAllowedBadCert(X509Certificate* cert,
+ CertStatus* cert_status) const {
+ std::string der_cert;
+ if (!X509Certificate::GetDEREncoded(cert->os_cert_handle(), &der_cert))
+ return false;
+ return IsAllowedBadCert(der_cert, cert_status);
+}
+
+bool SSLConfig::IsAllowedBadCert(const base::StringPiece& der_cert,
+ CertStatus* cert_status) const {
+ for (size_t i = 0; i < allowed_bad_certs.size(); ++i) {
+ if (der_cert == allowed_bad_certs[i].der_cert) {
+ if (cert_status)
+ *cert_status = allowed_bad_certs[i].cert_status;
+ return true;
+ }
+ }
+ return false;
+}
+
+} // namespace net
diff --git a/net/ssl/ssl_config.h b/net/ssl/ssl_config.h
new file mode 100644
index 0000000000..27312147f0
--- /dev/null
+++ b/net/ssl/ssl_config.h
@@ -0,0 +1,156 @@
+// Copyright 2014 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.
+
+#ifndef NET_SSL_SSL_CONFIG_H_
+#define NET_SSL_SSL_CONFIG_H_
+
+#include "base/basictypes.h"
+#include "base/memory/ref_counted.h"
+#include "net/base/net_export.h"
+#include "net/cert/x509_certificate.h"
+
+namespace net {
+
+// Various TLS/SSL ProtocolVersion values encoded as uint16
+// struct {
+// uint8 major;
+// uint8 minor;
+// } ProtocolVersion;
+// The most significant byte is |major|, and the least significant byte
+// is |minor|.
+enum {
+ SSL_PROTOCOL_VERSION_SSL3 = 0x0300,
+ SSL_PROTOCOL_VERSION_TLS1 = 0x0301,
+ SSL_PROTOCOL_VERSION_TLS1_1 = 0x0302,
+ SSL_PROTOCOL_VERSION_TLS1_2 = 0x0303,
+};
+
+// Default minimum protocol version.
+NET_EXPORT extern const uint16 kDefaultSSLVersionMin;
+
+// Default maximum protocol version.
+NET_EXPORT extern const uint16 kDefaultSSLVersionMax;
+
+// A collection of SSL-related configuration settings.
+struct NET_EXPORT SSLConfig {
+ // Default to revocation checking.
+ // Default to SSL 3.0 ~ default_version_max() on.
+ SSLConfig();
+ ~SSLConfig();
+
+ // Returns true if |cert| is one of the certs in |allowed_bad_certs|.
+ // The expected cert status is written to |cert_status|. |*cert_status| can
+ // be NULL if user doesn't care about the cert status.
+ bool IsAllowedBadCert(X509Certificate* cert, CertStatus* cert_status) const;
+
+ // Same as above except works with DER encoded certificates instead
+ // of X509Certificate.
+ bool IsAllowedBadCert(const base::StringPiece& der_cert,
+ CertStatus* cert_status) const;
+
+ // rev_checking_enabled is true if online certificate revocation checking is
+ // enabled (i.e. OCSP and CRL fetching).
+ //
+ // Regardless of this flag, CRLSet checking is always enabled and locally
+ // cached revocation information will be considered.
+ bool rev_checking_enabled;
+
+ // rev_checking_required_local_anchors is true if revocation checking is
+ // required to succeed when certificates chain to local trust anchors (that
+ // is, non-public CAs). If revocation information cannot be obtained, such
+ // certificates will be treated as revoked ("hard-fail").
+ // Note: This is distinct from rev_checking_enabled. If true, it is
+ // equivalent to also setting rev_checking_enabled, but only when the
+ // certificate chain chains to a local (non-public) trust anchor.
+ bool rev_checking_required_local_anchors;
+
+ // The minimum and maximum protocol versions that are enabled.
+ // SSL 3.0 is 0x0300, TLS 1.0 is 0x0301, TLS 1.1 is 0x0302, and so on.
+ // (Use the SSL_PROTOCOL_VERSION_xxx enumerators defined above.)
+ // SSL 2.0 is not supported. If version_max < version_min, it means no
+ // protocol versions are enabled.
+ uint16 version_min;
+ uint16 version_max;
+
+ // Presorted list of cipher suites which should be explicitly prevented from
+ // being used in addition to those disabled by the net built-in policy.
+ //
+ // By default, all cipher suites supported by the underlying SSL
+ // implementation will be enabled except for:
+ // - Null encryption cipher suites.
+ // - Weak cipher suites: < 80 bits of security strength.
+ // - FORTEZZA cipher suites (obsolete).
+ // - IDEA cipher suites (RFC 5469 explains why).
+ // - Anonymous cipher suites.
+ // - ECDSA cipher suites on platforms that do not support ECDSA signed
+ // certificates, as servers may use the presence of such ciphersuites as a
+ // hint to send an ECDSA certificate.
+ // The ciphers listed in |disabled_cipher_suites| will be removed in addition
+ // to the above list.
+ //
+ // Though cipher suites are sent in TLS as "uint8 CipherSuite[2]", in
+ // big-endian form, they should be declared in host byte order, with the
+ // first uint8 occupying the most significant byte.
+ // Ex: To disable TLS_RSA_WITH_RC4_128_MD5, specify 0x0004, while to
+ // disable TLS_ECDH_ECDSA_WITH_RC4_128_SHA, specify 0xC002.
+ std::vector<uint16> disabled_cipher_suites;
+
+ bool channel_id_enabled; // True if TLS channel ID extension is enabled.
+ bool false_start_enabled; // True if we'll use TLS False Start.
+ // True if the Certificate Transparency signed_certificate_timestamp
+ // TLS extension is enabled.
+ bool signed_cert_timestamps_enabled;
+
+ // require_forward_secrecy, if true, causes only (EC)DHE cipher suites to be
+ // enabled. NOTE: this only applies to server sockets currently, although
+ // that could be extended if needed.
+ bool require_forward_secrecy;
+
+ // TODO(wtc): move the following members to a new SSLParams structure. They
+ // are not SSL configuration settings.
+
+ struct NET_EXPORT CertAndStatus {
+ CertAndStatus();
+ ~CertAndStatus();
+
+ std::string der_cert;
+ CertStatus cert_status;
+ };
+
+ // Add any known-bad SSL certificate (with its cert status) to
+ // |allowed_bad_certs| that should not trigger an ERR_CERT_* error when
+ // calling SSLClientSocket::Connect. This would normally be done in
+ // response to the user explicitly accepting the bad certificate.
+ std::vector<CertAndStatus> allowed_bad_certs;
+
+ // True if we should send client_cert to the server.
+ bool send_client_cert;
+
+ bool verify_ev_cert; // True if we should verify the certificate for EV.
+
+ bool version_fallback; // True if we are falling back to an older protocol
+ // version (one still needs to decrement
+ // version_max).
+
+ // If cert_io_enabled is false, then certificate verification will not
+ // result in additional HTTP requests. (For example: to fetch missing
+ // intermediates or to perform OCSP/CRL fetches.) It also implies that online
+ // revocation checking is disabled.
+ // NOTE: Only used by NSS.
+ bool cert_io_enabled;
+
+ // The list of application level protocols supported. If set, this will
+ // enable Next Protocol Negotiation (if supported). The order of the
+ // protocols doesn't matter expect for one case: if the server supports Next
+ // Protocol Negotiation, but there is no overlap between the server's and
+ // client's protocol sets, then the first protocol in this list will be
+ // requested by the client.
+ std::vector<std::string> next_protos;
+
+ scoped_refptr<X509Certificate> client_cert;
+};
+
+} // namespace net
+
+#endif // NET_SSL_SSL_CONFIG_H_
diff --git a/net/ssl/ssl_config_service.cc b/net/ssl/ssl_config_service.cc
index ec9fcc3eb3..cd2a00dc6d 100644
--- a/net/ssl/ssl_config_service.cc
+++ b/net/ssl/ssl_config_service.cc
@@ -5,75 +5,11 @@
#include "net/ssl/ssl_config_service.h"
#include "base/lazy_instance.h"
-#include "base/memory/ref_counted.h"
#include "base/synchronization/lock.h"
-#include "net/cert/crl_set.h"
#include "net/ssl/ssl_config_service_defaults.h"
-#if defined(USE_OPENSSL)
-#include <openssl/ssl.h>
-#endif
-
namespace net {
-static uint16 g_default_version_min = SSL_PROTOCOL_VERSION_SSL3;
-
-static uint16 g_default_version_max =
-#if defined(USE_OPENSSL)
-#if defined(SSL_OP_NO_TLSv1_2)
- SSL_PROTOCOL_VERSION_TLS1_2;
-#elif defined(SSL_OP_NO_TLSv1_1)
- SSL_PROTOCOL_VERSION_TLS1_1;
-#else
- SSL_PROTOCOL_VERSION_TLS1;
-#endif
-#else
- SSL_PROTOCOL_VERSION_TLS1_2;
-#endif
-
-SSLConfig::CertAndStatus::CertAndStatus() : cert_status(0) {}
-
-SSLConfig::CertAndStatus::~CertAndStatus() {}
-
-SSLConfig::SSLConfig()
- : rev_checking_enabled(false),
- rev_checking_required_local_anchors(false),
- version_min(g_default_version_min),
- version_max(g_default_version_max),
- channel_id_enabled(true),
- false_start_enabled(true),
- signed_cert_timestamps_enabled(true),
- require_forward_secrecy(false),
- unrestricted_ssl3_fallback_enabled(false),
- send_client_cert(false),
- verify_ev_cert(false),
- version_fallback(false),
- cert_io_enabled(true) {
-}
-
-SSLConfig::~SSLConfig() {
-}
-
-bool SSLConfig::IsAllowedBadCert(X509Certificate* cert,
- CertStatus* cert_status) const {
- std::string der_cert;
- if (!X509Certificate::GetDEREncoded(cert->os_cert_handle(), &der_cert))
- return false;
- return IsAllowedBadCert(der_cert, cert_status);
-}
-
-bool SSLConfig::IsAllowedBadCert(const base::StringPiece& der_cert,
- CertStatus* cert_status) const {
- for (size_t i = 0; i < allowed_bad_certs.size(); ++i) {
- if (der_cert == allowed_bad_certs[i].der_cert) {
- if (cert_status)
- *cert_status = allowed_bad_certs[i].cert_status;
- return true;
- }
- }
- return false;
-}
-
SSLConfigService::SSLConfigService()
: observer_list_(ObserverList<Observer>::NOTIFY_EXISTING_ONLY) {
}
@@ -111,16 +47,6 @@ scoped_refptr<CRLSet> SSLConfigService::GetCRLSet() {
return g_crl_set.Get().Get();
}
-// static
-uint16 SSLConfigService::default_version_min() {
- return g_default_version_min;
-}
-
-// static
-uint16 SSLConfigService::default_version_max() {
- return g_default_version_max;
-}
-
void SSLConfigService::AddObserver(Observer* observer) {
observer_list_.AddObserver(observer);
}
@@ -149,9 +75,7 @@ void SSLConfigService::ProcessConfigUpdate(const SSLConfig& orig_config,
(orig_config.channel_id_enabled != new_config.channel_id_enabled) ||
(orig_config.false_start_enabled != new_config.false_start_enabled) ||
(orig_config.require_forward_secrecy !=
- new_config.require_forward_secrecy) ||
- (orig_config.unrestricted_ssl3_fallback_enabled !=
- new_config.unrestricted_ssl3_fallback_enabled);
+ new_config.require_forward_secrecy);
if (config_changed)
NotifySSLConfigChange();
diff --git a/net/ssl/ssl_config_service.h b/net/ssl/ssl_config_service.h
index 08a59fd274..d6547223ea 100644
--- a/net/ssl/ssl_config_service.h
+++ b/net/ssl/ssl_config_service.h
@@ -7,157 +7,14 @@
#include <vector>
-#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/observer_list.h"
-#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
-#include "net/cert/cert_status_flags.h"
#include "net/cert/crl_set.h"
-#include "net/cert/x509_certificate.h"
+#include "net/ssl/ssl_config.h"
namespace net {
-// Various TLS/SSL ProtocolVersion values encoded as uint16
-// struct {
-// uint8 major;
-// uint8 minor;
-// } ProtocolVersion;
-// The most significant byte is |major|, and the least significant byte
-// is |minor|.
-enum {
- SSL_PROTOCOL_VERSION_SSL3 = 0x0300,
- SSL_PROTOCOL_VERSION_TLS1 = 0x0301,
- SSL_PROTOCOL_VERSION_TLS1_1 = 0x0302,
- SSL_PROTOCOL_VERSION_TLS1_2 = 0x0303,
-};
-
-// A collection of SSL-related configuration settings.
-struct NET_EXPORT SSLConfig {
- // Default to revocation checking.
- // Default to SSL 3.0 ~ default_version_max() on.
- SSLConfig();
- ~SSLConfig();
-
- // Returns true if |cert| is one of the certs in |allowed_bad_certs|.
- // The expected cert status is written to |cert_status|. |*cert_status| can
- // be NULL if user doesn't care about the cert status.
- bool IsAllowedBadCert(X509Certificate* cert, CertStatus* cert_status) const;
-
- // Same as above except works with DER encoded certificates instead
- // of X509Certificate.
- bool IsAllowedBadCert(const base::StringPiece& der_cert,
- CertStatus* cert_status) const;
-
- // rev_checking_enabled is true if online certificate revocation checking is
- // enabled (i.e. OCSP and CRL fetching).
- //
- // Regardless of this flag, CRLSet checking is always enabled and locally
- // cached revocation information will be considered.
- bool rev_checking_enabled;
-
- // rev_checking_required_local_anchors is true if revocation checking is
- // required to succeed when certificates chain to local trust anchors (that
- // is, non-public CAs). If revocation information cannot be obtained, such
- // certificates will be treated as revoked ("hard-fail").
- // Note: This is distinct from rev_checking_enabled. If true, it is
- // equivalent to also setting rev_checking_enabled, but only when the
- // certificate chain chains to a local (non-public) trust anchor.
- bool rev_checking_required_local_anchors;
-
- // The minimum and maximum protocol versions that are enabled.
- // SSL 3.0 is 0x0300, TLS 1.0 is 0x0301, TLS 1.1 is 0x0302, and so on.
- // (Use the SSL_PROTOCOL_VERSION_xxx enumerators defined above.)
- // SSL 2.0 is not supported. If version_max < version_min, it means no
- // protocol versions are enabled.
- uint16 version_min;
- uint16 version_max;
-
- // Presorted list of cipher suites which should be explicitly prevented from
- // being used in addition to those disabled by the net built-in policy.
- //
- // By default, all cipher suites supported by the underlying SSL
- // implementation will be enabled except for:
- // - Null encryption cipher suites.
- // - Weak cipher suites: < 80 bits of security strength.
- // - FORTEZZA cipher suites (obsolete).
- // - IDEA cipher suites (RFC 5469 explains why).
- // - Anonymous cipher suites.
- // - ECDSA cipher suites on platforms that do not support ECDSA signed
- // certificates, as servers may use the presence of such ciphersuites as a
- // hint to send an ECDSA certificate.
- // The ciphers listed in |disabled_cipher_suites| will be removed in addition
- // to the above list.
- //
- // Though cipher suites are sent in TLS as "uint8 CipherSuite[2]", in
- // big-endian form, they should be declared in host byte order, with the
- // first uint8 occupying the most significant byte.
- // Ex: To disable TLS_RSA_WITH_RC4_128_MD5, specify 0x0004, while to
- // disable TLS_ECDH_ECDSA_WITH_RC4_128_SHA, specify 0xC002.
- std::vector<uint16> disabled_cipher_suites;
-
- bool channel_id_enabled; // True if TLS channel ID extension is enabled.
- bool false_start_enabled; // True if we'll use TLS False Start.
- // True if the Certificate Transparency signed_certificate_timestamp
- // TLS extension is enabled.
- bool signed_cert_timestamps_enabled;
-
- // require_forward_secrecy, if true, causes only (EC)DHE cipher suites to be
- // enabled. NOTE: this only applies to server sockets currently, although
- // that could be extended if needed.
- bool require_forward_secrecy;
-
- // If |unrestricted_ssl3_fallback_enabled| is true, SSL 3.0 fallback will be
- // enabled for all sites.
- // If |unrestricted_ssl3_fallback_enabled| is false, SSL 3.0 fallback will be
- // disabled for a site pinned to the Google pin list (indicating that it is a
- // Google site).
- bool unrestricted_ssl3_fallback_enabled;
-
- // TODO(wtc): move the following members to a new SSLParams structure. They
- // are not SSL configuration settings.
-
- struct NET_EXPORT CertAndStatus {
- CertAndStatus();
- ~CertAndStatus();
-
- std::string der_cert;
- CertStatus cert_status;
- };
-
- // Add any known-bad SSL certificate (with its cert status) to
- // |allowed_bad_certs| that should not trigger an ERR_CERT_* error when
- // calling SSLClientSocket::Connect. This would normally be done in
- // response to the user explicitly accepting the bad certificate.
- std::vector<CertAndStatus> allowed_bad_certs;
-
- // True if we should send client_cert to the server.
- bool send_client_cert;
-
- bool verify_ev_cert; // True if we should verify the certificate for EV.
-
- bool version_fallback; // True if we are falling back to an older protocol
- // version (one still needs to decrement
- // version_max).
-
- // If cert_io_enabled is false, then certificate verification will not
- // result in additional HTTP requests. (For example: to fetch missing
- // intermediates or to perform OCSP/CRL fetches.) It also implies that online
- // revocation checking is disabled.
- // NOTE: Only used by NSS.
- bool cert_io_enabled;
-
- // The list of application level protocols supported. If set, this will
- // enable Next Protocol Negotiation (if supported). The order of the
- // protocols doesn't matter expect for one case: if the server supports Next
- // Protocol Negotiation, but there is no overlap between the server's and
- // client's protocol sets, then the first protocol in this list will be
- // requested by the client.
- std::vector<std::string> next_protos;
-
- scoped_refptr<X509Certificate> client_cert;
-};
-
// The interface for retrieving the SSL configuration. This interface
// does not cover setting the SSL configuration, as on some systems, the
// SSLConfigService objects may not have direct access to the configuration, or
@@ -193,12 +50,6 @@ class NET_EXPORT SSLConfigService
static void SetCRLSet(scoped_refptr<CRLSet> crl_set);
static scoped_refptr<CRLSet> GetCRLSet();
- // Gets the default minimum protocol version.
- static uint16 default_version_min();
-
- // Gets the default maximum protocol version.
- static uint16 default_version_max();
-
// Is SNI available in this configuration?
static bool IsSNIAvailable(SSLConfigService* service);
diff --git a/net/ssl/ssl_config_service_unittest.cc b/net/ssl/ssl_config_service_unittest.cc
index 42c8ae47b9..e8a4c33394 100644
--- a/net/ssl/ssl_config_service_unittest.cc
+++ b/net/ssl/ssl_config_service_unittest.cc
@@ -69,7 +69,6 @@ TEST(SSLConfigServiceTest, ConfigUpdatesNotifyObservers) {
SSLConfig initial_config;
initial_config.rev_checking_enabled = true;
initial_config.false_start_enabled = false;
- initial_config.unrestricted_ssl3_fallback_enabled = false;
initial_config.version_min = SSL_PROTOCOL_VERSION_SSL3;
initial_config.version_max = SSL_PROTOCOL_VERSION_TLS1_1;
@@ -87,10 +86,6 @@ TEST(SSLConfigServiceTest, ConfigUpdatesNotifyObservers) {
EXPECT_CALL(observer, OnSSLConfigChanged()).Times(1);
mock_service->SetSSLConfig(initial_config);
- initial_config.unrestricted_ssl3_fallback_enabled = true;
- EXPECT_CALL(observer, OnSSLConfigChanged()).Times(1);
- mock_service->SetSSLConfig(initial_config);
-
// Test that changing the SSL version range triggers updates.
initial_config.version_min = SSL_PROTOCOL_VERSION_TLS1;
EXPECT_CALL(observer, OnSSLConfigChanged()).Times(1);
diff --git a/net/test/embedded_test_server/embedded_test_server.cc b/net/test/embedded_test_server/embedded_test_server.cc
index b60cea4463..75b46e2216 100644
--- a/net/test/embedded_test_server/embedded_test_server.cc
+++ b/net/test/embedded_test_server/embedded_test_server.cc
@@ -20,7 +20,6 @@
#include "net/test/embedded_test_server/http_connection.h"
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
-#include "net/tools/fetch/http_listen_socket.h"
namespace net {
namespace test_server {
diff --git a/net/tools/dump_cache/dump_files.cc b/net/tools/dump_cache/dump_files.cc
index 607877803b..796f205e81 100644
--- a/net/tools/dump_cache/dump_files.cc
+++ b/net/tools/dump_cache/dump_files.cc
@@ -14,10 +14,10 @@
#include <string>
#include "base/file_util.h"
+#include "base/files/file.h"
#include "base/files/file_enumerator.h"
#include "base/format_macros.h"
#include "base/message_loop/message_loop.h"
-#include "net/base/file_stream.h"
#include "net/disk_cache/blockfile/block_files.h"
#include "net/disk_cache/blockfile/disk_format.h"
#include "net/disk_cache/blockfile/mapped_file.h"
@@ -31,14 +31,13 @@ const base::FilePath::CharType kIndexName[] = FILE_PATH_LITERAL("index");
// Reads the |header_size| bytes from the beginning of file |name|.
bool ReadHeader(const base::FilePath& name, char* header, int header_size) {
- net::FileStream file(NULL);
- file.OpenSync(name, base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ);
- if (!file.IsOpen()) {
+ base::File file(name, base::File::FLAG_OPEN | base::File::FLAG_READ);
+ if (!file.IsValid()) {
printf("Unable to open file %s\n", name.MaybeAsASCII().c_str());
return false;
}
- int read = file.ReadSync(header, header_size);
+ int read = file.Read(0, header, header_size);
if (read != header_size) {
printf("Unable to read file %s\n", name.MaybeAsASCII().c_str());
return false;
diff --git a/net/tools/fetch/fetch_client.cc b/net/tools/fetch/fetch_client.cc
deleted file mode 100644
index 830622c946..0000000000
--- a/net/tools/fetch/fetch_client.cc
+++ /dev/null
@@ -1,225 +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 "base/at_exit.h"
-#include "base/command_line.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/metrics/stats_counters.h"
-#include "base/strings/string_number_conversions.h"
-#include "build/build_config.h"
-#include "net/url_request/url_fetcher.h"
-#include "net/url_request/url_fetcher_delegate.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_builder.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "url/gurl.h"
-
-#if defined(OS_LINUX) || defined(OS_ANDROID)
-#include "net/proxy/proxy_config.h"
-#include "net/proxy/proxy_config_service_fixed.h"
-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
-
-using net::URLFetcher;
-using net::URLFetcherDelegate;
-using net::URLRequestContextGetter;
-
-void usage(const char* program_name) {
- printf("usage: %s --url=<url> [--n=<clients>] [--stats] [--use_cache] "
- "[--v]\n",
- program_name);
- exit(1);
-}
-
-// Test Driver
-class Driver {
- public:
- Driver()
- : clients_(0) {}
-
- void ClientStarted() { clients_++; }
- void ClientStopped() {
- if (!--clients_) {
- base::MessageLoop::current()->Quit();
- }
- }
-
- private:
- int clients_;
-};
-
-scoped_ptr<net::URLRequestContext>
-BuildURLRequestContext(bool use_cache) {
- net::URLRequestContextBuilder builder;
- builder.set_file_enabled(true);
- builder.set_data_enabled(true);
- builder.set_ftp_enabled(true);
-#if defined(OS_LINUX) || defined(OS_ANDROID)
- // TODO(wtc): Remove this once http://crbug.com/146421 is fixed.
- builder.set_proxy_config_service(
- new net::ProxyConfigServiceFixed(net::ProxyConfig::CreateDirect()));
-#endif // defined(OS_LINUX) || defined(OS_ANDROID)
- if (!use_cache)
- builder.DisableHttpCache();
- scoped_ptr<net::URLRequestContext> context(builder.Build());
- return context.Pass();
-}
-
-// Builds a URLRequestContext assuming there's only a single message loop.
-class SingleThreadRequestContextGetter : public net::URLRequestContextGetter {
- public:
- // Since there's only a single thread, there's no need to worry
- // about when |context_| gets created.
- SingleThreadRequestContextGetter(
- bool use_cache,
- const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner)
- : context_(BuildURLRequestContext(use_cache)),
- main_task_runner_(main_task_runner) {}
-
- virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE {
- return context_.get();
- }
-
- virtual scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
- const OVERRIDE {
- return main_task_runner_;
- }
-
- private:
- virtual ~SingleThreadRequestContextGetter() {}
-
- const scoped_ptr<net::URLRequestContext> context_;
- const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-};
-
-static base::LazyInstance<Driver> g_driver = LAZY_INSTANCE_INITIALIZER;
-
-// A network client
-class Client : public URLFetcherDelegate {
- public:
- Client(const std::string& url,
- URLRequestContextGetter* getter) :
- url_(url), getter_(getter), last_current_(0) {
- }
-
- void Start() {
- fetcher_.reset(net::URLFetcher::Create(
- url_, net::URLFetcher::GET, this));
- if (!fetcher_.get())
- return;
- g_driver.Get().ClientStarted();
- fetcher_->SetRequestContext(getter_);
- fetcher_->Start();
- };
-
- private:
-
- // URLFetcherDelegate overrides.
- virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE {
- base::StatsCounter requests("FetchClient.requests");
- requests.Increment();
- g_driver.Get().ClientStopped();
- printf(".");
- }
-
- virtual void OnURLFetchDownloadProgress(const URLFetcher* source,
- int64 current, int64 total) OVERRIDE {
- base::StatsCounter bytes_read("FetchClient.bytes_read");
- DCHECK(current >= last_current_);
- int64 delta = current - last_current_;
- bytes_read.Add(delta);
- last_current_ = current;
- }
-
- virtual void OnURLFetchUploadProgress(const URLFetcher* source,
- int64 current, int64 total) OVERRIDE {
- CHECK(false);
- }
-
- GURL url_;
- scoped_ptr<URLFetcher> fetcher_;
- URLRequestContextGetter* getter_;
- int64 last_current_;
-};
-
-int main(int argc, char** argv) {
- base::AtExitManager exit;
- base::StatsTable table("fetchclient", 50, 1000);
- table.set_current(&table);
-
- CommandLine::Init(argc, argv);
- const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
- std::string url = parsed_command_line.GetSwitchValueASCII("url");
- if (!url.length())
- usage(argv[0]);
- int client_limit = 1;
- if (parsed_command_line.HasSwitch("n")) {
- base::StringToInt(parsed_command_line.GetSwitchValueASCII("n"),
- &client_limit);
- }
- bool use_cache = parsed_command_line.HasSwitch("use-cache");
- if (parsed_command_line.HasSwitch("v")) {
- logging::SetMinLogLevel(-10);
- }
-
- // Do work here.
- base::MessageLoopForIO loop;
-
- scoped_refptr<SingleThreadRequestContextGetter> context_getter(
- new SingleThreadRequestContextGetter(use_cache,
- loop.message_loop_proxy()));
-
- {
- base::StatsCounterTimer driver_time("FetchClient.total_time");
- base::StatsScope<base::StatsCounterTimer> scope(driver_time);
-
- Client** clients = new Client*[client_limit];
- for (int i = 0; i < client_limit; i++) {
- clients[i] = new Client(url, context_getter);
- clients[i]->Start();
- }
-
- base::MessageLoop::current()->Run();
- }
-
- // Print Statistics here.
- int num_clients = table.GetCounterValue("c:FetchClient.requests");
- int test_time = table.GetCounterValue("t:FetchClient.total_time");
- int bytes_read = table.GetCounterValue("c:FetchClient.bytes_read");
-
- printf("\n");
- printf("Clients : %d\n", num_clients);
- printf("Time : %dms\n", test_time);
- printf("Bytes Read : %d\n", bytes_read);
- if (test_time > 0) {
- const char *units = "bps";
- double bps = static_cast<float>(bytes_read * 8) /
- (static_cast<float>(test_time) / 1000.0);
-
- if (bps > (1024*1024)) {
- bps /= (1024*1024);
- units = "Mbps";
- } else if (bps > 1024) {
- bps /= 1024;
- units = "Kbps";
- }
- printf("Bandwidth : %.2f%s\n", bps, units);
- }
-
- if (parsed_command_line.HasSwitch("stats")) {
- // Dump the stats table.
- printf("<stats>\n");
- int counter_max = table.GetMaxCounters();
- for (int index = 0; index < counter_max; index++) {
- std::string name(table.GetRowName(index));
- if (name.length() > 0) {
- int value = table.GetRowValue(index);
- printf("%s:\t%d\n", name.c_str(), value);
- }
- }
- printf("</stats>\n");
- }
- return 0;
-}
diff --git a/net/tools/fetch/fetch_server.cc b/net/tools/fetch/fetch_server.cc
deleted file mode 100644
index a2ffc5b570..0000000000
--- a/net/tools/fetch/fetch_server.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2011 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 "base/at_exit.h"
-#include "base/command_line.h"
-#include "base/memory/singleton.h"
-#include "base/message_loop/message_loop.h"
-#include "base/metrics/stats_counters.h"
-#include "net/base/completion_callback.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "net/base/winsock_init.h"
-#include "net/http/http_network_layer.h"
-#include "net/http/http_request_info.h"
-#include "net/http/http_transaction.h"
-#include "net/proxy/proxy_service.h"
-#include "net/tools/fetch/http_server.h"
-
-void usage(const char* program_name) {
- printf("usage: %s\n", program_name);
- exit(-1);
-}
-
-int main(int argc, char**argv) {
- base::AtExitManager exit;
- base::StatsTable table("fetchserver", 50, 1000);
- table.set_current(&table);
-
-#if defined(OS_WIN)
- net::EnsureWinsockInit();
-#endif // defined(OS_WIN)
-
- CommandLine::Init(0, NULL);
- const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
-
- // Do work here.
- base::MessageLoop loop;
- HttpServer server(std::string(),
- 80); // TODO(mbelshe): make port configurable
- base::MessageLoop::current()->Run();
-
- if (parsed_command_line.HasSwitch("stats")) {
- // Dump the stats table.
- printf("<stats>\n");
- int counter_max = table.GetMaxCounters();
- for (int index=0; index < counter_max; index++) {
- std::string name(table.GetRowName(index));
- if (name.length() > 0) {
- int value = table.GetRowValue(index);
- printf("%s:\t%d\n", name.c_str(), value);
- }
- }
- printf("</stats>\n");
- }
-
-}
diff --git a/net/tools/fetch/http_listen_socket.cc b/net/tools/fetch/http_listen_socket.cc
deleted file mode 100644
index 410a0ba55e..0000000000
--- a/net/tools/fetch/http_listen_socket.cc
+++ /dev/null
@@ -1,249 +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/tools/fetch/http_listen_socket.h"
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/stl_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "net/tools/fetch/http_server_request_info.h"
-#include "net/tools/fetch/http_server_response_info.h"
-
-HttpListenSocket::HttpListenSocket(net::SocketDescriptor s,
- HttpListenSocket::Delegate* delegate)
- : net::TCPListenSocket(s, this),
- delegate_(delegate) {
-}
-
-HttpListenSocket::~HttpListenSocket() {
- STLDeleteElements(&connections_);
-}
-
-void HttpListenSocket::Accept() {
- net::SocketDescriptor conn = net::TCPListenSocket::AcceptSocket();
- DCHECK_NE(conn, net::kInvalidSocket);
- if (conn == net::kInvalidSocket) {
- // TODO
- } else {
- scoped_ptr<StreamListenSocket> sock(
- new HttpListenSocket(conn, delegate_));
- DidAccept(this, sock.Pass());
- }
-}
-
-// static
-scoped_ptr<HttpListenSocket> HttpListenSocket::CreateAndListen(
- const std::string& ip,
- int port,
- HttpListenSocket::Delegate* delegate) {
- net::SocketDescriptor s = net::TCPListenSocket::CreateAndBind(ip, port);
- if (s == net::kInvalidSocket) {
- // TODO (ibrar): error handling.
- } else {
- scoped_ptr<HttpListenSocket> serv(new HttpListenSocket(s, delegate));
- serv->Listen();
- return serv.Pass();
- }
- return scoped_ptr<HttpListenSocket>();
-}
-
-//
-// HTTP Request Parser
-// This HTTP request parser uses a simple state machine to quickly parse
-// through the headers. The parser is not 100% complete, as it is designed
-// for use in this simple test driver.
-//
-// Known issues:
-// - does not handle whitespace on first HTTP line correctly. Expects
-// a single space between the method/url and url/protocol.
-
-// Input character types.
-enum header_parse_inputs {
- INPUT_SPACE,
- INPUT_CR,
- INPUT_LF,
- INPUT_COLON,
- INPUT_DEFAULT,
- MAX_INPUTS
-};
-
-// Parser states.
-enum header_parse_states {
- ST_METHOD, // Receiving the method.
- ST_URL, // Receiving the URL.
- ST_PROTO, // Receiving the protocol.
- ST_HEADER, // Starting a Request Header.
- ST_NAME, // Receiving a request header name.
- ST_SEPARATOR, // Receiving the separator between header name and value.
- ST_VALUE, // Receiving a request header value.
- ST_DONE, // Parsing is complete and successful.
- ST_ERR, // Parsing encountered invalid syntax.
- MAX_STATES
-};
-
-// State transition table.
-int parser_state[MAX_STATES][MAX_INPUTS] = {
-/* METHOD */ { ST_URL, ST_ERR, ST_ERR, ST_ERR, ST_METHOD },
-/* URL */ { ST_PROTO, ST_ERR, ST_ERR, ST_URL, ST_URL },
-/* PROTOCOL */ { ST_ERR, ST_HEADER, ST_NAME, ST_ERR, ST_PROTO },
-/* HEADER */ { ST_ERR, ST_ERR, ST_NAME, ST_ERR, ST_ERR },
-/* NAME */ { ST_SEPARATOR, ST_DONE, ST_ERR, ST_SEPARATOR, ST_NAME },
-/* SEPARATOR */ { ST_SEPARATOR, ST_ERR, ST_ERR, ST_SEPARATOR, ST_VALUE },
-/* VALUE */ { ST_VALUE, ST_HEADER, ST_NAME, ST_VALUE, ST_VALUE },
-/* DONE */ { ST_DONE, ST_DONE, ST_DONE, ST_DONE, ST_DONE },
-/* ERR */ { ST_ERR, ST_ERR, ST_ERR, ST_ERR, ST_ERR }
-};
-
-// Convert an input character to the parser's input token.
-int charToInput(char ch) {
- switch(ch) {
- case ' ':
- return INPUT_SPACE;
- case '\r':
- return INPUT_CR;
- case '\n':
- return INPUT_LF;
- case ':':
- return INPUT_COLON;
- }
- return INPUT_DEFAULT;
-}
-
-HttpServerRequestInfo* HttpListenSocket::ParseHeaders() {
- int pos = 0;
- int data_len = recv_data_.length();
- int state = ST_METHOD;
- HttpServerRequestInfo* info = new HttpServerRequestInfo();
- std::string buffer;
- std::string header_name;
- std::string header_value;
- while (pos < data_len) {
- char ch = recv_data_[pos++];
- int input = charToInput(ch);
- int next_state = parser_state[state][input];
-
- bool transition = (next_state != state);
- if (transition) {
- // Do any actions based on state transitions.
- switch (state) {
- case ST_METHOD:
- info->method = buffer;
- buffer.clear();
- break;
- case ST_URL:
- info->url = GURL(buffer);
- buffer.clear();
- break;
- case ST_PROTO:
- // TODO(mbelshe): Deal better with parsing protocol.
- DCHECK(buffer == "HTTP/1.1");
- buffer.clear();
- break;
- case ST_NAME:
- header_name = buffer;
- buffer.clear();
- break;
- case ST_VALUE:
- header_value = buffer;
- // TODO(mbelshe): Deal better with duplicate headers.
- DCHECK(info->headers.find(header_name) == info->headers.end());
- info->headers[header_name] = header_value;
- buffer.clear();
- break;
- }
- state = next_state;
- } else {
- // Do any actions based on current state.
- switch (state) {
- case ST_METHOD:
- case ST_URL:
- case ST_PROTO:
- case ST_VALUE:
- case ST_NAME:
- buffer.append(&ch, 1);
- break;
- case ST_DONE:
- recv_data_ = recv_data_.substr(pos);
- return info;
- case ST_ERR:
- delete info;
- return NULL;
- }
- }
- }
- // No more characters, but we haven't finished parsing yet.
- delete info;
- return NULL;
-}
-
-void HttpListenSocket::DidAccept(
- net::StreamListenSocket* server,
- scoped_ptr<net::StreamListenSocket> connection) {
- connections_.insert(connection.release());
-}
-
-void HttpListenSocket::DidRead(net::StreamListenSocket* connection,
- const char* data,
- int len) {
- recv_data_.append(data, len);
- while (recv_data_.length()) {
- HttpServerRequestInfo* request = ParseHeaders();
- if (!request)
- break;
- delegate_->OnRequest(this, request);
- delete request;
- }
-}
-
-void HttpListenSocket::DidClose(net::StreamListenSocket* sock) {
- size_t count = connections_.erase(sock);
- DCHECK_EQ(1u, count);
- delete sock;
-}
-
-// Convert the numeric status code to a string.
-// e.g. 200 -> "200 OK".
-std::string ServerStatus(int code) {
- switch(code) {
- case 200:
- return std::string("200 OK");
- // TODO(mbelshe): handle other codes.
- }
- NOTREACHED();
- return std::string();
-}
-
-void HttpListenSocket::Respond(HttpServerResponseInfo* info,
- std::string& data) {
- std::string response;
-
- // Status line.
- response = info->protocol + " ";
- response += ServerStatus(info->status);
- response += "\r\n";
-
- // Standard headers.
- if (info->content_type.length())
- response += "Content-type: " + info->content_type + "\r\n";
-
- if (info->content_length > 0)
- response += "Content-length: " + base::IntToString(info->content_length) +
- "\r\n";
-
- if (info->connection_close)
- response += "Connection: close\r\n";
-
- // TODO(mbelshe): support additional headers.
-
- // End of headers.
- response += "\r\n";
-
- // Add data.
- response += data;
-
- // Write it all out.
- this->Send(response, false);
-}
diff --git a/net/tools/fetch/http_listen_socket.h b/net/tools/fetch/http_listen_socket.h
deleted file mode 100644
index e0a58c03e2..0000000000
--- a/net/tools/fetch/http_listen_socket.h
+++ /dev/null
@@ -1,70 +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.
-
-#ifndef NET_BASE_TOOLS_HTTP_LISTEN_SOCKET_H_
-#define NET_BASE_TOOLS_HTTP_LISTEN_SOCKET_H_
-
-#include <set>
-
-#include "base/message_loop/message_loop.h"
-#include "net/socket/stream_listen_socket.h"
-#include "net/socket/tcp_listen_socket.h"
-
-class HttpServerRequestInfo;
-class HttpServerResponseInfo;
-
-// Implements a simple HTTP listen socket on top of the raw socket interface.
-class HttpListenSocket : public net::TCPListenSocket,
- public net::StreamListenSocket::Delegate {
- public:
- class Delegate {
- public:
- virtual void OnRequest(HttpListenSocket* connection,
- HttpServerRequestInfo* info) = 0;
-
- protected:
- virtual ~Delegate() {}
- };
-
- virtual ~HttpListenSocket();
-
- static scoped_ptr<HttpListenSocket> CreateAndListen(
- const std::string& ip, int port, HttpListenSocket::Delegate* delegate);
-
- // Send a server response.
- // TODO(mbelshe): make this capable of non-ascii data.
- void Respond(HttpServerResponseInfo* info, std::string& data);
-
- // StreamListenSocket::Delegate.
- virtual void DidAccept(
- net::StreamListenSocket* server,
- scoped_ptr<net::StreamListenSocket> connection) OVERRIDE;
- virtual void DidRead(net::StreamListenSocket* connection,
- const char* data, int len) OVERRIDE;
- virtual void DidClose(net::StreamListenSocket* sock) OVERRIDE;
-
- protected:
- // Overrides TCPListenSocket::Accept().
- virtual void Accept() OVERRIDE;
-
- private:
- static const int kReadBufSize = 16 * 1024;
-
- // Must run in the IO thread.
- HttpListenSocket(net::SocketDescriptor s, HttpListenSocket::Delegate* del);
-
- // Expects the raw data to be stored in recv_data_. If parsing is successful,
- // will remove the data parsed from recv_data_, leaving only the unused
- // recv data.
- HttpServerRequestInfo* ParseHeaders();
-
- HttpListenSocket::Delegate* const delegate_;
- std::string recv_data_;
-
- std::set<StreamListenSocket*> connections_;
-
- DISALLOW_COPY_AND_ASSIGN(HttpListenSocket);
-};
-
-#endif // NET_BASE_TOOLS_HTTP_LISTEN_SOCKET_H_
diff --git a/net/tools/fetch/http_server.cc b/net/tools/fetch/http_server.cc
deleted file mode 100644
index 71afb67bc3..0000000000
--- a/net/tools/fetch/http_server.cc
+++ /dev/null
@@ -1,12 +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/tools/fetch/http_server.h"
-
-HttpServer::HttpServer(std::string ip, int port)
- : session_(new HttpSession(ip, port)) {
-}
-
-HttpServer::~HttpServer() {
-}
diff --git a/net/tools/fetch/http_server.h b/net/tools/fetch/http_server.h
deleted file mode 100644
index 691413078e..0000000000
--- a/net/tools/fetch/http_server.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2011 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.
-
-#ifndef NET_BASE_TOOLS_HTTP_SERVER_H_
-#define NET_BASE_TOOLS_HTTP_SERVER_H_
-
-#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
-#include "net/tools/fetch/http_session.h"
-
-// Implements a simple, single-threaded HttpServer.
-// Right now, this class implements no functionality above and beyond
-// the HttpSession.
-class HttpServer {
-public:
- HttpServer(std::string ip, int port);
- ~HttpServer();
-
-private:
- scoped_ptr<HttpSession> session_;
- DISALLOW_COPY_AND_ASSIGN(HttpServer);
-};
-
-#endif // NET_BASE_TOOLS_HTTP_SERVER_H_
-
diff --git a/net/tools/fetch/http_server_request_info.cc b/net/tools/fetch/http_server_request_info.cc
deleted file mode 100644
index 52b6860e0a..0000000000
--- a/net/tools/fetch/http_server_request_info.cc
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2011 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/tools/fetch/http_server_request_info.h"
-
-HttpServerRequestInfo::HttpServerRequestInfo()
- : net::HttpRequestInfo() {
-}
-
-HttpServerRequestInfo::~HttpServerRequestInfo() {}
diff --git a/net/tools/fetch/http_server_request_info.h b/net/tools/fetch/http_server_request_info.h
deleted file mode 100644
index 9b0fae18d1..0000000000
--- a/net/tools/fetch/http_server_request_info.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2011 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.
-
-#ifndef NET_BASE_TOOLS_HTTP_SERVER_REQUEST_INFO_H_
-#define NET_BASE_TOOLS_HTTP_SERVER_REQUEST_INFO_H_
-
-#include <map>
-#include <string>
-
-#include "net/http/http_request_info.h"
-
-// Meta information about an HTTP request.
-// This is geared toward servers in that it keeps a map of the headers and
-// values rather than just a list of header strings (which net::HttpRequestInfo
-// does).
-class HttpServerRequestInfo : public net::HttpRequestInfo {
- public:
- HttpServerRequestInfo();
- virtual ~HttpServerRequestInfo();
-
- // A map of the names -> values for HTTP headers.
- std::map<std::string, std::string> headers;
-};
-
-#endif // NET_BASE_TOOLS_HTTP_SERVER_REQUEST_INFO_H_
diff --git a/net/tools/fetch/http_server_response_info.cc b/net/tools/fetch/http_server_response_info.cc
deleted file mode 100644
index d9ca02a6d0..0000000000
--- a/net/tools/fetch/http_server_response_info.cc
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2011 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/tools/fetch/http_server_response_info.h"
-
-HttpServerResponseInfo::HttpServerResponseInfo()
- : status(200), content_length(0), connection_close(false) {
-}
-
-HttpServerResponseInfo::~HttpServerResponseInfo() {}
diff --git a/net/tools/fetch/http_server_response_info.h b/net/tools/fetch/http_server_response_info.h
deleted file mode 100644
index e01f7300d9..0000000000
--- a/net/tools/fetch/http_server_response_info.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2011 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.
-
-#ifndef NET_HTTP_HTTP_RESPONSE_INFO_H_
-#define NET_HTTP_HTTP_RESPONSE_INFO_H_
-
-#include <map>
-#include <string>
-
-// Meta information about a server response.
-class HttpServerResponseInfo {
- public:
- HttpServerResponseInfo();
- ~HttpServerResponseInfo();
-
- // The response protocol.
- std::string protocol;
-
- // The status code.
- int status;
-
- // The server identifier.
- std::string server_name;
-
- // The content type.
- std::string content_type;
-
- // The content length.
- int content_length;
-
- // Should we close the connection.
- bool connection_close;
-
- // Additional response headers.
- std::map<std::string, std::string> headers;
-};
-
-#endif // NET_HTTP_HTTP_RESPONSE_INFO_H_
diff --git a/net/tools/fetch/http_session.cc b/net/tools/fetch/http_session.cc
deleted file mode 100644
index d9e991b798..0000000000
--- a/net/tools/fetch/http_session.cc
+++ /dev/null
@@ -1,33 +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/tools/fetch/http_session.h"
-#include "net/tools/fetch/http_server_response_info.h"
-
-HttpSession::HttpSession(const std::string& ip, int port)
- : socket_(HttpListenSocket::CreateAndListen(ip, port, this)) {
-}
-
-HttpSession::~HttpSession() {
-}
-
-void HttpSession::OnRequest(HttpListenSocket* connection,
- HttpServerRequestInfo* info) {
- // TODO(mbelshe): Make this function more interesting.
-
- // Generate a 10KB sequence of data.
- CR_DEFINE_STATIC_LOCAL(std::string, data, ());
- if (data.length() == 0) {
- while (data.length() < (10 * 1024))
- data += 'a' + (rand() % 26);
- }
-
- HttpServerResponseInfo response_info;
- response_info.protocol = "HTTP/1.1";
- response_info.status = 200;
- response_info.content_type = "text/plain";
- response_info.content_length = data.length();
-
- connection->Respond(&response_info, data);
-}
diff --git a/net/tools/fetch/http_session.h b/net/tools/fetch/http_session.h
deleted file mode 100644
index b0266f2a9f..0000000000
--- a/net/tools/fetch/http_session.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2011 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.
-
-#ifndef NET_BASE_TOOLS_HTTP_SESSION_H_
-#define NET_BASE_TOOLS_HTTP_SESSION_H_
-
-#include "base/basictypes.h"
-#include "net/http/http_request_info.h"
-#include "net/tools/fetch/http_listen_socket.h"
-
-// An HttpSession encapsulates a server-side HTTP listen socket.
-class HttpSession : HttpListenSocket::Delegate {
- public:
- HttpSession(const std::string& ip, int port);
- virtual ~HttpSession();
-
- virtual void OnRequest(HttpListenSocket* connection,
- HttpServerRequestInfo* info) OVERRIDE;
-
- private:
- scoped_ptr<HttpListenSocket> socket_;
- DISALLOW_COPY_AND_ASSIGN(HttpSession);
-};
-
-#endif // NET_BASE_TOOLS_HTTP_SESSION_H_
-
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc
index 7014babe8a..dcba71aefb 100644
--- a/net/tools/quic/end_to_end_test.cc
+++ b/net/tools/quic/end_to_end_test.cc
@@ -156,7 +156,8 @@ class EndToEndTest : public ::testing::TestWithParam<TestParams> {
CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip));
uint port = 0;
server_address_ = IPEndPoint(ip, port);
- server_key_ = QuicSessionKey("example.com", port, false);
+ server_key_ = QuicSessionKey("example.com", port, false,
+ kPrivacyModeDisabled);
client_supported_versions_ = GetParam().client_supported_versions;
server_supported_versions_ = GetParam().server_supported_versions;
@@ -225,8 +226,8 @@ class EndToEndTest : public ::testing::TestWithParam<TestParams> {
server_thread_->Initialize();
server_address_ = IPEndPoint(server_address_.address(),
server_thread_->GetPort());
- server_key_ = QuicSessionKey(server_key_.host(),
- server_thread_->GetPort(), false);
+ server_key_ = QuicSessionKey(server_key_.host(), server_thread_->GetPort(),
+ false, kPrivacyModeDisabled);
QuicDispatcher* dispatcher =
QuicServerPeer::GetDispatcher(server_thread_->server());
diff --git a/net/tools/quic/quic_client_bin.cc b/net/tools/quic/quic_client_bin.cc
index db2de1462c..8f4ad50298 100644
--- a/net/tools/quic/quic_client_bin.cc
+++ b/net/tools/quic/quic_client_bin.cc
@@ -17,6 +17,7 @@
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "net/base/ip_endpoint.h"
+#include "net/base/privacy_mode.h"
#include "net/quic/quic_protocol.h"
#include "net/tools/quic/quic_client.h"
@@ -73,7 +74,8 @@ int main(int argc, char *argv[]) {
// TODO(rjshade): Set version on command line.
net::tools::QuicClient client(
net::IPEndPoint(addr, FLAGS_port),
- net::QuicSessionKey(FLAGS_hostname, FLAGS_port, FLAGS_secure),
+ net::QuicSessionKey(FLAGS_hostname, FLAGS_port, FLAGS_secure,
+ net::kPrivacyModeDisabled),
net::QuicSupportedVersions(), true);
client.Initialize();
diff --git a/net/tools/quic/quic_client_session.cc b/net/tools/quic/quic_client_session.cc
index 54f46e36cb..29b178a5c1 100644
--- a/net/tools/quic/quic_client_session.cc
+++ b/net/tools/quic/quic_client_session.cc
@@ -19,13 +19,21 @@ QuicClientSession::QuicClientSession(
const QuicConfig& config,
QuicConnection* connection,
QuicCryptoClientConfig* crypto_config)
- : QuicSession(connection, config),
+ : QuicClientSessionBase(connection, config),
crypto_stream_(server_key, this, NULL, crypto_config) {
}
QuicClientSession::~QuicClientSession() {
}
+void QuicClientSession::OnProofValid(
+ const QuicCryptoClientConfig::CachedState& /*cached*/) {
+}
+
+void QuicClientSession::OnProofVerifyDetailsAvailable(
+ const ProofVerifyDetails& /*verify_details*/) {
+}
+
QuicSpdyClientStream* QuicClientSession::CreateOutgoingDataStream() {
if (!crypto_stream_.encryption_established()) {
DVLOG(1) << "Encryption not active so no outgoing stream created.";
diff --git a/net/tools/quic/quic_client_session.h b/net/tools/quic/quic_client_session.h
index f3bce29039..6f7a1ba6df 100644
--- a/net/tools/quic/quic_client_session.h
+++ b/net/tools/quic/quic_client_session.h
@@ -10,9 +10,9 @@
#include <string>
#include "base/basictypes.h"
+#include "net/quic/quic_client_session_base.h"
#include "net/quic/quic_crypto_client_stream.h"
#include "net/quic/quic_protocol.h"
-#include "net/quic/quic_session.h"
#include "net/tools/quic/quic_spdy_client_stream.h"
namespace net {
@@ -23,7 +23,7 @@ class ReliableQuicStream;
namespace tools {
-class QuicClientSession : public QuicSession {
+class QuicClientSession : public QuicClientSessionBase {
public:
QuicClientSession(const QuicSessionKey& server_key,
const QuicConfig& config,
@@ -31,6 +31,12 @@ class QuicClientSession : public QuicSession {
QuicCryptoClientConfig* crypto_config);
virtual ~QuicClientSession();
+ // QuicClientSessionBase methods:
+ virtual void OnProofValid(
+ const QuicCryptoClientConfig::CachedState& cached) OVERRIDE;
+ virtual void OnProofVerifyDetailsAvailable(
+ const ProofVerifyDetails& verify_details) OVERRIDE;
+
// QuicSession methods:
virtual QuicSpdyClientStream* CreateOutgoingDataStream() OVERRIDE;
virtual QuicCryptoClientStream* GetCryptoStream() OVERRIDE;
diff --git a/net/tools/quic/quic_client_session_test.cc b/net/tools/quic/quic_client_session_test.cc
index a0b49d4df5..57992cd24e 100644
--- a/net/tools/quic/quic_client_session_test.cc
+++ b/net/tools/quic/quic_client_session_test.cc
@@ -35,7 +35,7 @@ class ToolsQuicClientSessionTest
SupportedVersions(GetParam()))) {
crypto_config_.SetDefaults();
session_.reset(new QuicClientSession(
- QuicSessionKey(kServerHostname, kPort, false),
+ QuicSessionKey(kServerHostname, kPort, false, kPrivacyModeDisabled),
DefaultQuicConfig(), connection_, &crypto_config_));
session_->config()->SetDefaults();
}
diff --git a/net/tools/quic/quic_spdy_client_stream_test.cc b/net/tools/quic/quic_spdy_client_stream_test.cc
index 40105dd25e..5dd10d009c 100644
--- a/net/tools/quic/quic_spdy_client_stream_test.cc
+++ b/net/tools/quic/quic_spdy_client_stream_test.cc
@@ -30,7 +30,8 @@ class QuicSpdyClientStreamTest : public TestWithParam<QuicVersion> {
QuicSpdyClientStreamTest()
: connection_(new StrictMock<MockConnection>(
false, SupportedVersions(GetParam()))),
- session_(QuicSessionKey("example.com", 80, false), DefaultQuicConfig(),
+ session_(QuicSessionKey("example.com", 80, false, kPrivacyModeDisabled),
+ DefaultQuicConfig(),
connection_, &crypto_config_),
body_("hello world") {
crypto_config_.SetDefaults();
diff --git a/net/tools/quic/test_tools/quic_test_client.cc b/net/tools/quic/test_tools/quic_test_client.cc
index d88d836f83..7413202717 100644
--- a/net/tools/quic/test_tools/quic_test_client.cc
+++ b/net/tools/quic/test_tools/quic_test_client.cc
@@ -39,6 +39,7 @@ class RecordingProofVerifier : public ProofVerifier {
const string& server_config,
const vector<string>& certs,
const string& signature,
+ const net::ProofVerifyContext* context,
string* error_details,
scoped_ptr<ProofVerifyDetails>* details,
ProofVerifierCallback* callback) OVERRIDE {
@@ -214,7 +215,7 @@ ssize_t QuicTestClient::SendMessage(const HTTPMessage& message) {
if (!url.host().empty()) {
client_->set_server_key(
QuicSessionKey(url.host(), url.EffectiveIntPort(),
- url.SchemeIs("https") ? true : false));
+ url.SchemeIs("https"), kPrivacyModeDisabled));
}
}
diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py
index 0a1f59b0c5..13aafcd538 100755
--- a/net/tools/testserver/testserver.py
+++ b/net/tools/testserver/testserver.py
@@ -27,6 +27,7 @@ import re
import select
import socket
import SocketServer
+import ssl
import struct
import sys
import threading
@@ -51,7 +52,10 @@ import tlslite.api
# Insert at the beginning of the path, we want this to be used
# unconditionally.
sys.path.insert(0, os.path.join(ROOT_DIR, 'third_party', 'pywebsocket', 'src'))
+import mod_pywebsocket.standalone
from mod_pywebsocket.standalone import WebSocketServer
+# import manually
+mod_pywebsocket.standalone.ssl = ssl
SERVER_HTTP = 0
SERVER_FTP = 1
@@ -84,6 +88,7 @@ class WebSocketOptions:
self.certificate = None
self.tls_client_auth = False
self.tls_client_ca = None
+ self.tls_module = 'ssl'
self.use_basic_auth = False
diff --git a/net/udp/udp_socket_libevent.cc b/net/udp/udp_socket_libevent.cc
index 9c8215ca74..564627631a 100644
--- a/net/udp/udp_socket_libevent.cc
+++ b/net/udp/udp_socket_libevent.cc
@@ -128,7 +128,7 @@ int UDPSocketLibevent::GetPeerAddress(IPEndPoint* address) const {
return MapSystemError(errno);
scoped_ptr<IPEndPoint> address(new IPEndPoint());
if (!address->FromSockAddr(storage.addr, storage.addr_len))
- return ERR_FAILED;
+ return ERR_ADDRESS_INVALID;
remote_address_.reset(address.release());
}
@@ -148,7 +148,7 @@ int UDPSocketLibevent::GetLocalAddress(IPEndPoint* address) const {
return MapSystemError(errno);
scoped_ptr<IPEndPoint> address(new IPEndPoint());
if (!address->FromSockAddr(storage.addr, storage.addr_len))
- return ERR_FAILED;
+ return ERR_ADDRESS_INVALID;
local_address_.reset(address.release());
net_log_.AddEvent(NetLog::TYPE_UDP_LOCAL_ADDRESS,
CreateNetLogUDPConnectCallback(local_address_.get()));
@@ -476,7 +476,7 @@ int UDPSocketLibevent::InternalRecvFrom(IOBuffer* buf, int buf_len,
if (bytes_transferred >= 0) {
result = bytes_transferred;
if (address && !address->FromSockAddr(storage.addr, storage.addr_len))
- result = ERR_FAILED;
+ result = ERR_ADDRESS_INVALID;
} else {
result = MapSystemError(errno);
}
@@ -494,7 +494,7 @@ int UDPSocketLibevent::InternalSendTo(IOBuffer* buf, int buf_len,
storage.addr_len = 0;
} else {
if (!address->ToSockAddr(storage.addr, &storage.addr_len)) {
- int result = ERR_FAILED;
+ int result = ERR_ADDRESS_INVALID;
LogWrite(result, NULL, NULL);
return result;
}
diff --git a/net/udp/udp_socket_win.cc b/net/udp/udp_socket_win.cc
index beaf400db0..78f51c9723 100644
--- a/net/udp/udp_socket_win.cc
+++ b/net/udp/udp_socket_win.cc
@@ -390,18 +390,42 @@ int UDPSocketWin::CreateSocket(int addr_family) {
bool UDPSocketWin::SetReceiveBufferSize(int32 size) {
DCHECK(CalledOnValidThread());
- int rv = setsockopt(socket_, SOL_SOCKET, SO_RCVBUF,
- reinterpret_cast<const char*>(&size), sizeof(size));
- DCHECK(!rv) << "Could not set socket receive buffer size: " << errno;
- return rv == 0;
+ setsockopt(socket_, SOL_SOCKET, SO_RCVBUF,
+ reinterpret_cast<const char*>(&size), sizeof(size));
+ // If the setsockopt fails, but the buffer is big enough, we will return
+ // success. It is not worth testing the return value as we still need to check
+ // via getsockopt anyway according to Windows documentation.
+ int32 actual_size = 0;
+ int option_size = sizeof(actual_size);
+ int rv = getsockopt(socket_, SOL_SOCKET, SO_RCVBUF,
+ reinterpret_cast<char*>(&actual_size), &option_size);
+ if (rv != 0)
+ return false;
+ if (actual_size < size) {
+ UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SocketReceiveBufferUnchangeable",
+ actual_size, 1000, 1000000, 50);
+ }
+ return actual_size >= size;
}
bool UDPSocketWin::SetSendBufferSize(int32 size) {
DCHECK(CalledOnValidThread());
- int rv = setsockopt(socket_, SOL_SOCKET, SO_SNDBUF,
- reinterpret_cast<const char*>(&size), sizeof(size));
- DCHECK(!rv) << "Could not set socket send buffer size: " << errno;
- return rv == 0;
+ setsockopt(socket_, SOL_SOCKET, SO_SNDBUF,
+ reinterpret_cast<const char*>(&size), sizeof(size));
+ // If the setsockopt fails, but the buffer is big enough, we will return
+ // success. It is not worth testing the return value as we still need to check
+ // via getsockopt anyway according to Windows documentation.
+ int32 actual_size = 0;
+ int option_size = sizeof(actual_size);
+ int rv = getsockopt(socket_, SOL_SOCKET, SO_SNDBUF,
+ reinterpret_cast<char*>(&actual_size), &option_size);
+ if (rv != 0)
+ return false;
+ if (actual_size < size) {
+ UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SocketUnchangeableSendBuffer",
+ actual_size, 1000, 1000000, 50);
+ }
+ return actual_size >= size;
}
void UDPSocketWin::AllowAddressReuse() {
@@ -529,7 +553,7 @@ int UDPSocketWin::InternalRecvFrom(IOBuffer* buf, int buf_len,
// Convert address.
if (address && result >= 0) {
if (!ReceiveAddressToIPEndpoint(address))
- result = ERR_FAILED;
+ result = ERR_ADDRESS_INVALID;
}
LogRead(result, buf->data());
return result;
@@ -558,7 +582,7 @@ int UDPSocketWin::InternalSendTo(IOBuffer* buf, int buf_len,
storage.addr_len = 0;
} else {
if (!address->ToSockAddr(addr, &storage.addr_len)) {
- int result = ERR_FAILED;
+ int result = ERR_ADDRESS_INVALID;
LogWrite(result, NULL, NULL);
return result;
}
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
index 744dc3ba4c..8405163526 100644
--- a/net/url_request/url_request_context_builder.cc
+++ b/net/url_request/url_request_context_builder.cc
@@ -64,8 +64,8 @@ class BasicNetworkDelegate : public NetworkDelegate {
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers)
- OVERRIDE {
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) OVERRIDE {
return OK;
}
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 7207777517..41b15158d5 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -24,7 +24,8 @@
#include "net/base/network_delegate.h"
#include "net/base/sdch_manager.h"
#include "net/cert/cert_status_flags.h"
-#include "net/cookies/cookie_monster.h"
+#include "net/cookies/cookie_store.h"
+#include "net/http/http_content_disposition.h"
#include "net/http/http_network_session.h"
#include "net/http/http_request_headers.h"
#include "net/http/http_response_headers.h"
@@ -58,6 +59,7 @@ class URLRequestHttpJob::HttpFilterContext : public FilterContext {
// FilterContext implementation.
virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
virtual bool GetURL(GURL* gurl) const OVERRIDE;
+ virtual bool GetContentDisposition(std::string* disposition) const OVERRIDE;
virtual base::Time GetRequestTime() const OVERRIDE;
virtual bool IsCachedContent() const OVERRIDE;
virtual bool IsDownload() const OVERRIDE;
@@ -96,6 +98,13 @@ bool URLRequestHttpJob::HttpFilterContext::GetURL(GURL* gurl) const {
return true;
}
+bool URLRequestHttpJob::HttpFilterContext::GetContentDisposition(
+ std::string* disposition) const {
+ HttpResponseHeaders* headers = job_->GetResponseHeaders();
+ void *iter = NULL;
+ return headers->EnumerateHeader(&iter, "Content-Disposition", disposition);
+}
+
base::Time URLRequestHttpJob::HttpFilterContext::GetRequestTime() const {
return job_->request() ? job_->request()->request_time() : base::Time();
}
@@ -541,15 +550,10 @@ void URLRequestHttpJob::AddCookieHeaderAndStart() {
CookieStore* cookie_store = GetCookieStore();
if (cookie_store && !(request_info_.load_flags & LOAD_DO_NOT_SEND_COOKIES)) {
- net::CookieMonster* cookie_monster = cookie_store->GetCookieMonster();
- if (cookie_monster) {
- cookie_monster->GetAllCookiesForURLAsync(
- request_->url(),
- base::Bind(&URLRequestHttpJob::CheckCookiePolicyAndLoad,
- weak_factory_.GetWeakPtr()));
- } else {
- CheckCookiePolicyAndLoad(CookieList());
- }
+ cookie_store->GetAllCookiesForURLAsync(
+ request_->url(),
+ base::Bind(&URLRequestHttpJob::CheckCookiePolicyAndLoad,
+ weak_factory_.GetWeakPtr()));
} else {
DoStartTransaction();
}
@@ -803,11 +807,13 @@ void URLRequestHttpJob::OnStartCompleted(int result) {
// |on_headers_received_callback_| or
// |NetworkDelegate::URLRequestDestroyed()| has been called.
OnCallToDelegate();
+ allowed_unsafe_redirect_url_ = GURL();
int error = network_delegate()->NotifyHeadersReceived(
request_,
on_headers_received_callback_,
headers.get(),
- &override_response_headers_);
+ &override_response_headers_,
+ &allowed_unsafe_redirect_url_);
if (error != net::OK) {
if (error == net::ERR_IO_PENDING) {
awaiting_callback_ = true;
@@ -1035,6 +1041,15 @@ bool URLRequestHttpJob::IsSafeRedirect(const GURL& location) {
(location.scheme() == "http" || location.scheme() == "https")) {
return true;
}
+ // Delegates may mark an URL as safe for redirection.
+ if (allowed_unsafe_redirect_url_.is_valid()) {
+ GURL::Replacements replacements;
+ replacements.ClearRef();
+ if (allowed_unsafe_redirect_url_.ReplaceComponents(replacements) ==
+ location.ReplaceComponents(replacements)) {
+ return true;
+ }
+ }
// Query URLRequestJobFactory as to whether |location| would be safe to
// redirect to.
return request_->context()->job_factory() &&
@@ -1252,8 +1267,27 @@ int64 URLRequestHttpJob::GetTotalReceivedBytes() const {
}
void URLRequestHttpJob::DoneReading() {
- if (transaction_.get())
+ if (transaction_) {
transaction_->DoneReading();
+ }
+ DoneWithRequest(FINISHED);
+}
+
+void URLRequestHttpJob::DoneReadingRedirectResponse() {
+ if (transaction_) {
+ if (transaction_->GetResponseInfo()->headers->IsRedirect(NULL)) {
+ // If the original headers indicate a redirect, go ahead and cache the
+ // response, even if the |override_response_headers_| are a redirect to
+ // another location.
+ transaction_->DoneReading();
+ } else {
+ // Otherwise, |override_response_headers_| must be non-NULL and contain
+ // bogus headers indicating a redirect.
+ DCHECK(override_response_headers_);
+ DCHECK(override_response_headers_->IsRedirect(NULL));
+ transaction_->StopCaching();
+ }
+ }
DoneWithRequest(FINISHED);
}
diff --git a/net/url_request/url_request_http_job.h b/net/url_request/url_request_http_job.h
index 33014e50c6..95b77c94d2 100644
--- a/net/url_request/url_request_http_job.h
+++ b/net/url_request/url_request_http_job.h
@@ -122,6 +122,8 @@ class NET_EXPORT_PRIVATE URLRequestHttpJob : public URLRequestJob {
HttpRequestHeaders* headers) const OVERRIDE;
virtual int64 GetTotalReceivedBytes() const OVERRIDE;
virtual void DoneReading() OVERRIDE;
+ virtual void DoneReadingRedirectResponse() OVERRIDE;
+
virtual HostPortPair GetSocketAddress() const OVERRIDE;
virtual void NotifyURLRequestDestroyed() OVERRIDE;
@@ -254,6 +256,9 @@ class NET_EXPORT_PRIVATE URLRequestHttpJob : public URLRequestJob {
// layers of the network stack.
scoped_refptr<HttpResponseHeaders> override_response_headers_;
+ // The network delegate can mark a URL as safe for redirection.
+ GURL allowed_unsafe_redirect_url_;
+
// Flag used to verify that |this| is not deleted while we are awaiting
// a callback from the NetworkDelegate. Used as a fail-fast mechanism.
// True if we are waiting a callback and
diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc
index aac992dd4d..35dbbb1d16 100644
--- a/net/url_request/url_request_job.cc
+++ b/net/url_request/url_request_job.cc
@@ -327,6 +327,10 @@ void URLRequestJob::NotifyHeadersComplete() {
GURL new_location;
int http_status_code;
if (IsRedirectResponse(&new_location, &http_status_code)) {
+ // Redirect response bodies are not read. Notify the transaction
+ // so it does not treat being stopped as an error.
+ DoneReadingRedirectResponse();
+
const GURL& url = request_->url();
// Move the reference fragment of the old location to the new one if the
@@ -340,10 +344,6 @@ void URLRequestJob::NotifyHeadersComplete() {
new_location = new_location.ReplaceComponents(replacements);
}
- // Redirect response bodies are not read. Notify the transaction
- // so it does not treat being stopped as an error.
- DoneReading();
-
bool defer_redirect = false;
request_->NotifyReceivedRedirect(new_location, &defer_redirect);
@@ -532,6 +532,9 @@ void URLRequestJob::DoneReading() {
// Do nothing.
}
+void URLRequestJob::DoneReadingRedirectResponse() {
+}
+
void URLRequestJob::FilteredDataRead(int bytes_read) {
DCHECK(filter_.get()); // don't add data if there is no filter
filter_->FlushStreamBuffer(bytes_read);
diff --git a/net/url_request/url_request_job.h b/net/url_request/url_request_job.h
index 9bb763ef2e..c6f7ba4e4b 100644
--- a/net/url_request/url_request_job.h
+++ b/net/url_request/url_request_job.h
@@ -293,6 +293,11 @@ class NET_EXPORT URLRequestJob
// the stream.
virtual void DoneReading();
+ // Called to tell the job that the body won't be read because it's a redirect.
+ // This is needed so that redirect headers can be cached even though their
+ // bodies are never read.
+ virtual void DoneReadingRedirectResponse();
+
// Informs the filter that data has been read into its buffer
void FilteredDataRead(int bytes_read);
diff --git a/net/url_request/url_request_job_unittest.cc b/net/url_request/url_request_job_unittest.cc
index 99f43141d9..c8bbc19038 100644
--- a/net/url_request/url_request_job_unittest.cc
+++ b/net/url_request/url_request_job_unittest.cc
@@ -4,6 +4,7 @@
#include "net/url_request/url_request_job.h"
+#include "base/run_loop.h"
#include "net/base/request_priority.h"
#include "net/http/http_transaction_unittest.h"
#include "net/url_request/url_request_test_util.h"
@@ -96,7 +97,7 @@ TEST(URLRequestJob, SyncTransactionNotifiedWhenDone) {
req.set_method("GET");
req.Start();
- base::MessageLoop::current()->Run();
+ base::RunLoop().Run();
EXPECT_TRUE(network_layer.done_reading_called());
@@ -116,11 +117,34 @@ TEST(URLRequestJob, RedirectTransactionNotifiedWhenDone) {
req.set_method("GET");
req.Start();
- base::MessageLoop::current()->Run();
+ base::RunLoop().Run();
EXPECT_TRUE(network_layer.done_reading_called());
RemoveMockTransaction(&kRedirect_Transaction);
}
+TEST(URLRequestJob, TransactionNotCachedWhenNetworkDelegateRedirects) {
+ MockNetworkLayer network_layer;
+ TestNetworkDelegate network_delegate;
+ network_delegate.set_redirect_on_headers_received_url(GURL("http://foo"));
+ TestURLRequestContext context;
+ context.set_http_transaction_factory(&network_layer);
+ context.set_network_delegate(&network_delegate);
+
+ TestDelegate d;
+ TestURLRequest req(GURL(kGZip_Transaction.url), DEFAULT_PRIORITY, &d,
+ &context);
+ AddMockTransaction(&kGZip_Transaction);
+
+ req.set_method("GET");
+ req.Start();
+
+ base::RunLoop().Run();
+
+ EXPECT_TRUE(network_layer.stop_caching_called());
+
+ RemoveMockTransaction(&kGZip_Transaction);
+}
+
} // namespace net
diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc
index 419816bfa9..17ad31166f 100644
--- a/net/url_request/url_request_test_util.cc
+++ b/net/url_request/url_request_test_util.cc
@@ -13,6 +13,7 @@
#include "net/cert/cert_verifier.h"
#include "net/dns/mock_host_resolver.h"
#include "net/http/http_network_session.h"
+#include "net/http/http_response_headers.h"
#include "net/http/http_server_properties_impl.h"
#include "net/http/transport_security_state.h"
#include "net/ssl/default_server_bound_cert_store.h"
@@ -410,7 +411,8 @@ int TestNetworkDelegate::OnHeadersReceived(
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers) {
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) {
int req_id = request->identifier();
event_order_[req_id] += "OnHeadersReceived\n";
InitRequestStatesIfNew(req_id);
@@ -426,6 +428,20 @@ int TestNetworkDelegate::OnHeadersReceived(
// layer before the URLRequest reports that a response has started.
next_states_[req_id] |= kStageBeforeSendHeaders;
+ if (!redirect_on_headers_received_url_.is_empty()) {
+ *override_response_headers =
+ new net::HttpResponseHeaders(original_response_headers->raw_headers());
+ (*override_response_headers)->ReplaceStatusLine("HTTP/1.1 302 Found");
+ (*override_response_headers)->RemoveHeader("Location");
+ (*override_response_headers)->AddHeader(
+ "Location: " + redirect_on_headers_received_url_.spec());
+
+ redirect_on_headers_received_url_ = GURL();
+
+ if (!allowed_unsafe_redirect_url_.is_empty())
+ *allowed_unsafe_redirect_url = allowed_unsafe_redirect_url_;
+ }
+
return OK;
}
diff --git a/net/url_request/url_request_test_util.h b/net/url_request/url_request_test_util.h
index 0d35876157..0b2f48cdbe 100644
--- a/net/url_request/url_request_test_util.h
+++ b/net/url_request/url_request_test_util.h
@@ -234,6 +234,17 @@ class TestNetworkDelegate : public NetworkDelegate {
bool GetLoadTimingInfoBeforeAuth(
LoadTimingInfo* load_timing_info_before_auth) const;
+ // Will redirect once to the given URL when the next set of headers are
+ // received.
+ void set_redirect_on_headers_received_url(
+ GURL redirect_on_headers_received_url) {
+ redirect_on_headers_received_url_ = redirect_on_headers_received_url;
+ }
+
+ void set_allowed_unsafe_redirect_url(GURL allowed_unsafe_redirect_url) {
+ allowed_unsafe_redirect_url_ = allowed_unsafe_redirect_url;
+ }
+
void set_cookie_options(int o) {cookie_options_bit_mask_ = o; }
int last_error() const { return last_error_; }
@@ -266,7 +277,8 @@ class TestNetworkDelegate : public NetworkDelegate {
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE;
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) OVERRIDE;
virtual void OnBeforeRedirect(URLRequest* request,
const GURL& new_location) OVERRIDE;
virtual void OnResponseStarted(URLRequest* request) OVERRIDE;
@@ -296,6 +308,10 @@ class TestNetworkDelegate : public NetworkDelegate {
void InitRequestStatesIfNew(int request_id);
+ GURL redirect_on_headers_received_url_;
+ // URL marked as safe for redirection at the onHeadersReceived stage.
+ GURL allowed_unsafe_redirect_url_;
+
int last_error_;
int error_count_;
int created_requests_;
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index b85da781e1..aab2b32479 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -57,6 +57,7 @@
#include "net/http/http_network_session.h"
#include "net/http/http_request_headers.h"
#include "net/http/http_response_headers.h"
+#include "net/http/http_util.h"
#include "net/ocsp/nss_ocsp.h"
#include "net/proxy/proxy_service.h"
#include "net/socket/ssl_client_socket.h"
@@ -367,7 +368,8 @@ class BlockingNetworkDelegate : public TestNetworkDelegate {
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE;
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) OVERRIDE;
virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired(
URLRequest* request,
@@ -390,7 +392,7 @@ class BlockingNetworkDelegate : public TestNetworkDelegate {
int retval_; // To be returned in non-auth stages.
AuthRequiredResponse auth_retval_;
- GURL redirect_url_; // Used if non-empty.
+ GURL redirect_url_; // Used if non-empty during OnBeforeURLRequest.
int block_on_; // Bit mask: in which stages to block.
// |auth_credentials_| will be copied to |*target_auth_credential_| on
@@ -482,10 +484,13 @@ int BlockingNetworkDelegate::OnHeadersReceived(
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers) {
- TestNetworkDelegate::OnHeadersReceived(
- request, callback, original_response_headers,
- override_response_headers);
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) {
+ TestNetworkDelegate::OnHeadersReceived(request,
+ callback,
+ original_response_headers,
+ override_response_headers,
+ allowed_unsafe_redirect_url);
return MaybeBlockStage(ON_HEADERS_RECEIVED, callback);
}
@@ -2416,8 +2421,8 @@ class FixedDateNetworkDelegate : public TestNetworkDelegate {
net::URLRequest* request,
const net::CompletionCallback& callback,
const net::HttpResponseHeaders* original_response_headers,
- scoped_refptr<net::HttpResponseHeaders>* override_response_headers)
- OVERRIDE;
+ scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) OVERRIDE;
private:
std::string fixed_date_;
@@ -2429,7 +2434,8 @@ int FixedDateNetworkDelegate::OnHeadersReceived(
net::URLRequest* request,
const net::CompletionCallback& callback,
const net::HttpResponseHeaders* original_response_headers,
- scoped_refptr<net::HttpResponseHeaders>* override_response_headers) {
+ scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) {
net::HttpResponseHeaders* new_response_headers =
new net::HttpResponseHeaders(original_response_headers->raw_headers());
@@ -2440,7 +2446,8 @@ int FixedDateNetworkDelegate::OnHeadersReceived(
return TestNetworkDelegate::OnHeadersReceived(request,
callback,
original_response_headers,
- override_response_headers);
+ override_response_headers,
+ allowed_unsafe_redirect_url);
}
// Test that cookie expiration times are adjusted for server/client clock
@@ -3007,6 +3014,39 @@ TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestPost) {
EXPECT_EQ(1, network_delegate.destroyed_requests());
}
+// Tests that the network delegate can block and redirect a request to a new
+// URL during OnHeadersReceived.
+TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestOnHeadersReceived) {
+ ASSERT_TRUE(test_server_.Start());
+
+ TestDelegate d;
+ BlockingNetworkDelegate network_delegate(
+ BlockingNetworkDelegate::AUTO_CALLBACK);
+ network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
+ GURL redirect_url(test_server_.GetURL("simple.html"));
+ network_delegate.set_redirect_on_headers_received_url(redirect_url);
+
+ TestURLRequestContextWithProxy context(
+ test_server_.host_port_pair().ToString(), &network_delegate);
+
+ {
+ GURL original_url(test_server_.GetURL("empty.html"));
+ URLRequest r(original_url, DEFAULT_PRIORITY, &d, &context);
+
+ r.Start();
+ base::RunLoop().Run();
+
+ EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
+ EXPECT_EQ(net::OK, r.status().error());
+ EXPECT_EQ(redirect_url, r.url());
+ EXPECT_EQ(original_url, r.original_url());
+ EXPECT_EQ(2U, r.url_chain().size());
+ EXPECT_EQ(2, network_delegate.created_requests());
+ EXPECT_EQ(0, network_delegate.destroyed_requests());
+ }
+ EXPECT_EQ(1, network_delegate.destroyed_requests());
+}
+
// Tests that the network delegate can synchronously complete OnAuthRequired
// by taking no action. This indicates that the NetworkDelegate does not want to
// handle the challenge, and is passing the buck along to the
@@ -3919,10 +3959,13 @@ class AsyncLoggingNetworkDelegate : public TestNetworkDelegate {
URLRequest* request,
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE {
- TestNetworkDelegate::OnHeadersReceived(request, callback,
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) OVERRIDE {
+ TestNetworkDelegate::OnHeadersReceived(request,
+ callback,
original_response_headers,
- override_response_headers);
+ override_response_headers,
+ allowed_unsafe_redirect_url);
return RunCallbackAsynchronously(request, callback);
}
@@ -5163,6 +5206,213 @@ TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) {
EXPECT_EQ(ERR_INVALID_URL, req.status().error());
}
+// Make sure redirects are cached, despite not reading their bodies.
+TEST_F(URLRequestTestHTTP, CacheRedirect) {
+ ASSERT_TRUE(test_server_.Start());
+ GURL redirect_url =
+ test_server_.GetURL("files/redirect302-to-echo-cacheable");
+
+ {
+ TestDelegate d;
+ URLRequest req(redirect_url, DEFAULT_PRIORITY, &d, &default_context_);
+ req.Start();
+ base::RunLoop().Run();
+ EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
+ EXPECT_EQ(1, d.received_redirect_count());
+ EXPECT_EQ(test_server_.GetURL("echo"), req.url());
+ }
+
+ {
+ TestDelegate d;
+ d.set_quit_on_redirect(true);
+ URLRequest req(redirect_url, DEFAULT_PRIORITY, &d, &default_context_);
+ req.Start();
+ base::RunLoop().Run();
+
+ EXPECT_EQ(1, d.received_redirect_count());
+ EXPECT_EQ(0, d.response_started_count());
+ EXPECT_TRUE(req.was_cached());
+
+ req.FollowDeferredRedirect();
+ base::RunLoop().Run();
+ EXPECT_EQ(1, d.received_redirect_count());
+ EXPECT_EQ(1, d.response_started_count());
+ EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
+ EXPECT_EQ(test_server_.GetURL("echo"), req.url());
+ }
+}
+
+// Make sure a request isn't cached when a NetworkDelegate forces a redirect
+// when the headers are read, since the body won't have been read.
+TEST_F(URLRequestTestHTTP, NoCacheOnNetworkDelegateRedirect) {
+ ASSERT_TRUE(test_server_.Start());
+ // URL that is normally cached.
+ GURL initial_url = test_server_.GetURL("cachetime");
+
+ {
+ // Set up the TestNetworkDelegate tp force a redirect.
+ GURL redirect_to_url = test_server_.GetURL("echo");
+ default_network_delegate_.set_redirect_on_headers_received_url(
+ redirect_to_url);
+
+ TestDelegate d;
+ URLRequest req(initial_url, DEFAULT_PRIORITY, &d, &default_context_);
+ req.Start();
+ base::RunLoop().Run();
+ EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
+ EXPECT_EQ(1, d.received_redirect_count());
+ EXPECT_EQ(redirect_to_url, req.url());
+ }
+
+ {
+ TestDelegate d;
+ URLRequest req(initial_url, DEFAULT_PRIORITY, &d, &default_context_);
+ req.Start();
+ base::RunLoop().Run();
+
+ EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
+ EXPECT_FALSE(req.was_cached());
+ EXPECT_EQ(0, d.received_redirect_count());
+ EXPECT_EQ(initial_url, req.url());
+ }
+}
+
+// Tests that redirection to an unsafe URL is allowed when it has been marked as
+// safe.
+TEST_F(URLRequestTestHTTP, UnsafeRedirectToWhitelistedUnsafeURL) {
+ ASSERT_TRUE(test_server_.Start());
+
+ GURL unsafe_url("data:text/html,this-is-considered-an-unsafe-url");
+ default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
+ default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
+
+ TestDelegate d;
+ {
+ URLRequest r(test_server_.GetURL("whatever"),
+ DEFAULT_PRIORITY,
+ &d,
+ &default_context_);
+
+ r.Start();
+ base::RunLoop().Run();
+
+ EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
+
+ EXPECT_EQ(2U, r.url_chain().size());
+ EXPECT_EQ(net::OK, r.status().error());
+ EXPECT_EQ(unsafe_url, r.url());
+ EXPECT_EQ("this-is-considered-an-unsafe-url", d.data_received());
+ }
+}
+
+// Tests that a redirect to a different unsafe URL is blocked, even after adding
+// some other URL to the whitelist.
+TEST_F(URLRequestTestHTTP, UnsafeRedirectToDifferentUnsafeURL) {
+ ASSERT_TRUE(test_server_.Start());
+
+ GURL unsafe_url("data:text/html,something");
+ GURL different_unsafe_url("data:text/html,something-else");
+ default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
+ default_network_delegate_.set_allowed_unsafe_redirect_url(
+ different_unsafe_url);
+
+ TestDelegate d;
+ {
+ URLRequest r(test_server_.GetURL("whatever"),
+ DEFAULT_PRIORITY,
+ &d,
+ &default_context_);
+
+ r.Start();
+ base::RunLoop().Run();
+
+ EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
+ EXPECT_EQ(ERR_UNSAFE_REDIRECT, r.status().error());
+ }
+}
+
+// Redirects from an URL with fragment to an unsafe URL without fragment should
+// be allowed.
+TEST_F(URLRequestTestHTTP, UnsafeRedirectWithReferenceFragment) {
+ ASSERT_TRUE(test_server_.Start());
+
+ GURL original_url(test_server_.GetURL("original#fragment"));
+ GURL unsafe_url("data:,url-marked-safe-and-used-in-redirect");
+ GURL expected_url("data:,url-marked-safe-and-used-in-redirect#fragment");
+
+ default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
+ default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
+
+ TestDelegate d;
+ {
+ URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_);
+
+ r.Start();
+ base::RunLoop().Run();
+
+ EXPECT_EQ(2U, r.url_chain().size());
+ EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
+ EXPECT_EQ(net::OK, r.status().error());
+ EXPECT_EQ(original_url, r.original_url());
+ EXPECT_EQ(expected_url, r.url());
+ }
+}
+
+// Redirects from an URL with fragment to an unsafe URL with fragment should
+// be allowed, and the reference fragment of the target URL should be preserved.
+TEST_F(URLRequestTestHTTP, UnsafeRedirectWithDifferentReferenceFragment) {
+ ASSERT_TRUE(test_server_.Start());
+
+ GURL original_url(test_server_.GetURL("original#fragment1"));
+ GURL unsafe_url("data:,url-marked-safe-and-used-in-redirect#fragment2");
+ GURL expected_url("data:,url-marked-safe-and-used-in-redirect#fragment2");
+
+ default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
+ default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
+
+ TestDelegate d;
+ {
+ URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_);
+
+ r.Start();
+ base::RunLoop().Run();
+
+ EXPECT_EQ(2U, r.url_chain().size());
+ EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
+ EXPECT_EQ(net::OK, r.status().error());
+ EXPECT_EQ(original_url, r.original_url());
+ EXPECT_EQ(expected_url, r.url());
+ }
+}
+
+// When a delegate has specified a safe redirect URL, but it does not match the
+// redirect target, then do not prevent the reference fragment from being added.
+TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragment) {
+ ASSERT_TRUE(test_server_.Start());
+
+ GURL original_url(test_server_.GetURL("original#expected-fragment"));
+ GURL unsafe_url("data:text/html,this-url-does-not-match-redirect-url");
+ GURL redirect_url(test_server_.GetURL("target"));
+ GURL expected_redirect_url(test_server_.GetURL("target#expected-fragment"));
+
+ default_network_delegate_.set_redirect_on_headers_received_url(redirect_url);
+ default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
+
+ TestDelegate d;
+ {
+ URLRequest r(original_url, DEFAULT_PRIORITY, &d, &default_context_);
+
+ r.Start();
+ base::RunLoop().Run();
+
+ EXPECT_EQ(2U, r.url_chain().size());
+ EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
+ EXPECT_EQ(net::OK, r.status().error());
+ EXPECT_EQ(original_url, r.original_url());
+ EXPECT_EQ(expected_redirect_url, r.url());
+ }
+}
+
TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) {
ASSERT_TRUE(test_server_.Start());
@@ -6204,12 +6454,11 @@ TEST_F(HTTPSRequestTest, HTTPSExpiredTest) {
// Tests TLSv1.1 -> TLSv1 fallback. Verifies that we don't fall back more
// than necessary.
TEST_F(HTTPSRequestTest, TLSv1Fallback) {
- uint16 default_version_max = SSLConfigService::default_version_max();
// The OpenSSL library in use may not support TLS 1.1.
#if !defined(USE_OPENSSL)
- EXPECT_GT(default_version_max, SSL_PROTOCOL_VERSION_TLS1);
+ EXPECT_GT(kDefaultSSLVersionMax, SSL_PROTOCOL_VERSION_TLS1);
#endif
- if (default_version_max <= SSL_PROTOCOL_VERSION_TLS1)
+ if (kDefaultSSLVersionMax <= SSL_PROTOCOL_VERSION_TLS1)
return;
SpawnedTestServer::SSLOptions ssl_options(
@@ -6944,12 +7193,12 @@ static bool SystemSupportsHardFailRevocationChecking() {
// several tests are effected because our testing EV certificate won't be
// recognised as EV.
static bool SystemUsesChromiumEVMetadata() {
-#if defined(USE_OPENSSL)
+#if defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID)
// http://crbug.com/117478 - OpenSSL does not support EV validation.
return false;
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
- // On OS X, we use the system to tell us whether a certificate is EV or not
- // and the system won't recognise our testing root.
+#elif (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_ANDROID)
+ // On OS X and Android, we use the system to tell us whether a certificate is
+ // EV or not and the system won't recognise our testing root.
return false;
#else
return true;
diff --git a/net/websockets/websocket_channel.cc b/net/websockets/websocket_channel.cc
index ed8a92b0df..25df3a4b7f 100644
--- a/net/websockets/websocket_channel.cc
+++ b/net/websockets/websocket_channel.cc
@@ -4,12 +4,16 @@
#include "net/websockets/websocket_channel.h"
+#include <limits.h> // for INT_MAX
+
#include <algorithm>
+#include <deque>
#include "base/basictypes.h" // for size_t
#include "base/big_endian.h"
#include "base/bind.h"
#include "base/compiler_specific.h"
+#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/numerics/safe_conversions.h"
@@ -167,8 +171,7 @@ class WebSocketChannel::ConnectDelegate
}
virtual void OnFinishOpeningHandshake(
- scoped_ptr<WebSocketHandshakeResponseInfo> response)
- OVERRIDE {
+ scoped_ptr<WebSocketHandshakeResponseInfo> response) OVERRIDE {
creator_->OnFinishOpeningHandshake(response.Pass());
}
@@ -217,7 +220,8 @@ class WebSocketChannel::HandshakeNotificationSender
};
WebSocketChannel::HandshakeNotificationSender::HandshakeNotificationSender(
- WebSocketChannel* channel) : owner_(channel) {}
+ WebSocketChannel* channel)
+ : owner_(channel) {}
WebSocketChannel::HandshakeNotificationSender::~HandshakeNotificationSender() {}
@@ -235,13 +239,13 @@ ChannelState WebSocketChannel::HandshakeNotificationSender::SendImmediately(
if (handshake_request_info_.get()) {
if (CHANNEL_DELETED == event_interface->OnStartOpeningHandshake(
- handshake_request_info_.Pass()))
+ handshake_request_info_.Pass()))
return CHANNEL_DELETED;
}
if (handshake_response_info_.get()) {
if (CHANNEL_DELETED == event_interface->OnFinishOpeningHandshake(
- handshake_response_info_.Pass()))
+ handshake_response_info_.Pass()))
return CHANNEL_DELETED;
// TODO(yhirano): We can release |this| to save memory because
@@ -251,6 +255,31 @@ ChannelState WebSocketChannel::HandshakeNotificationSender::SendImmediately(
return CHANNEL_ALIVE;
}
+WebSocketChannel::PendingReceivedFrame::PendingReceivedFrame(
+ bool final,
+ WebSocketFrameHeader::OpCode opcode,
+ const scoped_refptr<IOBuffer>& data,
+ size_t offset,
+ size_t size)
+ : final_(final),
+ opcode_(opcode),
+ data_(data),
+ offset_(offset),
+ size_(size) {}
+
+WebSocketChannel::PendingReceivedFrame::~PendingReceivedFrame() {}
+
+void WebSocketChannel::PendingReceivedFrame::ResetOpcode() {
+ DCHECK(WebSocketFrameHeader::IsKnownDataOpCode(opcode_));
+ opcode_ = WebSocketFrameHeader::kOpCodeContinuation;
+}
+
+void WebSocketChannel::PendingReceivedFrame::DidConsume(size_t bytes) {
+ DCHECK_LE(offset_, size_);
+ DCHECK_LE(bytes, size_ - offset_);
+ offset_ += bytes;
+}
+
WebSocketChannel::WebSocketChannel(
scoped_ptr<WebSocketEventInterface> event_interface,
URLRequestContext* url_request_context)
@@ -259,6 +288,7 @@ WebSocketChannel::WebSocketChannel(
send_quota_low_water_mark_(kDefaultSendQuotaLowWaterMark),
send_quota_high_water_mark_(kDefaultSendQuotaHighWaterMark),
current_send_quota_(0),
+ current_receive_quota_(0),
timeout_(base::TimeDelta::FromSeconds(kClosingHandshakeTimeoutSeconds)),
received_close_code_(0),
state_(FRESHLY_CONSTRUCTED),
@@ -357,15 +387,54 @@ void WebSocketChannel::SendFrame(bool fin,
// server is not saturated.
scoped_refptr<IOBuffer> buffer(new IOBuffer(data.size()));
std::copy(data.begin(), data.end(), buffer->data());
- AllowUnused(SendIOBuffer(fin, op_code, buffer, data.size()));
+ AllowUnused(SendFrameFromIOBuffer(fin, op_code, buffer, data.size()));
// |this| may have been deleted.
}
void WebSocketChannel::SendFlowControl(int64 quota) {
DCHECK(state_ == CONNECTING || state_ == CONNECTED || state_ == SEND_CLOSED ||
state_ == CLOSE_WAIT);
- // TODO(ricea): Add interface to WebSocketStream and implement.
- // stream_->SendFlowControl(quota);
+ // TODO(ricea): Kill the renderer if it tries to send us a negative quota
+ // value or > INT_MAX.
+ DCHECK_GE(quota, 0);
+ DCHECK_LE(quota, INT_MAX);
+ if (!pending_received_frames_.empty()) {
+ DCHECK_EQ(0, current_receive_quota_);
+ }
+ while (!pending_received_frames_.empty() && quota > 0) {
+ PendingReceivedFrame& front = pending_received_frames_.front();
+ const size_t data_size = front.size() - front.offset();
+ const size_t bytes_to_send =
+ std::min(base::checked_cast<size_t>(quota), data_size);
+ const bool final = front.final() && data_size == bytes_to_send;
+ const char* data = front.data()->data() + front.offset();
+ const std::vector<char> data_vector(data, data + bytes_to_send);
+ DVLOG(3) << "Sending frame previously split due to quota to the "
+ << "renderer: quota=" << quota << " data_size=" << data_size
+ << " bytes_to_send=" << bytes_to_send;
+ if (event_interface_->OnDataFrame(final, front.opcode(), data_vector) ==
+ CHANNEL_DELETED)
+ return;
+ if (bytes_to_send < data_size) {
+ front.DidConsume(bytes_to_send);
+ front.ResetOpcode();
+ return;
+ }
+ const int64 signed_bytes_to_send = base::checked_cast<int64>(bytes_to_send);
+ DCHECK_GE(quota, signed_bytes_to_send);
+ quota -= signed_bytes_to_send;
+
+ pending_received_frames_.pop();
+ }
+ // If current_receive_quota_ == 0 then there is no pending ReadFrames()
+ // operation.
+ const bool start_read =
+ current_receive_quota_ == 0 && quota > 0 &&
+ (state_ == CONNECTED || state_ == SEND_CLOSED || state_ == CLOSE_WAIT);
+ current_receive_quota_ += base::checked_cast<int>(quota);
+ if (start_read)
+ AllowUnused(ReadFrames());
+ // |this| may have been deleted.
}
void WebSocketChannel::StartClosingHandshake(uint16 code,
@@ -465,6 +534,7 @@ void WebSocketChannel::OnConnectSuccess(scoped_ptr<WebSocketStream> stream) {
// |stream_request_| is not used once the connection has succeeded.
stream_request_.reset();
+
AllowUnused(ReadFrames());
// |this| may have been deleted.
}
@@ -574,7 +644,7 @@ ChannelState WebSocketChannel::OnWriteDone(bool synchronous, int result) {
ChannelState WebSocketChannel::ReadFrames() {
int result = OK;
- do {
+ while (result == OK && current_receive_quota_ > 0) {
// This use of base::Unretained is safe because this object owns the
// WebSocketStream, and any pending reads will be cancelled when it is
// destroyed.
@@ -588,7 +658,7 @@ ChannelState WebSocketChannel::ReadFrames() {
return CHANNEL_DELETED;
}
DCHECK_NE(CLOSED, state_);
- } while (result == OK);
+ }
return CHANNEL_ALIVE;
}
@@ -642,8 +712,7 @@ ChannelState WebSocketChannel::OnReadDone(bool synchronous, int result) {
}
}
-ChannelState WebSocketChannel::HandleFrame(
- scoped_ptr<WebSocketFrame> frame) {
+ChannelState WebSocketChannel::HandleFrame(scoped_ptr<WebSocketFrame> frame) {
if (frame->header.masked) {
// RFC6455 Section 5.1 "A client MUST close a connection if it detects a
// masked frame."
@@ -691,7 +760,7 @@ ChannelState WebSocketChannel::HandleFrameByState(
frame_name + " received after close", kWebSocketErrorProtocolError, "");
}
switch (opcode) {
- case WebSocketFrameHeader::kOpCodeText: // fall-thru
+ case WebSocketFrameHeader::kOpCodeText: // fall-thru
case WebSocketFrameHeader::kOpCodeBinary:
case WebSocketFrameHeader::kOpCodeContinuation:
return HandleDataFrame(opcode, final, data_buffer, size);
@@ -699,7 +768,7 @@ ChannelState WebSocketChannel::HandleFrameByState(
case WebSocketFrameHeader::kOpCodePing:
VLOG(1) << "Got Ping of size " << size;
if (state_ == CONNECTED)
- return SendIOBuffer(
+ return SendFrameFromIOBuffer(
true, WebSocketFrameHeader::kOpCodePong, data_buffer, size);
VLOG(3) << "Ignored ping in state " << state_;
return CHANNEL_ALIVE;
@@ -710,6 +779,10 @@ ChannelState WebSocketChannel::HandleFrameByState(
return CHANNEL_ALIVE;
case WebSocketFrameHeader::kOpCodeClose: {
+ // TODO(ricea): If there is a message which is queued for transmission to
+ // the renderer, then the renderer should not receive an
+ // OnClosingHandshake or OnDropChannel IPC until the queued message has
+ // been completedly transmitted.
uint16 code = kWebSocketNormalClosure;
std::string reason;
std::string message;
@@ -807,20 +880,34 @@ ChannelState WebSocketChannel::HandleDataFrame(
return CHANNEL_ALIVE;
initial_frame_forwarded_ = !final;
+ if (size > base::checked_cast<size_t>(current_receive_quota_) ||
+ !pending_received_frames_.empty()) {
+ const bool no_quota = (current_receive_quota_ == 0);
+ DCHECK(no_quota || pending_received_frames_.empty());
+ DVLOG(3) << "Queueing frame to renderer due to quota. quota="
+ << current_receive_quota_ << " size=" << size;
+ WebSocketFrameHeader::OpCode opcode_to_queue =
+ no_quota ? opcode_to_send : WebSocketFrameHeader::kOpCodeContinuation;
+ pending_received_frames_.push(PendingReceivedFrame(
+ final, opcode_to_queue, data_buffer, current_receive_quota_, size));
+ if (no_quota)
+ return CHANNEL_ALIVE;
+ size = current_receive_quota_;
+ final = false;
+ }
+
// TODO(ricea): Can this copy be eliminated?
const char* const data_begin = size ? data_buffer->data() : NULL;
const char* const data_end = data_begin + size;
const std::vector<char> data(data_begin, data_end);
- // TODO(ricea): Handle the case when ReadFrames returns far
- // more data at once than should be sent in a single IPC. This needs to
- // be handled carefully, as an overloaded IO thread is one possible
- // cause of receiving very large chunks.
+ current_receive_quota_ -= size;
+ DCHECK_GE(current_receive_quota_, 0);
// Sends the received frame to the renderer process.
return event_interface_->OnDataFrame(final, opcode_to_send, data);
}
-ChannelState WebSocketChannel::SendIOBuffer(
+ChannelState WebSocketChannel::SendFrameFromIOBuffer(
bool fin,
WebSocketFrameHeader::OpCode op_code,
const scoped_refptr<IOBuffer>& buffer,
@@ -898,7 +985,8 @@ ChannelState WebSocketChannel::SendClose(uint16 code,
FROM_HERE,
timeout_,
base::Bind(&WebSocketChannel::CloseTimeout, base::Unretained(this)));
- if (SendIOBuffer(true, WebSocketFrameHeader::kOpCodeClose, body, size) ==
+ if (SendFrameFromIOBuffer(
+ true, WebSocketFrameHeader::kOpCodeClose, body, size) ==
CHANNEL_DELETED)
return CHANNEL_DELETED;
return CHANNEL_ALIVE;
diff --git a/net/websockets/websocket_channel.h b/net/websockets/websocket_channel.h
index 183f2bed0c..80c4290976 100644
--- a/net/websockets/websocket_channel.h
+++ b/net/websockets/websocket_channel.h
@@ -5,6 +5,7 @@
#ifndef NET_WEBSOCKETS_WEBSOCKET_CHANNEL_H_
#define NET_WEBSOCKETS_WEBSOCKET_CHANNEL_H_
+#include <queue>
#include <string>
#include <vector>
@@ -12,6 +13,7 @@
#include "base/callback.h"
#include "base/compiler_specific.h" // for WARN_UNUSED_RESULT
#include "base/i18n/streaming_utf8_validator.h"
+#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "base/time/time.h"
@@ -121,6 +123,42 @@ class NET_EXPORT WebSocketChannel {
private:
class HandshakeNotificationSender;
+ // The Windows implementation of std::queue requires that this declaration be
+ // visible in the header.
+ class PendingReceivedFrame {
+ public:
+ PendingReceivedFrame(bool final,
+ WebSocketFrameHeader::OpCode opcode,
+ const scoped_refptr<IOBuffer>& data,
+ size_t offset,
+ size_t size);
+ ~PendingReceivedFrame();
+
+ bool final() const { return final_; }
+ WebSocketFrameHeader::OpCode opcode() const { return opcode_; }
+ // ResetOpcode() to Continuation.
+ void ResetOpcode();
+ const scoped_refptr<IOBuffer>& data() const { return data_; }
+ size_t offset() const { return offset_; }
+ size_t size() const { return size_; }
+ // Increase |offset_| by |bytes|.
+ void DidConsume(size_t bytes);
+
+ // This object needs to be copyable and assignable, since it will be placed
+ // in a std::queue. The compiler-generated copy constructor and assignment
+ // operator will do the right thing.
+
+ private:
+ bool final_;
+ WebSocketFrameHeader::OpCode opcode_;
+ scoped_refptr<IOBuffer> data_;
+ // Where to start reading from data_. Everything prior to offset_ has
+ // already been sent to the browser.
+ size_t offset_;
+ // The size of data_.
+ size_t size_;
+ };
+
// Methods which return a value of type ChannelState may delete |this|. If the
// return value is CHANNEL_DELETED, then the caller must return without making
// any further access to member variables or methods.
@@ -183,7 +221,8 @@ class NET_EXPORT WebSocketChannel {
// WriteFrames() itself.
ChannelState OnWriteDone(bool synchronous, int result) WARN_UNUSED_RESULT;
- // Calls WebSocketStream::ReadFrames() with the appropriate arguments.
+ // Calls WebSocketStream::ReadFrames() with the appropriate arguments. Stops
+ // calling ReadFrames if current_receive_quota_ is 0.
ChannelState ReadFrames() WARN_UNUSED_RESULT;
// Callback from WebSocketStream::ReadFrames. Handles any errors and processes
@@ -223,10 +262,10 @@ class NET_EXPORT WebSocketChannel {
// when the current write finishes. |fin| and |op_code| are defined as for
// SendFrame() above, except that |op_code| may also be a control frame
// opcode.
- ChannelState SendIOBuffer(bool fin,
- WebSocketFrameHeader::OpCode op_code,
- const scoped_refptr<IOBuffer>& buffer,
- size_t size) WARN_UNUSED_RESULT;
+ ChannelState SendFrameFromIOBuffer(bool fin,
+ WebSocketFrameHeader::OpCode op_code,
+ const scoped_refptr<IOBuffer>& buffer,
+ size_t size) WARN_UNUSED_RESULT;
// Performs the "Fail the WebSocket Connection" operation as defined in
// RFC6455. A NotifyFailure message is sent to the renderer with |message|.
@@ -297,6 +336,10 @@ class NET_EXPORT WebSocketChannel {
// Destination for the current call to WebSocketStream::ReadFrames
ScopedVector<WebSocketFrame> read_frames_;
+ // Frames that have been read but not yet forwarded to the renderer due to
+ // lack of quota.
+ std::queue<PendingReceivedFrame> pending_received_frames_;
+
// Handle to an in-progress WebSocketStream creation request. Only non-NULL
// during the connection process.
scoped_ptr<WebSocketStreamRequest> stream_request_;
@@ -311,6 +354,9 @@ class NET_EXPORT WebSocketChannel {
// The current amount of quota that the renderer has available for sending
// on this logical channel (quota units).
int current_send_quota_;
+ // The remaining amount of quota that the renderer will allow us to send on
+ // this logical channel (quota units).
+ int current_receive_quota_;
// Timer for the closing handshake.
base::OneShotTimer<WebSocketChannel> timer_;
diff --git a/net/websockets/websocket_channel_test.cc b/net/websockets/websocket_channel_test.cc
index 8d8686dac5..82078cbbf9 100644
--- a/net/websockets/websocket_channel_test.cc
+++ b/net/websockets/websocket_channel_test.cc
@@ -4,6 +4,7 @@
#include "net/websockets/websocket_channel.h"
+#include <limits.h>
#include <string.h>
#include <iostream>
@@ -129,13 +130,16 @@ const size_t kDefaultQuotaRefreshTrigger = (1 << 16) + 1;
// in that time! I would like my tests to run a bit quicker.
const int kVeryTinyTimeoutMillis = 1;
+// Enough quota to pass any test.
+const int64 kPlentyOfQuota = INT_MAX;
+
typedef WebSocketEventInterface::ChannelState ChannelState;
const ChannelState CHANNEL_ALIVE = WebSocketEventInterface::CHANNEL_ALIVE;
const ChannelState CHANNEL_DELETED = WebSocketEventInterface::CHANNEL_DELETED;
// This typedef mainly exists to avoid having to repeat the "NOLINT" incantation
// all over the place.
-typedef MockFunction<void(int)> Checkpoint; // NOLINT
+typedef StrictMock< MockFunction<void(int)> > Checkpoint; // NOLINT
// This mock is for testing expectations about how the EventInterface is used.
class MockWebSocketEventInterface : public WebSocketEventInterface {
@@ -731,6 +735,9 @@ class WebSocketChannelTest : public ::testing::Test {
// well. This method is virtual so that subclasses can also set the stream.
virtual void CreateChannelAndConnectSuccessfully() {
CreateChannelAndConnect();
+ // Most tests aren't concerned with flow control from the renderer, so allow
+ // MAX_INT quota units.
+ channel_->SendFlowControl(kPlentyOfQuota);
connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass());
}
@@ -944,6 +951,21 @@ class WebSocketChannelSendUtf8Test
}
};
+// Fixture for tests which test use of receive quota from the renderer.
+class WebSocketChannelFlowControlTest
+ : public WebSocketChannelEventInterfaceTest {
+ protected:
+ // Tests using this fixture should use CreateChannelAndConnectWithQuota()
+ // instead of CreateChannelAndConnectSuccessfully().
+ void CreateChannelAndConnectWithQuota(int64 quota) {
+ CreateChannelAndConnect();
+ channel_->SendFlowControl(quota);
+ connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass());
+ }
+
+ virtual void CreateChannelAndConnectSuccesfully() { NOTREACHED(); }
+};
+
// Fixture for tests which test UTF-8 validation of received Text frames using a
// mock WebSocketStream.
class WebSocketChannelReceiveUtf8Test : public WebSocketChannelStreamTest {
@@ -2141,6 +2163,280 @@ TEST_F(WebSocketChannelEventInterfaceTest,
completion.WaitForResult();
}
+// The renderer should provide us with some quota immediately, and then
+// WebSocketChannel calls ReadFrames as soon as the stream is available.
+TEST_F(WebSocketChannelStreamTest, FlowControlEarly) {
+ Checkpoint checkpoint;
+ EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber());
+ EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber());
+ {
+ InSequence s;
+ EXPECT_CALL(checkpoint, Call(1));
+ EXPECT_CALL(*mock_stream_, ReadFrames(_, _))
+ .WillOnce(Return(ERR_IO_PENDING));
+ EXPECT_CALL(checkpoint, Call(2));
+ }
+
+ set_stream(mock_stream_.Pass());
+ CreateChannelAndConnect();
+ channel_->SendFlowControl(kPlentyOfQuota);
+ checkpoint.Call(1);
+ connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass());
+ checkpoint.Call(2);
+}
+
+// If for some reason the connect succeeds before the renderer sends us quota,
+// we shouldn't call ReadFrames() immediately.
+// TODO(ricea): Actually we should call ReadFrames() with a small limit so we
+// can still handle control frames. This should be done once we have any API to
+// expose quota to the lower levels.
+TEST_F(WebSocketChannelStreamTest, FlowControlLate) {
+ Checkpoint checkpoint;
+ EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber());
+ EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber());
+ {
+ InSequence s;
+ EXPECT_CALL(checkpoint, Call(1));
+ EXPECT_CALL(*mock_stream_, ReadFrames(_, _))
+ .WillOnce(Return(ERR_IO_PENDING));
+ EXPECT_CALL(checkpoint, Call(2));
+ }
+
+ set_stream(mock_stream_.Pass());
+ CreateChannelAndConnect();
+ connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass());
+ checkpoint.Call(1);
+ channel_->SendFlowControl(kPlentyOfQuota);
+ checkpoint.Call(2);
+}
+
+// We should stop calling ReadFrames() when all quota is used.
+TEST_F(WebSocketChannelStreamTest, FlowControlStopsReadFrames) {
+ static const InitFrame frames[] = {
+ {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}};
+
+ EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber());
+ EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber());
+ EXPECT_CALL(*mock_stream_, ReadFrames(_, _))
+ .WillOnce(ReturnFrames(&frames));
+
+ set_stream(mock_stream_.Pass());
+ CreateChannelAndConnect();
+ channel_->SendFlowControl(4);
+ connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass());
+}
+
+// Providing extra quota causes ReadFrames() to be called again.
+TEST_F(WebSocketChannelStreamTest, FlowControlStartsWithMoreQuota) {
+ static const InitFrame frames[] = {
+ {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}};
+ Checkpoint checkpoint;
+
+ EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber());
+ EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber());
+ {
+ InSequence s;
+ EXPECT_CALL(*mock_stream_, ReadFrames(_, _))
+ .WillOnce(ReturnFrames(&frames));
+ EXPECT_CALL(checkpoint, Call(1));
+ EXPECT_CALL(*mock_stream_, ReadFrames(_, _))
+ .WillOnce(Return(ERR_IO_PENDING));
+ }
+
+ set_stream(mock_stream_.Pass());
+ CreateChannelAndConnect();
+ channel_->SendFlowControl(4);
+ connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass());
+ checkpoint.Call(1);
+ channel_->SendFlowControl(4);
+}
+
+// ReadFrames() isn't called again until all pending data has been passed to
+// the renderer.
+TEST_F(WebSocketChannelStreamTest, ReadFramesNotCalledUntilQuotaAvailable) {
+ static const InitFrame frames[] = {
+ {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}};
+ Checkpoint checkpoint;
+
+ EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber());
+ EXPECT_CALL(*mock_stream_, GetExtensions()).Times(AnyNumber());
+ {
+ InSequence s;
+ EXPECT_CALL(*mock_stream_, ReadFrames(_, _))
+ .WillOnce(ReturnFrames(&frames));
+ EXPECT_CALL(checkpoint, Call(1));
+ EXPECT_CALL(checkpoint, Call(2));
+ EXPECT_CALL(*mock_stream_, ReadFrames(_, _))
+ .WillOnce(Return(ERR_IO_PENDING));
+ }
+
+ set_stream(mock_stream_.Pass());
+ CreateChannelAndConnect();
+ channel_->SendFlowControl(2);
+ connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass());
+ checkpoint.Call(1);
+ channel_->SendFlowControl(2);
+ checkpoint.Call(2);
+ channel_->SendFlowControl(2);
+}
+
+// A message that needs to be split into frames to fit within quota should
+// maintain correct semantics.
+TEST_F(WebSocketChannelFlowControlTest, SingleFrameMessageSplitSync) {
+ scoped_ptr<ReadableFakeWebSocketStream> stream(
+ new ReadableFakeWebSocketStream);
+ static const InitFrame frames[] = {
+ {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}};
+ stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames);
+ set_stream(stream.Pass());
+ {
+ InSequence s;
+ EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, _, _));
+ EXPECT_CALL(*event_interface_, OnFlowControl(_));
+ EXPECT_CALL(
+ *event_interface_,
+ OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("FO")));
+ EXPECT_CALL(
+ *event_interface_,
+ OnDataFrame(
+ false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("U")));
+ EXPECT_CALL(
+ *event_interface_,
+ OnDataFrame(
+ true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("R")));
+ }
+
+ CreateChannelAndConnectWithQuota(2);
+ channel_->SendFlowControl(1);
+ channel_->SendFlowControl(1);
+}
+
+// The code path for async messages is slightly different, so test it
+// separately.
+TEST_F(WebSocketChannelFlowControlTest, SingleFrameMessageSplitAsync) {
+ scoped_ptr<ReadableFakeWebSocketStream> stream(
+ new ReadableFakeWebSocketStream);
+ static const InitFrame frames[] = {
+ {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText, NOT_MASKED, "FOUR"}};
+ stream->PrepareReadFrames(ReadableFakeWebSocketStream::ASYNC, OK, frames);
+ set_stream(stream.Pass());
+ Checkpoint checkpoint;
+ {
+ InSequence s;
+ EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, _, _));
+ EXPECT_CALL(*event_interface_, OnFlowControl(_));
+ EXPECT_CALL(checkpoint, Call(1));
+ EXPECT_CALL(
+ *event_interface_,
+ OnDataFrame(false, WebSocketFrameHeader::kOpCodeText, AsVector("FO")));
+ EXPECT_CALL(checkpoint, Call(2));
+ EXPECT_CALL(
+ *event_interface_,
+ OnDataFrame(
+ false, WebSocketFrameHeader::kOpCodeContinuation, AsVector("U")));
+ EXPECT_CALL(checkpoint, Call(3));
+ EXPECT_CALL(
+ *event_interface_,
+ OnDataFrame(
+ true, WebSocketFrameHeader::kOpCodeContinuation, AsVector("R")));
+ }
+
+ CreateChannelAndConnectWithQuota(2);
+ checkpoint.Call(1);
+ base::MessageLoop::current()->RunUntilIdle();
+ checkpoint.Call(2);
+ channel_->SendFlowControl(1);
+ checkpoint.Call(3);
+ channel_->SendFlowControl(1);
+}
+
+// A message split into multiple frames which is further split due to quota
+// restrictions should stil be correct.
+// TODO(ricea): The message ends up split into more frames than are strictly
+// necessary. The complexity/performance tradeoffs here need further
+// examination.
+TEST_F(WebSocketChannelFlowControlTest, MultipleFrameSplit) {
+ scoped_ptr<ReadableFakeWebSocketStream> stream(
+ new ReadableFakeWebSocketStream);
+ static const InitFrame frames[] = {
+ {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeText,
+ NOT_MASKED, "FIRST FRAME IS 25 BYTES. "},
+ {NOT_FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation,
+ NOT_MASKED, "SECOND FRAME IS 26 BYTES. "},
+ {FINAL_FRAME, WebSocketFrameHeader::kOpCodeContinuation,
+ NOT_MASKED, "FINAL FRAME IS 24 BYTES."}};
+ stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames);
+ set_stream(stream.Pass());
+ {
+ InSequence s;
+ EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, _, _));
+ EXPECT_CALL(*event_interface_, OnFlowControl(_));
+ EXPECT_CALL(*event_interface_,
+ OnDataFrame(false,
+ WebSocketFrameHeader::kOpCodeText,
+ AsVector("FIRST FRAME IS")));
+ EXPECT_CALL(*event_interface_,
+ OnDataFrame(false,
+ WebSocketFrameHeader::kOpCodeContinuation,
+ AsVector(" 25 BYTES. ")));
+ EXPECT_CALL(*event_interface_,
+ OnDataFrame(false,
+ WebSocketFrameHeader::kOpCodeContinuation,
+ AsVector("SECOND FRAME IS 26 BYTES. ")));
+ EXPECT_CALL(*event_interface_,
+ OnDataFrame(false,
+ WebSocketFrameHeader::kOpCodeContinuation,
+ AsVector("FINAL ")));
+ EXPECT_CALL(*event_interface_,
+ OnDataFrame(true,
+ WebSocketFrameHeader::kOpCodeContinuation,
+ AsVector("FRAME IS 24 BYTES.")));
+ }
+ CreateChannelAndConnectWithQuota(14);
+ channel_->SendFlowControl(43);
+ channel_->SendFlowControl(32);
+}
+
+// An empty message handled when we are out of quota must not be delivered
+// out-of-order with respect to other messages.
+TEST_F(WebSocketChannelFlowControlTest, EmptyMessageNoQuota) {
+ scoped_ptr<ReadableFakeWebSocketStream> stream(
+ new ReadableFakeWebSocketStream);
+ static const InitFrame frames[] = {
+ {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText,
+ NOT_MASKED, "FIRST MESSAGE"},
+ {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText,
+ NOT_MASKED, ""},
+ {FINAL_FRAME, WebSocketFrameHeader::kOpCodeText,
+ NOT_MASKED, "THIRD MESSAGE"}};
+ stream->PrepareReadFrames(ReadableFakeWebSocketStream::SYNC, OK, frames);
+ set_stream(stream.Pass());
+ {
+ InSequence s;
+ EXPECT_CALL(*event_interface_, OnAddChannelResponse(false, _, _));
+ EXPECT_CALL(*event_interface_, OnFlowControl(_));
+ EXPECT_CALL(*event_interface_,
+ OnDataFrame(false,
+ WebSocketFrameHeader::kOpCodeText,
+ AsVector("FIRST ")));
+ EXPECT_CALL(*event_interface_,
+ OnDataFrame(true,
+ WebSocketFrameHeader::kOpCodeContinuation,
+ AsVector("MESSAGE")));
+ EXPECT_CALL(*event_interface_,
+ OnDataFrame(true,
+ WebSocketFrameHeader::kOpCodeText,
+ AsVector("")));
+ EXPECT_CALL(*event_interface_,
+ OnDataFrame(true,
+ WebSocketFrameHeader::kOpCodeText,
+ AsVector("THIRD MESSAGE")));
+ }
+
+ CreateChannelAndConnectWithQuota(6);
+ channel_->SendFlowControl(128);
+}
+
// RFC6455 5.1 "a client MUST mask all frames that it sends to the server".
// WebSocketChannel actually only sets the mask bit in the header, it doesn't
// perform masking itself (not all transports actually use masking).
@@ -2490,13 +2786,9 @@ TEST_F(WebSocketChannelStreamTest, WaitingMessagesAreBatched) {
write_callback.Run(OK);
}
-// When the renderer sends more on a channel than it has quota for, then we send
-// a kWebSocketMuxErrorSendQuotaViolation status code (from the draft websocket
-// mux specification) back to the renderer. This should not be sent to the
-// remote server, which may not even implement the mux specification, and could
-// even be using a different extension which uses that code to mean something
-// else.
-TEST_F(WebSocketChannelStreamTest, MuxErrorIsNotSentToStream) {
+// When the renderer sends more on a channel than it has quota for, we send the
+// remote server a kWebSocketErrorGoingAway error code.
+TEST_F(WebSocketChannelStreamTest, SendGoingAwayOnRendererQuotaExceeded) {
static const InitFrame expected[] = {
{FINAL_FRAME, WebSocketFrameHeader::kOpCodeClose,
MASKED, CLOSE_DATA(GOING_AWAY, "")}};
@@ -2974,6 +3266,7 @@ class WebSocketChannelStreamTimeoutTest : public WebSocketChannelStreamTest {
virtual void CreateChannelAndConnectSuccessfully() OVERRIDE {
set_stream(mock_stream_.Pass());
CreateChannelAndConnect();
+ channel_->SendFlowControl(kPlentyOfQuota);
channel_->SetClosingHandshakeTimeoutForTesting(
TimeDelta::FromMilliseconds(kVeryTinyTimeoutMillis));
connect_data_.creator.connect_delegate->OnSuccess(stream_.Pass());
diff --git a/net/websockets/websocket_job_test.cc b/net/websockets/websocket_job_test.cc
index 3d7d4242de..e12ddae81c 100644
--- a/net/websockets/websocket_job_test.cc
+++ b/net/websockets/websocket_job_test.cc
@@ -204,6 +204,12 @@ class MockCookieStore : public CookieStore {
callback.Run(GetCookiesWithOptions(url, options));
}
+ virtual void GetAllCookiesForURLAsync(
+ const GURL& url,
+ const GetCookieListCallback& callback) OVERRIDE {
+ ADD_FAILURE();
+ }
+
virtual void DeleteCookieAsync(const GURL& url,
const std::string& cookie_name,
const base::Closure& callback) OVERRIDE {