// 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/string_number_conversions.h>
#include <base/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
