| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_stream_factory.h" | 5 #include "net/quic/quic_stream_factory.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 #include "net/quic/crypto/quic_server_info.h" | 24 #include "net/quic/crypto/quic_server_info.h" |
| 25 #include "net/quic/port_suggester.h" | 25 #include "net/quic/port_suggester.h" |
| 26 #include "net/quic/quic_client_session.h" | 26 #include "net/quic/quic_client_session.h" |
| 27 #include "net/quic/quic_clock.h" | 27 #include "net/quic/quic_clock.h" |
| 28 #include "net/quic/quic_connection.h" | 28 #include "net/quic/quic_connection.h" |
| 29 #include "net/quic/quic_connection_helper.h" | 29 #include "net/quic/quic_connection_helper.h" |
| 30 #include "net/quic/quic_crypto_client_stream_factory.h" | 30 #include "net/quic/quic_crypto_client_stream_factory.h" |
| 31 #include "net/quic/quic_default_packet_writer.h" | 31 #include "net/quic/quic_default_packet_writer.h" |
| 32 #include "net/quic/quic_http_stream.h" | 32 #include "net/quic/quic_http_stream.h" |
| 33 #include "net/quic/quic_protocol.h" | 33 #include "net/quic/quic_protocol.h" |
| 34 #include "net/quic/quic_session_key.h" |
| 34 #include "net/socket/client_socket_factory.h" | 35 #include "net/socket/client_socket_factory.h" |
| 35 | 36 |
| 36 using std::string; | 37 using std::string; |
| 37 using std::vector; | 38 using std::vector; |
| 38 | 39 |
| 39 namespace net { | 40 namespace net { |
| 40 | 41 |
| 41 QuicStreamFactory::IpAliasKey::IpAliasKey() {} | 42 QuicStreamFactory::IpAliasKey::IpAliasKey() {} |
| 42 | 43 |
| 43 QuicStreamFactory::IpAliasKey::IpAliasKey(IPEndPoint ip_endpoint, | 44 QuicStreamFactory::IpAliasKey::IpAliasKey(IPEndPoint ip_endpoint, |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 const HttpServerProperties::NetworkStats* stats = | 647 const HttpServerProperties::NetworkStats* stats = |
| 647 http_server_properties_->GetServerNetworkStats(host_port_pair); | 648 http_server_properties_->GetServerNetworkStats(host_port_pair); |
| 648 if (stats != NULL) { | 649 if (stats != NULL) { |
| 649 config.set_initial_round_trip_time_us(stats->rtt.InMicroseconds(), | 650 config.set_initial_round_trip_time_us(stats->rtt.InMicroseconds(), |
| 650 stats->rtt.InMicroseconds()); | 651 stats->rtt.InMicroseconds()); |
| 651 } | 652 } |
| 652 } | 653 } |
| 653 | 654 |
| 654 *session = new QuicClientSession( | 655 *session = new QuicClientSession( |
| 655 connection, socket.Pass(), writer.Pass(), this, | 656 connection, socket.Pass(), writer.Pass(), this, |
| 656 quic_crypto_client_stream_factory_, host_port_pair.host(), | 657 quic_crypto_client_stream_factory_, session_key, config, crypto_config, |
| 657 config, crypto_config, net_log.net_log()); | 658 net_log.net_log()); |
| 658 all_sessions_.insert(*session); // owning pointer | 659 all_sessions_.insert(*session); // owning pointer |
| 659 if (is_https) { | 660 if (is_https) { |
| 660 crypto_config->SetProofVerifier( | 661 crypto_config->SetProofVerifier( |
| 661 new ProofVerifierChromium(cert_verifier, net_log)); | 662 new ProofVerifierChromium(cert_verifier, net_log)); |
| 662 } | 663 } |
| 663 return OK; | 664 return OK; |
| 664 } | 665 } |
| 665 | 666 |
| 666 bool QuicStreamFactory::HasActiveJob(const QuicSessionKey& key) const { | 667 bool QuicStreamFactory::HasActiveJob(const QuicSessionKey& key) const { |
| 667 return ContainsKey(active_jobs_, key); | 668 return ContainsKey(active_jobs_, key); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 685 | 686 |
| 686 if (ContainsKey(all_crypto_configs_, session_key)) { | 687 if (ContainsKey(all_crypto_configs_, session_key)) { |
| 687 crypto_config = all_crypto_configs_[session_key]; | 688 crypto_config = all_crypto_configs_[session_key]; |
| 688 DCHECK(crypto_config); | 689 DCHECK(crypto_config); |
| 689 } else { | 690 } else { |
| 690 // TODO(rtenneti): if two quic_sessions for the same host_port_pair | 691 // TODO(rtenneti): if two quic_sessions for the same host_port_pair |
| 691 // share the same crypto_config, will it cause issues? | 692 // share the same crypto_config, will it cause issues? |
| 692 crypto_config = new QuicCryptoClientConfig(); | 693 crypto_config = new QuicCryptoClientConfig(); |
| 693 if (quic_server_info_factory_) { | 694 if (quic_server_info_factory_) { |
| 694 QuicCryptoClientConfig::CachedState* cached = | 695 QuicCryptoClientConfig::CachedState* cached = |
| 695 crypto_config->Create(session_key.host_port_pair().host(), | 696 crypto_config->Create(session_key, quic_server_info_factory_); |
| 696 quic_server_info_factory_); | |
| 697 DCHECK(cached); | 697 DCHECK(cached); |
| 698 } | 698 } |
| 699 crypto_config->SetDefaults(); | 699 crypto_config->SetDefaults(); |
| 700 all_crypto_configs_[session_key] = crypto_config; | 700 all_crypto_configs_[session_key] = crypto_config; |
| 701 PopulateFromCanonicalConfig(session_key, crypto_config); | 701 PopulateFromCanonicalConfig(session_key, crypto_config); |
| 702 } | 702 } |
| 703 return crypto_config; | 703 return crypto_config; |
| 704 } | 704 } |
| 705 | 705 |
| 706 void QuicStreamFactory::PopulateFromCanonicalConfig( | 706 void QuicStreamFactory::PopulateFromCanonicalConfig( |
| 707 const QuicSessionKey& session_key, | 707 const QuicSessionKey& session_key, |
| 708 QuicCryptoClientConfig* crypto_config) { | 708 QuicCryptoClientConfig* crypto_config) { |
| 709 const string server_hostname = session_key.host_port_pair().host(); | 709 const string server_hostname = session_key.host_port_pair().host(); |
| 710 const uint16 server_port = session_key.host_port_pair().port(); | |
| 711 unsigned i = 0; | 710 unsigned i = 0; |
| 712 for (; i < canoncial_suffixes_.size(); ++i) { | 711 for (; i < canoncial_suffixes_.size(); ++i) { |
| 713 if (EndsWith(server_hostname, canoncial_suffixes_[i], false)) { | 712 if (EndsWith(server_hostname, canoncial_suffixes_[i], false)) { |
| 714 break; | 713 break; |
| 715 } | 714 } |
| 716 } | 715 } |
| 717 if (i == canoncial_suffixes_.size()) | 716 if (i == canoncial_suffixes_.size()) |
| 718 return; | 717 return; |
| 719 | 718 |
| 720 HostPortPair suffix_host_port_pair(canoncial_suffixes_[i], server_port); | 719 HostPortPair suffix_host_port_pair(canoncial_suffixes_[i], |
| 720 session_key.host_port_pair().port()); |
| 721 QuicSessionKey suffix_session_key(suffix_host_port_pair, | 721 QuicSessionKey suffix_session_key(suffix_host_port_pair, |
| 722 session_key.is_https()); | 722 session_key.is_https()); |
| 723 if (!ContainsKey(canonical_hostname_to_origin_map_, suffix_session_key)) { | 723 if (!ContainsKey(canonical_hostname_to_origin_map_, suffix_session_key)) { |
| 724 // This is the first host we've seen which matches the suffix, so make it | 724 // This is the first host we've seen which matches the suffix, so make it |
| 725 // canonical. | 725 // canonical. |
| 726 canonical_hostname_to_origin_map_[suffix_session_key] = session_key; | 726 canonical_hostname_to_origin_map_[suffix_session_key] = session_key; |
| 727 return; | 727 return; |
| 728 } | 728 } |
| 729 | 729 |
| 730 const QuicSessionKey& canonical_session_key = | 730 const QuicSessionKey& canonical_session_key = |
| 731 canonical_hostname_to_origin_map_[suffix_session_key]; | 731 canonical_hostname_to_origin_map_[suffix_session_key]; |
| 732 QuicCryptoClientConfig* canonical_crypto_config = | 732 QuicCryptoClientConfig* canonical_crypto_config = |
| 733 all_crypto_configs_[canonical_session_key]; | 733 all_crypto_configs_[canonical_session_key]; |
| 734 DCHECK(canonical_crypto_config); | 734 DCHECK(canonical_crypto_config); |
| 735 const HostPortPair& canonical_host_port_pair = | |
| 736 canonical_session_key.host_port_pair(); | |
| 737 | 735 |
| 738 // Copy the CachedState for the canonical server from canonical_crypto_config | 736 // Copy the CachedState for the canonical server from canonical_crypto_config |
| 739 // as the initial CachedState for the server_hostname in crypto_config. | 737 // as the initial CachedState for the server_hostname in crypto_config. |
| 740 crypto_config->InitializeFrom(server_hostname, | 738 crypto_config->InitializeFrom(session_key, canonical_session_key, |
| 741 canonical_host_port_pair.host(), | |
| 742 canonical_crypto_config); | 739 canonical_crypto_config); |
| 743 // Update canonical version to point at the "most recent" crypto_config. | 740 // Update canonical version to point at the "most recent" crypto_config. |
| 744 canonical_hostname_to_origin_map_[suffix_session_key] = | 741 canonical_hostname_to_origin_map_[suffix_session_key] = |
| 745 canonical_session_key; | 742 canonical_session_key; |
| 746 } | 743 } |
| 747 | 744 |
| 748 } // namespace net | 745 } // namespace net |
| OLD | NEW |