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

Side by Side Diff: net/http/http_stream_factory_impl.cc

Issue 665083009: ABANDONED Handle multiple AlternateProtocols for each HostPortPair. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase and a bunch of other changes. Created 5 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
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/http/http_stream_factory_impl.h" 5 #include "net/http/http_stream_factory_impl.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 server_ssl_config, proxy_ssl_config, session_->net_log()); 164 server_ssl_config, proxy_ssl_config, session_->net_log());
165 } 165 }
166 preconnect_job_set_.insert(job); 166 preconnect_job_set_.insert(job);
167 job->Preconnect(num_streams); 167 job->Preconnect(num_streams);
168 } 168 }
169 169
170 const HostMappingRules* HttpStreamFactoryImpl::GetHostMappingRules() const { 170 const HostMappingRules* HttpStreamFactoryImpl::GetHostMappingRules() const {
171 return session_->params().host_mapping_rules; 171 return session_->params().host_mapping_rules;
172 } 172 }
173 173
174 AlternateProtocolInfo HttpStreamFactoryImpl::GetAlternateProtocolRequestFor( 174 AlternateProtocolInfo HttpStreamFactoryImpl::GetAlternateProtocolRequestFor(
Ryan Hamilton 2015/02/27 18:20:48 As discussed yesterday, I think this needs to retu
Bence 2015/02/27 19:31:41 Absolutely. Now even after this CL we can only ha
175 const GURL& original_url, 175 const GURL& original_url,
176 GURL* alternate_url) { 176 GURL* alternate_url) {
177 const AlternateProtocolInfo kNoAlternateProtocol; 177 const AlternateProtocolInfo kNoAlternateProtocol;
178 178
179 if (!session_->params().use_alternate_protocols) 179 if (!session_->params().use_alternate_protocols)
180 return kNoAlternateProtocol; 180 return kNoAlternateProtocol;
181 181
182 if (original_url.SchemeIs("ftp")) 182 if (original_url.SchemeIs("ftp"))
183 return kNoAlternateProtocol; 183 return kNoAlternateProtocol;
184 184
185 HostPortPair origin = HostPortPair::FromURL(original_url); 185 HostPortPair origin = HostPortPair::FromURL(original_url);
186 HttpServerProperties& http_server_properties = 186 HttpServerProperties& http_server_properties =
187 *session_->http_server_properties(); 187 *session_->http_server_properties();
188 const AlternateProtocolInfo alternate = 188 AlternateProtocols alternate_protocols =
189 http_server_properties.GetAlternateProtocol(origin); 189 http_server_properties.GetAlternateProtocols(origin);
190 if (alternate_protocols.empty())
191 return kNoAlternateProtocol;
192 for (AlternateProtocols::iterator alternate = alternate_protocols.begin();
193 alternate != alternate_protocols.end(); ++alternate) {
Ryan Hamilton 2015/02/27 18:20:48 Can you use a C++ range based for loop here?
Bence 2015/02/27 19:31:41 Done.
194 if (alternate->is_broken) {
195 HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_BROKEN);
196 continue;
197 }
190 198
191 if (alternate.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) 199 // Some shared unix systems may have user home directories (like
192 return kNoAlternateProtocol; 200 // http://foo.com/~mike) which allow users to emit headers. This is a bad
193 if (alternate.is_broken) { 201 // idea already, but with Alternate-Protocol, it provides the ability for a
194 HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_BROKEN); 202 // single user on a multi-user system to hijack the alternate protocol.
195 return kNoAlternateProtocol; 203 // These systems also enforce ports <1024 as restricted ports. So don't
204 // allow protocol upgrades to user-controllable ports.
205 const int kUnrestrictedPort = 1024;
206 if (!session_->params().enable_user_alternate_protocol_ports &&
207 (alternate->port >= kUnrestrictedPort &&
208 origin.port() < kUnrestrictedPort))
209 continue;
210
211 origin.set_port(alternate->port);
212 if (alternate->protocol >= NPN_SPDY_MINIMUM_VERSION &&
213 alternate->protocol <= NPN_SPDY_MAXIMUM_VERSION) {
214 if (!HttpStreamFactory::spdy_enabled())
215 continue;
216
217 if (session_->HasSpdyExclusion(origin))
218 continue;
219
220 *alternate_url = UpgradeUrlToHttps(original_url, alternate->port);
221 return *alternate;
222 } else {
223 DCHECK_EQ(QUIC, alternate->protocol);
224 if (!session_->params().enable_quic)
225 continue;
226
227 // TODO(rch): Figure out how to make QUIC iteract with PAC
228 // scripts. By not re-writing the URL, we will query the PAC script
229 // for the proxy to use to reach the original URL via TCP. But
230 // the alternate request will be going via UDP to a different port.
231 *alternate_url = original_url;
232 return *alternate;
233 }
196 } 234 }
197 if (!IsAlternateProtocolValid(alternate.protocol)) { 235 return kNoAlternateProtocol;
198 NOTREACHED();
199 return kNoAlternateProtocol;
200 }
201
202 // Some shared unix systems may have user home directories (like
203 // http://foo.com/~mike) which allow users to emit headers. This is a bad
204 // idea already, but with Alternate-Protocol, it provides the ability for a
205 // single user on a multi-user system to hijack the alternate protocol.
206 // These systems also enforce ports <1024 as restricted ports. So don't
207 // allow protocol upgrades to user-controllable ports.
208 const int kUnrestrictedPort = 1024;
209 if (!session_->params().enable_user_alternate_protocol_ports &&
210 (alternate.port >= kUnrestrictedPort &&
211 origin.port() < kUnrestrictedPort))
212 return kNoAlternateProtocol;
213
214 origin.set_port(alternate.port);
215 if (alternate.protocol >= NPN_SPDY_MINIMUM_VERSION &&
216 alternate.protocol <= NPN_SPDY_MAXIMUM_VERSION) {
217 if (!HttpStreamFactory::spdy_enabled())
218 return kNoAlternateProtocol;
219
220 if (session_->HasSpdyExclusion(origin))
221 return kNoAlternateProtocol;
222
223 *alternate_url = UpgradeUrlToHttps(original_url, alternate.port);
224 } else {
225 DCHECK_EQ(QUIC, alternate.protocol);
226 if (!session_->params().enable_quic)
227 return kNoAlternateProtocol;
228
229 // TODO(rch): Figure out how to make QUIC iteract with PAC
230 // scripts. By not re-writing the URL, we will query the PAC script
231 // for the proxy to use to reach the original URL via TCP. But
232 // the alternate request will be going via UDP to a different port.
233 *alternate_url = original_url;
234 }
235 return alternate;
236 } 236 }
237 237
238 void HttpStreamFactoryImpl::OrphanJob(Job* job, const Request* request) { 238 void HttpStreamFactoryImpl::OrphanJob(Job* job, const Request* request) {
239 DCHECK(ContainsKey(request_map_, job)); 239 DCHECK(ContainsKey(request_map_, job));
240 DCHECK_EQ(request_map_[job], request); 240 DCHECK_EQ(request_map_[job], request);
241 DCHECK(!ContainsKey(orphaned_job_set_, job)); 241 DCHECK(!ContainsKey(orphaned_job_set_, job));
242 242
243 request_map_.erase(job); 243 request_map_.erase(job);
244 244
245 orphaned_job_set_.insert(job); 245 orphaned_job_set_.insert(job);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 delete job; 294 delete job;
295 } 295 }
296 296
297 void HttpStreamFactoryImpl::OnPreconnectsComplete(const Job* job) { 297 void HttpStreamFactoryImpl::OnPreconnectsComplete(const Job* job) {
298 preconnect_job_set_.erase(job); 298 preconnect_job_set_.erase(job);
299 delete job; 299 delete job;
300 OnPreconnectsCompleteInternal(); 300 OnPreconnectsCompleteInternal();
301 } 301 }
302 302
303 } // namespace net 303 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698