text: // Copyright (c) Microsoft Corporation. All rights reserved.
  // Licensed under the MIT License. See License.txt in the project root for license information.
  import { __extends } from "tslib";
  import { BaseRequestPolicy, } from "./requestPolicy";
  import { Constants } from "../util/constants";
  import { URLBuilder } from "../url";
  /**
   * @internal
   */
  export var noProxyList = loadNoProxy();
  var byPassedList = new Map();
  /**
   * @internal
   */
  export function getEnvironmentValue(name) {
      if (process.env[name]) {
          return process.env[name];
      }
      else if (process.env[name.toLowerCase()]) {
          return process.env[name.toLowerCase()];
      }
      return undefined;
  }
  function loadEnvironmentProxyValue() {
      if (!process) {
          return undefined;
      }
      var httpsProxy = getEnvironmentValue(Constants.HTTPS_PROXY);
      var allProxy = getEnvironmentValue(Constants.ALL_PROXY);
      var httpProxy = getEnvironmentValue(Constants.HTTP_PROXY);
      return httpsProxy || allProxy || httpProxy;
  }
  // Check whether the host of a given `uri` is in the noProxyList.
  // If there's a match, any request sent to the same host won't have the proxy settings set.
  // This implementation is a port of https://github.com/Azure/azure-sdk-for-net/blob/8cca811371159e527159c7eb65602477898683e2/sdk/core/Azure.Core/src/Pipeline/Internal/HttpEnvironmentProxy.cs#L210
  function isBypassed(uri) {
      if (noProxyList.length === 0) {
          return false;
      }
      var host = URLBuilder.parse(uri).getHost();
      if (byPassedList.has(host)) {
          return byPassedList.get(host);
      }
      var isBypassedFlag = false;
      for (var _i = 0, noProxyList_1 = noProxyList; _i < noProxyList_1.length; _i++) {
          var pattern = noProxyList_1[_i];
          if (pattern[0] === ".") {
              // This should match either domain it self or any subdomain or host
              // .foo.com will match foo.com it self or *.foo.com
              if (host.endsWith(pattern)) {
                  isBypassedFlag = true;
              }
              else {
                  if (host.length === pattern.length - 1 && host === pattern.slice(1)) {
                      isBypassedFlag = true;
                  }
              }
          }
          else {
              if (host === pattern) {
                  isBypassedFlag = true;
              }
          }
      }
      byPassedList.set(host, isBypassedFlag);
      return isBypassedFlag;
  }
  /**
   * @internal
   */
  export function loadNoProxy() {
      var noProxy = getEnvironmentValue(Constants.NO_PROXY);
      if (noProxy) {
          return noProxy
              .split(",")
              .map(function (item) { return item.trim(); })
              .filter(function (item) { return item.length; });
      }
      return [];
  }
  /**
   * @internal
   */
  function extractAuthFromUrl(url) {
      var atIndex = url.indexOf("@");
      if (atIndex === -1) {
          return { urlWithoutAuth: url };
      }
      var schemeIndex = url.indexOf("://");
      var authStart = schemeIndex !== -1 ? schemeIndex + 3 : 0;
      var auth = url.substring(authStart, atIndex);
      var colonIndex = auth.indexOf(":");
      var hasPassword = colonIndex !== -1;
      var username = hasPassword ? auth.substring(0, colonIndex) : auth;
      var password = hasPassword ? auth.substring(colonIndex + 1) : undefined;
      var urlWithoutAuth = url.substring(0, authStart) + url.substring(atIndex + 1);
      return {
          username: username,
          password: password,
          urlWithoutAuth: urlWithoutAuth,
      };
  }
  export function getDefaultProxySettings(proxyUrl) {
      if (!proxyUrl) {
          proxyUrl = loadEnvironmentProxyValue();
          if (!proxyUrl) {
              return undefined;
          }
      }
      var _a = extractAuthFromUrl(proxyUrl), username = _a.username, password = _a.password, urlWithoutAuth = _a.urlWithoutAuth;
      var parsedUrl = URLBuilder.parse(urlWithoutAuth);
      var schema = parsedUrl.getScheme() ? parsedUrl.getScheme() + "://" : "";
      return {
          host: schema + parsedUrl.getHost(),
          port: Number.parseInt(parsedUrl.getPort() || "80"),
          username: username,
          password: password,
      };
  }
  export function proxyPolicy(proxySettings) {
      if (!proxySettings) {
          proxySettings = getDefaultProxySettings();
      }
      return {
          create: function (nextPolicy, options) {
              return new ProxyPolicy(nextPolicy, options, proxySettings);
          },
      };
  }
  var ProxyPolicy = /** @class */ (function (_super) {
      __extends(ProxyPolicy, _super);
      function ProxyPolicy(nextPolicy, options, proxySettings) {
          var _this = _super.call(this, nextPolicy, options) || this;
          _this.proxySettings = proxySettings;
          return _this;
      }
      ProxyPolicy.prototype.sendRequest = function (request) {
          if (!request.proxySettings && !isBypassed(request.url)) {
              request.proxySettings = this.proxySettings;
          }
          return this._nextPolicy.sendRequest(request);
      };
      return ProxyPolicy;
  }(BaseRequestPolicy));
  export { ProxyPolicy };
  //# sourceMappingURL=proxyPolicy.js.map