// Copyright 2015 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.

// Put Mojo definitions into their own namespace to avoid collisions with C++
// definitions.
// TODO(amistry): Resolve the conflict between these two sets of definitions.
module net.interfaces;

import "host_resolver_service.mojom";
import "url/mojo/url.mojom";

// Mirror of net::ProxyServer::Scheme.
enum ProxyScheme {
  INVALID,
  DIRECT,
  HTTP,
  SOCKS4,
  SOCKS5,
  HTTPS,
  QUIC,
};

// Mirror of net::ProxyServer.
struct ProxyServer {
  ProxyScheme scheme;

  // |host| and |port| are only valid if |scheme| is not INVALID or DIRECT.
  string host;
  uint16 port;
};

struct ProxyInfo {
  array<ProxyServer> proxy_servers;
};

interface ProxyResolver {
  // Use a ProxyResolverRequestClient instead of returning a result so we can
  // cancel in-flight requests by destroying the client.
  GetProxyForUrl(url.mojom.Url url, ProxyResolverRequestClient client);
};

interface ProxyResolverRequestClient {
  ReportResult(int32 error, ProxyInfo proxy_info);

  Alert(string error);
  OnError(int32 line_number, string error);

  ResolveDns(HostResolverRequestInfo request_info,
             HostResolverRequestClient client);
};

interface ProxyResolverFactory {
  CreateResolver(string pac_script,
                 ProxyResolver& resolver,
                 ProxyResolverFactoryRequestClient client);
};

interface ProxyResolverFactoryRequestClient {
  ReportResult(int32 error);

  Alert(string error);
  OnError(int32 line_number, string error);

  ResolveDns(HostResolverRequestInfo request_info,
             HostResolverRequestClient client);
};
