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
3 // found in the LICENSE file.
5 #include "net/http/http_stream_factory.h"
7 #include "base/logging.h"
8 #include "base/strings/string_number_conversions.h"
9 #include "base/strings/string_split.h"
10 #include "base/strings/string_util.h"
11 #include "net/base/host_mapping_rules.h"
12 #include "net/base/host_port_pair.h"
13 #include "net/http/http_network_session.h"
18 // WARNING: If you modify or add any static flags, you must keep them in sync
19 // with |ResetStaticSettingsToInit|. This is critical for unit test isolation.
22 bool HttpStreamFactory::spdy_enabled_
= true;
24 HttpStreamFactory::~HttpStreamFactory() {}
27 void HttpStreamFactory::ResetStaticSettingsToInit() {
31 void HttpStreamFactory::ProcessAlternateProtocol(
32 const base::WeakPtr
<HttpServerProperties
>& http_server_properties
,
33 const std::vector
<std::string
>& alternate_protocol_values
,
34 const HostPortPair
& http_host_port_pair
,
35 const HttpNetworkSession
& session
) {
36 AlternateProtocol protocol
= UNINITIALIZED_ALTERNATE_PROTOCOL
;
38 double probability
= 1;
39 for (size_t i
= 0; i
< alternate_protocol_values
.size(); ++i
) {
40 const std::string
& alternate_protocol_str
= alternate_protocol_values
[i
];
41 if (StartsWithASCII(alternate_protocol_str
, "p=", true)) {
42 if (!base::StringToDouble(alternate_protocol_str
.substr(2),
44 probability
< 0 || probability
> 1) {
45 DVLOG(1) << kAlternateProtocolHeader
46 << " header has unrecognizable probability: "
47 << alternate_protocol_values
[i
];
53 std::vector
<std::string
> port_protocol_vector
;
54 base::SplitString(alternate_protocol_str
, ':', &port_protocol_vector
);
55 if (port_protocol_vector
.size() != 2) {
56 DVLOG(1) << kAlternateProtocolHeader
57 << " header has too many tokens: "
58 << alternate_protocol_str
;
62 if (!base::StringToInt(port_protocol_vector
[0], &port
) ||
63 port
== 0 || !IsPortValid(port
)) {
64 DVLOG(1) << kAlternateProtocolHeader
65 << " header has unrecognizable port: "
66 << port_protocol_vector
[0];
70 protocol
= AlternateProtocolFromString(port_protocol_vector
[1]);
72 if (IsAlternateProtocolValid(protocol
) &&
73 !session
.IsProtocolEnabled(protocol
)) {
74 DVLOG(1) << kAlternateProtocolHeader
75 << " header has unrecognized protocol: "
76 << port_protocol_vector
[1];
81 if (protocol
== UNINITIALIZED_ALTERNATE_PROTOCOL
)
84 HostPortPair
host_port(http_host_port_pair
);
85 const HostMappingRules
* mapping_rules
= GetHostMappingRules();
87 mapping_rules
->RewriteHost(&host_port
);
89 http_server_properties
->SetAlternateProtocol(
90 host_port
, static_cast<uint16
>(port
), protocol
, probability
);
93 GURL
HttpStreamFactory::ApplyHostMappingRules(const GURL
& url
,
94 HostPortPair
* endpoint
) {
95 const HostMappingRules
* mapping_rules
= GetHostMappingRules();
96 if (mapping_rules
&& mapping_rules
->RewriteHost(endpoint
)) {
97 url::Replacements
<char> replacements
;
98 const std::string port_str
= base::IntToString(endpoint
->port());
99 replacements
.SetPort(port_str
.c_str(), url::Component(0, port_str
.size()));
100 replacements
.SetHost(endpoint
->host().c_str(),
101 url::Component(0, endpoint
->host().size()));
102 return url
.ReplaceComponents(replacements
);
107 HttpStreamFactory::HttpStreamFactory() {}