From 4e436d128c37bee683a18d12da4be98d7c91c807 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 22 Oct 2018 20:00:47 +0200 Subject: [PATCH] Investigate using Electron's `resolveProxy` API (#60773) --- package.json | 1 + src/typings/electron-proxy-agent.d.ts | 6 + src/vs/platform/request/node/request.ts | 11 ++ src/vs/platform/windows/common/windows.ts | 2 + .../windows/electron-browser/windowService.ts | 4 + .../windows/electron-main/windowsService.ts | 13 ++ src/vs/platform/windows/node/windowsIpc.ts | 6 + .../electron-browser/mainThreadWorkspace.ts | 5 + src/vs/workbench/api/node/extHost.protocol.ts | 1 + .../api/node/extHostExtensionService.ts | 5 +- src/vs/workbench/api/node/extHostWorkspace.ts | 4 + src/vs/workbench/node/extensionHostMain.ts | 5 +- src/vs/workbench/node/proxyResolver.ts | 103 ++++++++++++ .../workbench/test/workbenchTestServices.ts | 8 + yarn.lock | 148 +++++++++++++++--- 15 files changed, 298 insertions(+), 24 deletions(-) create mode 100644 src/typings/electron-proxy-agent.d.ts create mode 100644 src/vs/workbench/node/proxyResolver.ts diff --git a/package.json b/package.json index 80f1b279dc7..042693afa55 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ }, "dependencies": { "applicationinsights": "1.0.6", + "electron-proxy-agent": "^1.0.2", "fast-plist": "0.1.2", "gc-signals": "^0.0.1", "getmac": "1.4.1", diff --git a/src/typings/electron-proxy-agent.d.ts b/src/typings/electron-proxy-agent.d.ts new file mode 100644 index 00000000000..36b5e09227e --- /dev/null +++ b/src/typings/electron-proxy-agent.d.ts @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'electron-proxy-agent'; diff --git a/src/vs/platform/request/node/request.ts b/src/vs/platform/request/node/request.ts index e7a0a7abe94..28a8ca3416b 100644 --- a/src/vs/platform/request/node/request.ts +++ b/src/vs/platform/request/node/request.ts @@ -47,6 +47,17 @@ Registry.as(Extensions.Configuration) type: ['null', 'string'], default: null, description: localize('proxyAuthorization', "The value to send as the 'Proxy-Authorization' header for every network request.") + }, + 'http.systemProxy': { + type: 'string', + enum: ['off', 'on', 'force'], + enumDescriptions: [ + localize('systemProxyOff', "Do not use system proxy configuration."), + localize('systemProxyOn', "Use system proxy configuration if not specified in the request options."), + localize('systemProxyForce', "Always use system proxy configuration."), + ], + default: 'off', + description: localize('systemProxy', "Experimental setting: Use the system proxy configuration.") } } }); diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 7b0472e8d94..87e6692e399 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -167,6 +167,7 @@ export interface IWindowsService { startCrashReporter(config: CrashReporterStartOptions): TPromise; openAboutDialog(): TPromise; + resolveProxy(windowId: number, url: string): Promise; } export const IWindowService = createDecorator('windowService'); @@ -214,6 +215,7 @@ export interface IWindowService { showMessageBox(options: MessageBoxOptions): TPromise; showSaveDialog(options: SaveDialogOptions): TPromise; showOpenDialog(options: OpenDialogOptions): TPromise; + resolveProxy(url: string): Promise; } export type MenuBarVisibility = 'default' | 'visible' | 'toggle' | 'hidden'; diff --git a/src/vs/platform/windows/electron-browser/windowService.ts b/src/vs/platform/windows/electron-browser/windowService.ts index db3b2a0ca98..55be4cb76e9 100644 --- a/src/vs/platform/windows/electron-browser/windowService.ts +++ b/src/vs/platform/windows/electron-browser/windowService.ts @@ -163,4 +163,8 @@ export class WindowService implements IWindowService { updateTouchBar(items: ISerializableCommandAction[][]): TPromise { return this.windowsService.updateTouchBar(this.windowId, items); } + + resolveProxy(url: string): Promise { + return this.windowsService.resolveProxy(this.windowId, url); + } } diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 441ac8f9baf..74d1bc6052d 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -564,6 +564,19 @@ export class WindowsService implements IWindowsService, IURLHandler, IDisposable return TPromise.wrap(true); } + resolveProxy(windowId: number, url: string): Promise { + return new Promise(resolve => { + const codeWindow = this.windowsMainService.getWindowById(windowId); + if (codeWindow) { + codeWindow.win.webContents.session.resolveProxy(url, proxy => { + resolve(proxy); + }); + } else { + resolve(); + } + }); + } + dispose(): void { this.disposables = dispose(this.disposables); } diff --git a/src/vs/platform/windows/node/windowsIpc.ts b/src/vs/platform/windows/node/windowsIpc.ts index 69af2c4132e..c2441ba4c90 100644 --- a/src/vs/platform/windows/node/windowsIpc.ts +++ b/src/vs/platform/windows/node/windowsIpc.ts @@ -73,6 +73,7 @@ export interface IWindowsChannel extends IChannel { call(command: 'openExternal', arg: string): Thenable; call(command: 'startCrashReporter', arg: CrashReporterStartOptions): Thenable; call(command: 'openAboutDialog'): Thenable; + call(command: 'resolveProxy', arg: [number, string]): Thenable; } export class WindowsChannel implements IWindowsChannel { @@ -178,6 +179,7 @@ export class WindowsChannel implements IWindowsChannel { case 'openExternal': return this.service.openExternal(arg); case 'startCrashReporter': return this.service.startCrashReporter(arg); case 'openAboutDialog': return this.service.openAboutDialog(); + case 'resolveProxy': return this.service.resolveProxy(arg[0], arg[1]); } return undefined; } @@ -404,4 +406,8 @@ export class WindowsChannelClient implements IWindowsService { openAboutDialog(): TPromise { return TPromise.wrap(this.channel.call('openAboutDialog')); } + + resolveProxy(windowId: number, url: string): Promise { + return Promise.resolve(this.channel.call('resolveProxy', [windowId, url])); + } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts index b5828cf89b9..9427e5fc2f4 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts @@ -40,6 +40,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { @IConfigurationService private readonly _configurationService: IConfigurationService, @IWorkspaceEditingService private readonly _workspaceEditingService: IWorkspaceEditingService, @IStatusbarService private readonly _statusbarService: IStatusbarService, + @IWindowService private readonly _windowService: IWindowService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @ILabelService private readonly _labelService: ILabelService ) { @@ -231,6 +232,10 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { return result.results.every(each => each.success === true); }); } + + $resolveProxy(url: string): Thenable { + return this._windowService.resolveProxy(url); + } } CommandsRegistry.registerCommand('_workbench.enterWorkspace', async function (accessor: ServicesAccessor, workspace: URI, disableExtensions: string[]) { diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 17a1640f950..081f01827db 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -487,6 +487,7 @@ export interface MainThreadWorkspaceShape extends IDisposable { $checkExists(includes: string[], token: CancellationToken): Thenable; $saveAll(includeUntitled?: boolean): Thenable; $updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, workspaceFoldersToAdd: { uri: UriComponents, name?: string }[]): Thenable; + $resolveProxy(url: string): Thenable; } export interface IFileChangeDto { diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 99b66437201..7687f9bf1a9 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -147,12 +147,13 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { extHostContext: IMainContext, extHostWorkspace: ExtHostWorkspace, extHostConfiguration: ExtHostConfiguration, - extHostLogService: ExtHostLogService + extHostLogService: ExtHostLogService, + mainThreadTelemetry: MainThreadTelemetryShape ) { this._barrier = new Barrier(); this._registry = new ExtensionDescriptionRegistry(initData.extensions); this._extHostLogService = extHostLogService; - this._mainThreadTelemetry = extHostContext.getProxy(MainContext.MainThreadTelemetry); + this._mainThreadTelemetry = mainThreadTelemetry; this._storage = new ExtHostStorage(extHostContext); this._storagePath = new ExtensionStoragePath(initData.workspace, initData.environment); this._proxy = extHostContext.getProxy(MainContext.MainThreadExtensionService); diff --git a/src/vs/workbench/api/node/extHostWorkspace.ts b/src/vs/workbench/api/node/extHostWorkspace.ts index 01afd29ffc2..3d9ed901014 100644 --- a/src/vs/workbench/api/node/extHostWorkspace.ts +++ b/src/vs/workbench/api/node/extHostWorkspace.ts @@ -454,4 +454,8 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape { saveAll(includeUntitled?: boolean): Thenable { return this._proxy.$saveAll(includeUntitled); } + + resolveProxy(url: string): Thenable { + return this._proxy.$resolveProxy(url); + } } diff --git a/src/vs/workbench/node/extensionHostMain.ts b/src/vs/workbench/node/extensionHostMain.ts index a580fc9bdeb..54bdb6143a8 100644 --- a/src/vs/workbench/node/extensionHostMain.ts +++ b/src/vs/workbench/node/extensionHostMain.ts @@ -22,6 +22,7 @@ import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; import { timeout } from 'vs/base/common/async'; import { Counter } from 'vs/base/common/numbers'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { connectProxyResolver } from 'vs/workbench/node/proxyResolver'; // we don't (yet) throw when extensions parse // uris that have no scheme @@ -89,7 +90,9 @@ export class ExtensionHostMain { this._extHostLogService.trace('initData', initData); this._extHostConfiguration = new ExtHostConfiguration(rpcProtocol.getProxy(MainContext.MainThreadConfiguration), extHostWorkspace, initData.configuration); - this._extensionService = new ExtHostExtensionService(initData, rpcProtocol, extHostWorkspace, this._extHostConfiguration, this._extHostLogService); + const mainThreadTelemetry = rpcProtocol.getProxy(MainContext.MainThreadTelemetry); + connectProxyResolver(extHostWorkspace, this._extHostConfiguration, this._extHostLogService, mainThreadTelemetry); + this._extensionService = new ExtHostExtensionService(initData, rpcProtocol, extHostWorkspace, this._extHostConfiguration, this._extHostLogService, mainThreadTelemetry); // error forwarding and stack trace scanning Error.stackTraceLimit = 100; // increase number of stack frames (from 10, https://github.com/v8/v8/wiki/Stack-Trace-API) diff --git a/src/vs/workbench/node/proxyResolver.ts b/src/vs/workbench/node/proxyResolver.ts new file mode 100644 index 00000000000..64a6abaca45 --- /dev/null +++ b/src/vs/workbench/node/proxyResolver.ts @@ -0,0 +1,103 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; +import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; +import * as http from 'http'; +import * as https from 'https'; +import ElectronProxyAgent = require('electron-proxy-agent'); +import { MainThreadTelemetryShape } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; +import { toErrorMessage } from 'vs/base/common/errorMessage'; + +export function connectProxyResolver(extHostWorkspace: ExtHostWorkspace, extHostConfiguration: ExtHostConfiguration, extHostLogService: ExtHostLogService, mainThreadTelemetry: MainThreadTelemetryShape) { + let timeout: NodeJS.Timer | undefined; + let count = 0; + let duration = 0; + let errorCount = 0; + function logEvent() { + timeout = undefined; + /* __GDPR__ + "resolveProxy" : { + "count": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, + "duration": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, + "errorCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, + "${include}": [ + "${TypeScriptCommonProperties}" + ] + } + */ + mainThreadTelemetry.$publicLog('resolveProxy', { count, duration, errorCount }); + count = duration = errorCount = 0; + } + + function resolveProxy(url: string, callback: (proxy?: string) => void) { + if (!timeout) { + timeout = setTimeout(logEvent, 10 * 60 * 1000); + } + + const start = Date.now(); + extHostWorkspace.resolveProxy(url) + .then(proxy => { + callback(proxy); + }).then(() => { + count++; + duration = Date.now() - start + duration; + }, err => { + errorCount++; + extHostLogService.error('resolveProxy', toErrorMessage(err)); + callback(); + }); + } + + const agent = new ElectronProxyAgent({ resolveProxy }); + + let config = extHostConfiguration.getConfiguration('http').get('systemProxy') || 'off'; + extHostConfiguration.onDidChangeConfiguration(e => { + config = extHostConfiguration.getConfiguration('http').get('systemProxy') || 'off'; + }); + + function patch(original: typeof http.get) { + function patched(url: string | URL, options?: http.RequestOptions, callback?: (res: http.IncomingMessage) => void): http.ClientRequest { + if (config === 'off') { + return original.apply(null, arguments); + } + + if (typeof url !== 'string' && !(url && (url).searchParams)) { + callback = options; + options = url; + url = null; + } + if (typeof options === 'function') { + callback = options; + options = null; + } + options = options || {}; + + if (config === 'force' || config === 'on' && !options.agent) { + if (url) { + const parsed = typeof url === 'string' ? new URL(url) : url; + options = { + protocol: parsed.protocol, + hostname: parsed.hostname, + port: parsed.port, + path: parsed.pathname, + ...options + }; + } + options.agent = agent; + return original(options, callback); + } + + return original.apply(null, arguments); + } + return patched; + } + + (http).get = patch(http.get); + (http).request = patch(http.request); + (https).get = patch(https.get); + (https).request = patch(https.request); +} \ No newline at end of file diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 7addc3b6911..7af3220f027 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -1124,6 +1124,10 @@ export class TestWindowService implements IWindowService { updateTouchBar(_items: ISerializableCommandAction[][]): TPromise { return TPromise.as(void 0); } + + resolveProxy(url: string): Promise { + return Promise.resolve(void 0); + } } export class TestLifecycleService implements ILifecycleService { @@ -1380,6 +1384,10 @@ export class TestWindowsService implements IWindowsService { openAboutDialog(): TPromise { return TPromise.as(void 0); } + + resolveProxy(windowId: number, url: string): Promise { + return Promise.resolve(void 0); + } } export class TestTextResourceConfigurationService implements ITextResourceConfigurationService { diff --git a/yarn.lock b/yarn.lock index e9f893ecbc5..eb165e3f0fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -277,6 +277,14 @@ acorn@^5.2.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" integrity sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w== +agent-base@2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7" + integrity sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc= + dependencies: + extend "~3.0.0" + semver "~5.0.1" + agent-base@4, agent-base@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" @@ -1880,6 +1888,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-uri-to-buffer@0: + version "0.0.4" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-0.0.4.tgz#46e13ab9da8e309745c8d01ce547213ebdb2fe3f" + integrity sha1-RuE6udqOMJdFyNAc5UchPr2y/j8= + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -1903,6 +1916,13 @@ debounce@^1.0.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.1.0.tgz#6a1a4ee2a9dc4b7c24bb012558dbcdb05b37f408" integrity sha512-ZQVKfRVlwRfD150ndzEK8M90ABT+Y/JQKs4Y7U4MXdpuoUkkrr4DwKbVux3YjylA5bUMUj0Nc3pMxPJX6N2QQQ== +debug@2, debug@2.6.9, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" @@ -1910,13 +1930,6 @@ debug@2.2.0: dependencies: ms "0.7.1" -debug@2.6.9, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@3.1.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -2296,6 +2309,19 @@ electron-mksnapshot@~2.0.0: electron-download "^4.1.0" extract-zip "^1.6.5" +electron-proxy-agent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/electron-proxy-agent/-/electron-proxy-agent-1.0.2.tgz#ca2a0d953fbc52c5d1f51c9dc7ff25fc8e057dc8" + integrity sha1-yioNlT+8UsXR9Rydx/8l/I4Ffcg= + dependencies: + agent-base "2" + debug "2" + extend "3" + get-uri "1" + http-proxy-agent "1" + https-proxy-agent "1" + socks-proxy-agent "2" + electron-to-chromium@^1.2.7: version "1.3.27" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" @@ -2758,6 +2784,11 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" +extend@3, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -2768,11 +2799,6 @@ extend@~1.2.1: resolved "https://registry.yarnpkg.com/extend/-/extend-1.2.1.tgz#a0f5fd6cfc83a5fe49ef698d60ec8a624dd4576c" integrity sha1-oPX9bPyDpf5J72mNYOyKYk3UV2w= -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - external-editor@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.0.tgz#dc35c48c6f98a30ca27a20e9687d7f3c77704bb6" @@ -2904,6 +2930,11 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" +file-uri-to-path@0: + version "0.0.2" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-0.0.2.tgz#37cdd1b5b905404b3f05e1b23645be694ff70f82" + integrity sha1-N83RtbkFQEs/BeGyNkW+aU/3D4I= + filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" @@ -3224,6 +3255,14 @@ fsevents@^1.2.2: nan "^2.9.2" node-pre-gyp "^0.10.0" +ftp@~0.3.5: + version "0.3.10" + resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" + integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= + dependencies: + readable-stream "1.1.x" + xregexp "2.0.0" + function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -3287,6 +3326,18 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-uri@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-1.1.0.tgz#7375d04daf7fcb584b3632679cbdf339b51bb149" + integrity sha1-c3XQTa9/y1hLNjJnnL3zObUbsUk= + dependencies: + data-uri-to-buffer "0" + debug "2" + extend "3" + file-uri-to-path "0" + ftp "~0.3.5" + readable-stream "2" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -4097,6 +4148,15 @@ http-errors@1.6.2, http-errors@~1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" +http-proxy-agent@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz#cc1ce38e453bf984a0f7702d2dd59c73d081284a" + integrity sha1-zBzjjkU7+YSg93AtLdWcc9CBKEo= + dependencies: + agent-base "2" + debug "2" + extend "3" + http-proxy-agent@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" @@ -4128,6 +4188,15 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" + integrity sha1-NffabEjOTdv6JkiRrFk+5f+GceY= + dependencies: + agent-base "2" + debug "2" + extend "3" + https-proxy-agent@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" @@ -4306,6 +4375,11 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +ip@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + ipaddr.js@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" @@ -7262,7 +7336,7 @@ read@^1.0.7: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: +"readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -7275,20 +7349,20 @@ read@^1.0.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= +readable-stream@1.1.x, readable-stream@^1.1.8, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^1.1.8, readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -7799,6 +7873,11 @@ semver@^5.0.1, semver@^5.4.1, semver@^5.5.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== +semver@~5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" + integrity sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no= + send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" @@ -7963,6 +8042,11 @@ slice-ansi@0.0.4: resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= +smart-buffer@^1.0.13: + version "1.1.15" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" + integrity sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY= + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -8007,6 +8091,23 @@ sntp@2.x.x: dependencies: hoek "4.x.x" +socks-proxy-agent@2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz#86ebb07193258637870e13b7bd99f26c663df3d3" + integrity sha512-sFtmYqdUK5dAMh85H0LEVFUCO7OhJJe1/z2x/Z6mxp3s7/QPf1RkZmpZy+BpuU0bEjcV9npqKjq9Y3kwFUjnxw== + dependencies: + agent-base "2" + extend "3" + socks "~1.1.5" + +socks@~1.1.5: + version "1.1.10" + resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" + integrity sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o= + dependencies: + ip "^1.1.4" + smart-buffer "^1.0.13" + sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" @@ -9599,6 +9700,11 @@ xmldom@0.1.x: resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= +xregexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" + integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= + xregexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"