| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/field_trial.h" | 8 #include "base/field_trial.h" |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/histogram.h" | 10 #include "base/histogram.h" |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 if (request_info->extra_headers.GetHeader(HttpRequestHeaders::kUserAgent, | 148 if (request_info->extra_headers.GetHeader(HttpRequestHeaders::kUserAgent, |
| 149 &user_agent)) | 149 &user_agent)) |
| 150 request_headers->SetHeader(HttpRequestHeaders::kUserAgent, user_agent); | 150 request_headers->SetHeader(HttpRequestHeaders::kUserAgent, user_agent); |
| 151 | 151 |
| 152 request_headers->MergeFrom(authorization_headers); | 152 request_headers->MergeFrom(authorization_headers); |
| 153 } | 153 } |
| 154 | 154 |
| 155 void ProcessAlternateProtocol(const HttpResponseHeaders& headers, | 155 void ProcessAlternateProtocol(const HttpResponseHeaders& headers, |
| 156 const HostPortPair& http_host_port_pair, | 156 const HostPortPair& http_host_port_pair, |
| 157 HttpAlternateProtocols* alternate_protocols) { | 157 HttpAlternateProtocols* alternate_protocols) { |
| 158 if (!g_next_protos || g_next_protos->empty()) { | |
| 159 // This implies that NPN is not supported. We don't currently support any | |
| 160 // alternate protocols that don't use NPN. | |
| 161 return; | |
| 162 } | |
| 163 | 158 |
| 164 std::string alternate_protocol_str; | 159 std::string alternate_protocol_str; |
| 165 if (!headers.EnumerateHeader(NULL, HttpAlternateProtocols::kHeader, | 160 if (!headers.EnumerateHeader(NULL, HttpAlternateProtocols::kHeader, |
| 166 &alternate_protocol_str)) { | 161 &alternate_protocol_str)) { |
| 167 // Header is not present. | 162 // Header is not present. |
| 168 return; | 163 return; |
| 169 } | 164 } |
| 170 | 165 |
| 171 std::vector<std::string> port_protocol_vector; | 166 std::vector<std::string> port_protocol_vector; |
| 172 SplitString(alternate_protocol_str, ':', &port_protocol_vector); | 167 SplitString(alternate_protocol_str, ':', &port_protocol_vector); |
| (...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 756 url_canon::Replacements<char> replacements; | 751 url_canon::Replacements<char> replacements; |
| 757 const std::string port_str = IntToString(endpoint_.port); | 752 const std::string port_str = IntToString(endpoint_.port); |
| 758 replacements.SetPort(port_str.c_str(), | 753 replacements.SetPort(port_str.c_str(), |
| 759 url_parse::Component(0, port_str.size())); | 754 url_parse::Component(0, port_str.size())); |
| 760 replacements.SetHost(endpoint_.host.c_str(), | 755 replacements.SetHost(endpoint_.host.c_str(), |
| 761 url_parse::Component(0, endpoint_.host.size())); | 756 url_parse::Component(0, endpoint_.host.size())); |
| 762 alternate_endpoint_url = curr_endpoint_url->ReplaceComponents(replacements); | 757 alternate_endpoint_url = curr_endpoint_url->ReplaceComponents(replacements); |
| 763 curr_endpoint_url = &alternate_endpoint_url; | 758 curr_endpoint_url = &alternate_endpoint_url; |
| 764 } | 759 } |
| 765 | 760 |
| 766 if (alternate_protocol_mode_ == kUnspecified) { | 761 const HttpAlternateProtocols& alternate_protocols = |
| 767 const HttpAlternateProtocols& alternate_protocols = | 762 session_->alternate_protocols(); |
| 768 session_->alternate_protocols(); | 763 if (alternate_protocols.HasAlternateProtocolFor(endpoint_)) { |
| 769 if (alternate_protocols.HasAlternateProtocolFor(endpoint_)) { | 764 response_.was_alternate_protocol_available = true; |
| 765 if (alternate_protocol_mode_ == kUnspecified) { |
| 770 HttpAlternateProtocols::PortProtocolPair alternate = | 766 HttpAlternateProtocols::PortProtocolPair alternate = |
| 771 alternate_protocols.GetAlternateProtocolFor(endpoint_); | 767 alternate_protocols.GetAlternateProtocolFor(endpoint_); |
| 772 if (alternate.protocol != HttpAlternateProtocols::BROKEN) { | 768 if (alternate.protocol != HttpAlternateProtocols::BROKEN) { |
| 773 DCHECK_EQ(HttpAlternateProtocols::NPN_SPDY_1, alternate.protocol); | 769 DCHECK_EQ(HttpAlternateProtocols::NPN_SPDY_1, alternate.protocol); |
| 774 endpoint_.port = alternate.port; | 770 endpoint_.port = alternate.port; |
| 775 alternate_protocol_ = HttpAlternateProtocols::NPN_SPDY_1; | 771 alternate_protocol_ = HttpAlternateProtocols::NPN_SPDY_1; |
| 776 alternate_protocol_mode_ = kUsingAlternateProtocol; | 772 alternate_protocol_mode_ = kUsingAlternateProtocol; |
| 777 | 773 |
| 778 url_canon::Replacements<char> replacements; | 774 url_canon::Replacements<char> replacements; |
| 779 replacements.SetScheme("https", | 775 replacements.SetScheme("https", |
| (...skipping 1252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2032 endpoint_); | 2028 endpoint_); |
| 2033 | 2029 |
| 2034 alternate_protocol_mode_ = kDoNotUseAlternateProtocol; | 2030 alternate_protocol_mode_ = kDoNotUseAlternateProtocol; |
| 2035 if (connection_->socket()) | 2031 if (connection_->socket()) |
| 2036 connection_->socket()->Disconnect(); | 2032 connection_->socket()->Disconnect(); |
| 2037 connection_->Reset(); | 2033 connection_->Reset(); |
| 2038 next_state_ = STATE_INIT_CONNECTION; | 2034 next_state_ = STATE_INIT_CONNECTION; |
| 2039 } | 2035 } |
| 2040 | 2036 |
| 2041 } // namespace net | 2037 } // namespace net |
| OLD | NEW |