blob: a945917408648c1373b537b6c126a41a41acd5f1 [file] [log] [blame]
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/http/http_alternate_protocols.h"
#include "base/logging.h"
#include "base/stl_util-inl.h"
namespace net {
const char HttpAlternateProtocols::kHeader[] = "Alternate-Protocol";
const char* const HttpAlternateProtocols::kProtocolStrings[] = {
"npn-spdy",
};
HttpAlternateProtocols::HttpAlternateProtocols() {}
HttpAlternateProtocols::~HttpAlternateProtocols() {}
bool HttpAlternateProtocols::HasAlternateProtocolFor(
const HostPortPair& http_host_port_pair) const {
return ContainsKey(protocol_map_, http_host_port_pair);
}
bool HttpAlternateProtocols::HasAlternateProtocolFor(
const std::string& host, uint16 port) const {
struct HostPortPair http_host_port_pair;
http_host_port_pair.host = host;
http_host_port_pair.port = port;
return HasAlternateProtocolFor(http_host_port_pair);
}
HttpAlternateProtocols::PortProtocolPair
HttpAlternateProtocols::GetAlternateProtocolFor(
const HostPortPair& http_host_port_pair) const {
DCHECK(ContainsKey(protocol_map_, http_host_port_pair));
return protocol_map_.find(http_host_port_pair)->second;
}
HttpAlternateProtocols::PortProtocolPair
HttpAlternateProtocols::GetAlternateProtocolFor(
const std::string& host, uint16 port) const {
struct HostPortPair http_host_port_pair;
http_host_port_pair.host = host;
http_host_port_pair.port = port;
return GetAlternateProtocolFor(http_host_port_pair);
}
void HttpAlternateProtocols::SetAlternateProtocolFor(
const HostPortPair& http_host_port_pair,
uint16 alternate_port,
Protocol alternate_protocol) {
if (alternate_protocol == BROKEN) {
LOG(DFATAL) << "Call MarkBrokenAlternateProtocolFor() instead.";
return;
}
PortProtocolPair alternate;
alternate.port = alternate_port;
alternate.protocol = alternate_protocol;
if (HasAlternateProtocolFor(http_host_port_pair)) {
const PortProtocolPair existing_alternate =
GetAlternateProtocolFor(http_host_port_pair);
if (existing_alternate.protocol == BROKEN) {
DLOG(INFO) << "Ignore alternate protocol since it's known to be broken.";
return;
}
if (alternate_protocol != BROKEN && !existing_alternate.Equals(alternate)) {
LOG(WARNING) << "Changing the alternate protocol for: "
<< http_host_port_pair.ToString()
<< " from [Port: " << existing_alternate.port
<< ", Protocol: " << existing_alternate.protocol
<< "] to [Port: " << alternate_port
<< ", Protocol: " << alternate_protocol
<< "].";
}
}
protocol_map_[http_host_port_pair] = alternate;
}
void HttpAlternateProtocols::MarkBrokenAlternateProtocolFor(
const HostPortPair& http_host_port_pair) {
protocol_map_[http_host_port_pair].protocol = BROKEN;
}
} // namespace net