// Copyright (c) 2012 The Chromium OS 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 "shill/http_url.h"

#include <string>
#include <vector>

#include <base/strings/string_number_conversions.h>
#include <base/strings/string_split.h>

using std::string;
using std::vector;

namespace shill {

const int HTTPURL::kDefaultHTTPPort = 80;
const int HTTPURL::kDefaultHTTPSPort = 443;

const char HTTPURL::kDelimiters[] = " /#?";
const char HTTPURL::kPortSeparator = ':';
const char HTTPURL::kPrefixHTTP[] = "http://";
const char HTTPURL::kPrefixHTTPS[] = "https://";

HTTPURL::HTTPURL()
    : port_(kDefaultHTTPPort),
      protocol_(kProtocolHTTP) {}

HTTPURL::~HTTPURL() {}

bool HTTPURL::ParseFromString(const string &url_string) {
  Protocol protocol = kProtocolUnknown;
  size_t host_start = 0;
  int port = 0;
  const string http_url_prefix(kPrefixHTTP);
  const string https_url_prefix(kPrefixHTTPS);
  if (url_string.substr(0, http_url_prefix.length()) == http_url_prefix) {
    host_start = http_url_prefix.length();
    port = kDefaultHTTPPort;
    protocol = kProtocolHTTP;
  } else if (
      url_string.substr(0, https_url_prefix.length()) == https_url_prefix) {
    host_start = https_url_prefix.length();
    port = kDefaultHTTPSPort;
    protocol = kProtocolHTTPS;
  } else {
    return false;
  }

  size_t host_end = url_string.find_first_of(kDelimiters, host_start);
  if (host_end == string::npos) {
    host_end = url_string.length();
  }
  vector<string> host_parts;
  base::SplitString(url_string.substr(host_start, host_end - host_start),
                    kPortSeparator, &host_parts);

  if (host_parts.empty() || host_parts[0].empty() || host_parts.size() > 2) {
    return false;
  } else if (host_parts.size() == 2) {
    if (!base::StringToInt(host_parts[1], &port)) {
      return false;
    }
  }

  protocol_ = protocol;
  host_ = host_parts[0];
  port_ = port;
  path_ = url_string.substr(host_end);
  if (path_.empty() || path_[0] != '/') {
    path_ = "/" + path_;
  }

  return true;
}

}  // namespace shill
