blob: 5d93d71497714173d0505f9e7a4ad9a523646532 [file] [log] [blame]
// Copyright (c) 2013 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/third_party/quic/platform/impl/quic_hostname_utils_impl.h"
#include "net/base/url_util.h"
#include "starboard/memory.h"
#include "url/gurl.h"
#include "url/url_canon.h"
namespace quic {
// static
bool QuicHostnameUtilsImpl::IsValidSNI(QuicStringPiece sni) {
// TODO(rtenneti): Support RFC2396 hostname.
// NOTE: Microsoft does NOT enforce this spec, so if we throw away hostnames
// based on the above spec, we may be losing some hostnames that windows
// would consider valid. By far the most common hostname character NOT
// accepted by the above spec is '_'.
url::CanonHostInfo host_info;
std::string canonicalized_host(
net::CanonicalizeHost(sni.as_string(), &host_info));
return !host_info.IsIPAddress() &&
net::IsCanonicalizedHostCompliant(canonicalized_host) &&
sni.find_last_of('.') != std::string::npos;
}
// static
QuicString QuicHostnameUtilsImpl::NormalizeHostname(QuicStringPiece hostname) {
url::CanonHostInfo host_info;
std::string host(net::CanonicalizeHost(
base::StringPiece(hostname.data(), hostname.size()), &host_info));
// Walk backwards over the string, stopping at the first trailing dot.
size_t host_end = host.length();
while (host_end != 0 && host[host_end - 1] == '.') {
host_end--;
}
// Erase the trailing dots.
if (host_end != host.length()) {
host.erase(host_end, host.length() - host_end);
}
return host;
}
} // namespace quic