// Copyright (c) 2020 The Chromium Embedded Framework 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 "tests/ceftests/test_server.h"

#include "tests/ceftests/test_server_manager.h"

#include <vector>

namespace test_server {

// Must use a different port than server_unittest.cc.
const char kHttpServerAddress[] = "127.0.0.1";
const uint16_t kHttpServerPort = 8098;

const char kIncompleteDoNotSendData[] = "DO NOT SEND";

CefRefPtr<CefResponse> Create404Response() {
  auto response = CefResponse::Create();
  response->SetStatus(404);
  response->SetMimeType("text/html");
  return response;
}

void Stop(base::OnceClosure callback) {
  // Stop both HTTPS and HTTP servers in a chain.
  Manager::Stop(base::BindOnce(
                    [](base::OnceClosure callback) {
                      Manager::Stop(std::move(callback),
                                    /*https_server=*/false);
                    },
                    std::move(callback)),
                /*https_server=*/true);
}

std::string GetOrigin(bool https_server) {
  return Manager::GetOrigin(https_server);
}

std::string GetScheme(bool https_server) {
  return https_server ? "https" : "http";
}

std::string GetHost(bool https_server, bool include_port) {
  const auto& origin = GetOrigin(https_server);

  const auto scheme_offset = origin.find("//");
  const auto& origin_without_scheme = origin.substr(scheme_offset + 2);
  if (include_port) {
    return origin_without_scheme;
  }

  const auto port_offset = origin_without_scheme.find(':');
  return origin_without_scheme.substr(0, port_offset);
}

}  // namespace test_server
