Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: net/quic/quic_stream_factory.cc

Issue 192583004: QUIC - use QuicSessionKey tuple (host, port, is_https) instead of server_hostname (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge with TOT Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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 namespace { 42 namespace {
42 43
43 const uint64 kBrokenAlternateProtocolDelaySecs = 300; 44 const uint64 kBrokenAlternateProtocolDelaySecs = 300;
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 active_requests_[request] = job; 393 active_requests_[request] = job;
393 job_requests_map_[job].insert(request); 394 job_requests_map_[job].insert(request);
394 return ERR_IO_PENDING; 395 return ERR_IO_PENDING;
395 } 396 }
396 397
397 QuicServerInfo* quic_server_info = NULL; 398 QuicServerInfo* quic_server_info = NULL;
398 if (quic_server_info_factory_) { 399 if (quic_server_info_factory_) {
399 QuicCryptoClientConfig* crypto_config = 400 QuicCryptoClientConfig* crypto_config =
400 GetOrCreateCryptoConfig(session_key); 401 GetOrCreateCryptoConfig(session_key);
401 QuicCryptoClientConfig::CachedState* cached = 402 QuicCryptoClientConfig::CachedState* cached =
402 crypto_config->LookupOrCreate(session_key.host_port_pair().host()); 403 crypto_config->LookupOrCreate(session_key);
403 DCHECK(cached); 404 DCHECK(cached);
404 if (cached->IsEmpty()) { 405 if (cached->IsEmpty()) {
405 quic_server_info = 406 quic_server_info = quic_server_info_factory_->GetForServer(session_key);
406 quic_server_info_factory_->GetForHost(host_port_pair.host());
407 } 407 }
408 } 408 }
409 scoped_ptr<Job> job(new Job(this, host_resolver_, host_port_pair, 409 scoped_ptr<Job> job(new Job(this, host_resolver_, host_port_pair,
410 is_https, method, cert_verifier, 410 is_https, method, cert_verifier,
411 quic_server_info, net_log)); 411 quic_server_info, net_log));
412 int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete, 412 int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete,
413 base::Unretained(this), job.get())); 413 base::Unretained(this), job.get()));
414 414
415 if (rv == ERR_IO_PENDING) { 415 if (rv == ERR_IO_PENDING) {
416 active_requests_[request] = job.get(); 416 active_requests_[request] = job.get();
(...skipping 14 matching lines...) Expand all
431 for (size_t i = 0; i < address_list.size(); ++i) { 431 for (size_t i = 0; i < address_list.size(); ++i) {
432 const IPEndPoint& address = address_list[i]; 432 const IPEndPoint& address = address_list[i];
433 const IpAliasKey ip_alias_key(address, session_key.is_https()); 433 const IpAliasKey ip_alias_key(address, session_key.is_https());
434 if (!ContainsKey(ip_aliases_, ip_alias_key)) 434 if (!ContainsKey(ip_aliases_, ip_alias_key))
435 continue; 435 continue;
436 436
437 const SessionSet& sessions = ip_aliases_[ip_alias_key]; 437 const SessionSet& sessions = ip_aliases_[ip_alias_key];
438 for (SessionSet::const_iterator i = sessions.begin(); 438 for (SessionSet::const_iterator i = sessions.begin();
439 i != sessions.end(); ++i) { 439 i != sessions.end(); ++i) {
440 QuicClientSession* session = *i; 440 QuicClientSession* session = *i;
441 if (!session->CanPool(session_key.host_port_pair().host())) 441 if (!session->CanPool(session_key.host()))
442 continue; 442 continue;
443 active_sessions_[session_key] = session; 443 active_sessions_[session_key] = session;
444 session_aliases_[session].insert(session_key); 444 session_aliases_[session].insert(session_key);
445 return true; 445 return true;
446 } 446 }
447 } 447 }
448 return false; 448 return false;
449 } 449 }
450 450
451 void QuicStreamFactory::OnJobComplete(Job* job, int rv) { 451 void QuicStreamFactory::OnJobComplete(Job* job, int rv) {
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 const HttpServerProperties::NetworkStats* stats = 708 const HttpServerProperties::NetworkStats* stats =
709 http_server_properties_->GetServerNetworkStats(host_port_pair); 709 http_server_properties_->GetServerNetworkStats(host_port_pair);
710 if (stats != NULL) { 710 if (stats != NULL) {
711 config.set_initial_round_trip_time_us(stats->rtt.InMicroseconds(), 711 config.set_initial_round_trip_time_us(stats->rtt.InMicroseconds(),
712 stats->rtt.InMicroseconds()); 712 stats->rtt.InMicroseconds());
713 } 713 }
714 } 714 }
715 715
716 *session = new QuicClientSession( 716 *session = new QuicClientSession(
717 connection, socket.Pass(), writer.Pass(), this, server_info.Pass(), 717 connection, socket.Pass(), writer.Pass(), this, server_info.Pass(),
718 quic_crypto_client_stream_factory_, host_port_pair.host(), 718 quic_crypto_client_stream_factory_, session_key, config, crypto_config,
719 config, crypto_config, net_log.net_log()); 719 net_log.net_log());
720 all_sessions_.insert(*session); // owning pointer 720 all_sessions_.insert(*session); // owning pointer
721 if (is_https) { 721 if (is_https) {
722 crypto_config->SetProofVerifier( 722 crypto_config->SetProofVerifier(
723 new ProofVerifierChromium(cert_verifier, net_log)); 723 new ProofVerifierChromium(cert_verifier, net_log));
724 } 724 }
725 return OK; 725 return OK;
726 } 726 }
727 727
728 bool QuicStreamFactory::HasActiveJob(const QuicSessionKey& key) const { 728 bool QuicStreamFactory::HasActiveJob(const QuicSessionKey& key) const {
729 return ContainsKey(active_jobs_, key); 729 return ContainsKey(active_jobs_, key);
(...skipping 25 matching lines...) Expand all
755 crypto_config->SetDefaults(); 755 crypto_config->SetDefaults();
756 all_crypto_configs_[session_key] = crypto_config; 756 all_crypto_configs_[session_key] = crypto_config;
757 PopulateFromCanonicalConfig(session_key, crypto_config); 757 PopulateFromCanonicalConfig(session_key, crypto_config);
758 } 758 }
759 return crypto_config; 759 return crypto_config;
760 } 760 }
761 761
762 void QuicStreamFactory::PopulateFromCanonicalConfig( 762 void QuicStreamFactory::PopulateFromCanonicalConfig(
763 const QuicSessionKey& session_key, 763 const QuicSessionKey& session_key,
764 QuicCryptoClientConfig* crypto_config) { 764 QuicCryptoClientConfig* crypto_config) {
765 const string server_hostname = session_key.host_port_pair().host(); 765 const string server_hostname = session_key.host();
766 const uint16 server_port = session_key.host_port_pair().port();
767 unsigned i = 0; 766 unsigned i = 0;
768 for (; i < canoncial_suffixes_.size(); ++i) { 767 for (; i < canoncial_suffixes_.size(); ++i) {
769 if (EndsWith(server_hostname, canoncial_suffixes_[i], false)) { 768 if (EndsWith(server_hostname, canoncial_suffixes_[i], false)) {
770 break; 769 break;
771 } 770 }
772 } 771 }
773 if (i == canoncial_suffixes_.size()) 772 if (i == canoncial_suffixes_.size())
774 return; 773 return;
775 774
776 HostPortPair suffix_host_port_pair(canoncial_suffixes_[i], server_port); 775 HostPortPair suffix_host_port_pair(canoncial_suffixes_[i],
776 session_key.port());
777 QuicSessionKey suffix_session_key(suffix_host_port_pair, 777 QuicSessionKey suffix_session_key(suffix_host_port_pair,
778 session_key.is_https()); 778 session_key.is_https());
779 if (!ContainsKey(canonical_hostname_to_origin_map_, suffix_session_key)) { 779 if (!ContainsKey(canonical_hostname_to_origin_map_, suffix_session_key)) {
780 // This is the first host we've seen which matches the suffix, so make it 780 // This is the first host we've seen which matches the suffix, so make it
781 // canonical. 781 // canonical.
782 canonical_hostname_to_origin_map_[suffix_session_key] = session_key; 782 canonical_hostname_to_origin_map_[suffix_session_key] = session_key;
783 return; 783 return;
784 } 784 }
785 785
786 const QuicSessionKey& canonical_session_key = 786 const QuicSessionKey& canonical_session_key =
787 canonical_hostname_to_origin_map_[suffix_session_key]; 787 canonical_hostname_to_origin_map_[suffix_session_key];
788 QuicCryptoClientConfig* canonical_crypto_config = 788 QuicCryptoClientConfig* canonical_crypto_config =
789 all_crypto_configs_[canonical_session_key]; 789 all_crypto_configs_[canonical_session_key];
790 DCHECK(canonical_crypto_config); 790 DCHECK(canonical_crypto_config);
791 const HostPortPair& canonical_host_port_pair =
792 canonical_session_key.host_port_pair();
793 791
794 // Copy the CachedState for the canonical server from canonical_crypto_config 792 // Copy the CachedState for the canonical server from canonical_crypto_config
795 // as the initial CachedState for the server_hostname in crypto_config. 793 // as the initial CachedState for the server_hostname in crypto_config.
796 crypto_config->InitializeFrom(server_hostname, 794 crypto_config->InitializeFrom(session_key, canonical_session_key,
797 canonical_host_port_pair.host(),
798 canonical_crypto_config); 795 canonical_crypto_config);
799 // Update canonical version to point at the "most recent" crypto_config. 796 // Update canonical version to point at the "most recent" crypto_config.
800 canonical_hostname_to_origin_map_[suffix_session_key] = 797 canonical_hostname_to_origin_map_[suffix_session_key] =
801 canonical_session_key; 798 canonical_session_key;
802 } 799 }
803 800
804 void QuicStreamFactory::ExpireBrokenAlternateProtocolMappings() { 801 void QuicStreamFactory::ExpireBrokenAlternateProtocolMappings() {
805 base::TimeTicks now = base::TimeTicks::Now(); 802 base::TimeTicks now = base::TimeTicks::Now();
806 while (!broken_alternate_protocol_list_.empty()) { 803 while (!broken_alternate_protocol_list_.empty()) {
807 BrokenAlternateProtocolEntry entry = 804 BrokenAlternateProtocolEntry entry =
(...skipping 16 matching lines...) Expand all
824 base::TimeTicks when = broken_alternate_protocol_list_.front().when; 821 base::TimeTicks when = broken_alternate_protocol_list_.front().when;
825 base::TimeDelta delay = when > now ? when - now : base::TimeDelta(); 822 base::TimeDelta delay = when > now ? when - now : base::TimeDelta();
826 base::MessageLoop::current()->PostDelayedTask( 823 base::MessageLoop::current()->PostDelayedTask(
827 FROM_HERE, 824 FROM_HERE,
828 base::Bind(&QuicStreamFactory::ExpireBrokenAlternateProtocolMappings, 825 base::Bind(&QuicStreamFactory::ExpireBrokenAlternateProtocolMappings,
829 weak_factory_.GetWeakPtr()), 826 weak_factory_.GetWeakPtr()),
830 delay); 827 delay);
831 } 828 }
832 829
833 } // namespace net 830 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698