diff options
Diffstat (limited to 'node_modules/global-agent/src/utilities')
4 files changed, 132 insertions, 0 deletions
| diff --git a/node_modules/global-agent/src/utilities/bindHttpMethod.js b/node_modules/global-agent/src/utilities/bindHttpMethod.js new file mode 100644 index 0000000..f8859b5 --- /dev/null +++ b/node_modules/global-agent/src/utilities/bindHttpMethod.js @@ -0,0 +1,54 @@ +// @flow + +import http from 'http'; +import https from 'https'; + +type AgentType = http.Agent | https.Agent; + +// eslint-disable-next-line flowtype/no-weak-types +export default (originalMethod: Function, agent: AgentType, forceGlobalAgent: boolean) => { +  // eslint-disable-next-line unicorn/prevent-abbreviations +  return (...args: *) => { +    let url; +    let options; +    let callback; + +    if (typeof args[0] === 'string' || args[0] instanceof URL) { +      url = args[0]; + +      if (typeof args[1] === 'function') { +        options = {}; +        callback = args[1]; +      } else { +        options = { +          ...args[1], +        }; +        callback = args[2]; +      } +    } else { +      options = { +        ...args[0], +      }; +      callback = args[1]; +    } + +    if (forceGlobalAgent) { +      options.agent = agent; +    } else { +      if (!options.agent) { +        options.agent = agent; +      } + +      if (options.agent === http.globalAgent || options.agent === https.globalAgent) { +        options.agent = agent; +      } +    } + +    if (url) { +      // $FlowFixMe +      return originalMethod(url, options, callback); +    } else { +      return originalMethod(options, callback); +    } +  }; +}; diff --git a/node_modules/global-agent/src/utilities/index.js b/node_modules/global-agent/src/utilities/index.js new file mode 100644 index 0000000..3412387 --- /dev/null +++ b/node_modules/global-agent/src/utilities/index.js @@ -0,0 +1,5 @@ +// @flow + +export {default as bindHttpMethod} from './bindHttpMethod'; +export {default as isUrlMatchingNoProxy} from './isUrlMatchingNoProxy'; +export {default as parseProxyUrl} from './parseProxyUrl'; diff --git a/node_modules/global-agent/src/utilities/isUrlMatchingNoProxy.js b/node_modules/global-agent/src/utilities/isUrlMatchingNoProxy.js new file mode 100644 index 0000000..f2de584 --- /dev/null +++ b/node_modules/global-agent/src/utilities/isUrlMatchingNoProxy.js @@ -0,0 +1,37 @@ +// @flow + +import { +  parse as parseUrl, +} from 'url'; +import matcher from 'matcher'; +import { +  UnexpectedStateError, +} from '../errors'; + +export default (subjectUrl: string, noProxy: string) => { +  const subjectUrlTokens = parseUrl(subjectUrl); + +  const rules = noProxy.split(/[\s,]+/); + +  for (const rule of rules) { +    const ruleMatch = rule +      .replace(/^(?<leadingDot>\.)/, '*') +      .match(/^(?<hostname>.+?)(?::(?<port>\d+))?$/); + +    if (!ruleMatch || !ruleMatch.groups) { +      throw new UnexpectedStateError('Invalid NO_PROXY pattern.'); +    } + +    if (!ruleMatch.groups.hostname) { +      throw new UnexpectedStateError('NO_PROXY entry pattern must include hostname. Use * to match any hostname.'); +    } + +    const hostnameIsMatch = matcher.isMatch(subjectUrlTokens.hostname, ruleMatch.groups.hostname); + +    if (hostnameIsMatch && (!ruleMatch.groups || !ruleMatch.groups.port || subjectUrlTokens.port && subjectUrlTokens.port === ruleMatch.groups.port)) { +      return true; +    } +  } + +  return false; +}; diff --git a/node_modules/global-agent/src/utilities/parseProxyUrl.js b/node_modules/global-agent/src/utilities/parseProxyUrl.js new file mode 100644 index 0000000..e2e9a6b --- /dev/null +++ b/node_modules/global-agent/src/utilities/parseProxyUrl.js @@ -0,0 +1,36 @@ +// @flow + +import { +  parse as parseUrl, +} from 'url'; +import { +  UnexpectedStateError, +} from '../errors'; + +export default (url: string) => { +  const urlTokens = parseUrl(url); + +  if (urlTokens.query !== null) { +    throw new UnexpectedStateError('Unsupported `GLOBAL_AGENT.HTTP_PROXY` configuration value: URL must not have query.'); +  } + +  if (urlTokens.hash !== null) { +    throw new UnexpectedStateError('Unsupported `GLOBAL_AGENT.HTTP_PROXY` configuration value: URL must not have hash.'); +  } + +  if (urlTokens.protocol !== 'http:') { +    throw new UnexpectedStateError('Unsupported `GLOBAL_AGENT.HTTP_PROXY` configuration value: URL protocol must be "http:".'); +  } + +  let port = 80; + +  if (urlTokens.port) { +    port = Number.parseInt(urlTokens.port, 10); +  } + +  return { +    authorization: urlTokens.auth || null, +    hostname: urlTokens.hostname, +    port, +  }; +}; | 
