/*
 * Copyright 2016 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "cobalt/webdriver/protocol/proxy.h"

#include <vector>

#include "base/string_util.h"

namespace cobalt {
namespace webdriver {
namespace protocol {
namespace {

const char kProxyTypeKey[] = "proxyType";

// Used for manual proxy type. Webdriver also supports ftp proxy and socks
// proxy, but these are ignored.
const char kHttpProxyKey[] = "httpProxy";
const char kSslProxyKey[] = "sslProxy";

// Supported values for proxyType.
const char kManualProxyType[] = "manual";
}  // namespace

base::optional<Proxy> Proxy::FromValue(const base::Value* value) {
  const base::DictionaryValue* dictionary_value;
  if (!value->GetAsDictionary(&dictionary_value)) {
    return base::nullopt;
  }
  std::string proxy_type_string;
  if (!dictionary_value->GetString(kProxyTypeKey, &proxy_type_string)) {
    return base::nullopt;
  }
  StringToLowerASCII(&proxy_type_string);
  if (proxy_type_string == kManualProxyType) {
    std::vector<std::string> proxy_rules;
    std::string http_proxy;
    if (dictionary_value->GetString(kHttpProxyKey, &http_proxy)) {
      proxy_rules.push_back(std::string("http=") + http_proxy);
    }
    std::string https_proxy;
    if (dictionary_value->GetString(kSslProxyKey, &https_proxy)) {
      proxy_rules.push_back(std::string("https=") + https_proxy);
    }
    if (!proxy_rules.empty()) {
      return Proxy(JoinString(proxy_rules, ";"));
    }
  } else {
    // Only manual proxy type is supported.
    DLOG(INFO) << "Unsupported proxy type: " << proxy_type_string;
  }
  return base::nullopt;
}

}  // namespace protocol
}  // namespace webdriver
}  // namespace cobalt
