// Copyright (c) 2017 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 "common/platform/api/quiche_hostname_utils.h"

#include <string>

#include "absl/strings/string_view.h"
#include "url/url_canon.h"
#include "url/url_canon_stdstring.h"
#include "common/platform/api/quiche_logging.h"

namespace quiche {

// TODO(vasilvv): the functions below are forked from Chromium's
// net/base/url_util.h; those should be moved to googleurl.
namespace {

std::string CanonicalizeHost(absl::string_view host,
                             url::CanonHostInfo* host_info) {
  // Try to canonicalize the host.
  const url::Component raw_host_component(0, static_cast<int>(host.length()));
  std::string canon_host;
  url::StdStringCanonOutput canon_host_output(&canon_host);
  url::CanonicalizeHostVerbose(host.data(), raw_host_component,
                               &canon_host_output, host_info);

  if (host_info->out_host.is_nonempty() &&
      host_info->family != url::CanonHostInfo::BROKEN) {
    // Success!  Assert that there's no extra garbage.
    canon_host_output.Complete();
    QUICHE_DCHECK_EQ(host_info->out_host.len,
                     static_cast<int>(canon_host.length()));
  } else {
    // Empty host, or canonicalization failed.  We'll return empty.
    canon_host.clear();
  }

  return canon_host;
}

bool IsHostCharAlphanumeric(char c) {
  // We can just check lowercase because uppercase characters have already been
  // normalized.
  return ((c >= 'a') && (c <= 'z')) || ((c >= '0') && (c <= '9'));
}

bool IsCanonicalizedHostCompliant(const std::string& host) {
  if (host.empty()) {
    return false;
  }

  bool in_component = false;
  bool most_recent_component_started_alphanumeric = false;

  for (char c : host) {
    if (!in_component) {
      most_recent_component_started_alphanumeric = IsHostCharAlphanumeric(c);
      if (!most_recent_component_started_alphanumeric && (c != '-') &&
          (c != '_')) {
        return false;
      }
      in_component = true;
    } else if (c == '.') {
      in_component = false;
    } else if (!IsHostCharAlphanumeric(c) && (c != '-') && (c != '_')) {
      return false;
    }
  }

  return most_recent_component_started_alphanumeric;
}

}  // namespace

// static
bool QuicheHostnameUtils::IsValidSNI(absl::string_view 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 = CanonicalizeHost(sni, &host_info);
  return !host_info.IsIPAddress() &&
         IsCanonicalizedHostCompliant(canonicalized_host);
}

// static
std::string QuicheHostnameUtils::NormalizeHostname(absl::string_view hostname) {
  url::CanonHostInfo host_info;
  std::string host = CanonicalizeHost(hostname, &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 quiche
