From b9d112985f7741fa39cc8a50ce6071efe5c750d9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 16 Aug 2016 17:12:53 +0200 Subject: [PATCH] RequestService2 --- src/vs/base/node/proxy.ts | 3 +- src/vs/base/node/request.ts | 10 ++-- src/vs/platform/request/common/request.ts | 41 ++++++++++++++- .../platform/request/node/requestService2.ts | 50 +++++++++++++++++++ .../services/request/node/requestService.ts | 25 +--------- 5 files changed, 99 insertions(+), 30 deletions(-) create mode 100644 src/vs/platform/request/node/requestService2.ts diff --git a/src/vs/base/node/proxy.ts b/src/vs/base/node/proxy.ts index 5c6e5c829c4..2140f144556 100644 --- a/src/vs/base/node/proxy.ts +++ b/src/vs/base/node/proxy.ts @@ -7,6 +7,7 @@ import { Url, parse as parseUrl } from 'url'; import { isBoolean } from 'vs/base/common/types'; +import { Agent } from './request'; import HttpProxyAgent = require('http-proxy-agent'); import HttpsProxyAgent = require('https-proxy-agent'); @@ -25,7 +26,7 @@ export interface IOptions { strictSSL?: boolean; } -export function getProxyAgent(rawRequestURL: string, options: IOptions = {}): any { +export function getProxyAgent(rawRequestURL: string, options: IOptions = {}): Agent { const requestURL = parseUrl(rawRequestURL); const proxyURL = options.proxyUrl || getSystemProxyURI(requestURL); diff --git a/src/vs/base/node/request.ts b/src/vs/base/node/request.ts index cd1c3bc113a..289a0c9f654 100644 --- a/src/vs/base/node/request.ts +++ b/src/vs/base/node/request.ts @@ -15,6 +15,8 @@ import { createWriteStream } from 'fs'; import { assign } from 'vs/base/common/objects'; import { createGunzip } from 'zlib'; +export type Agent = any; + export interface IRequestOptions { type?: string; url?: string; @@ -23,21 +25,21 @@ export interface IRequestOptions { headers?: any; timeout?: number; data?: any; - agent?: any; + agent?: Agent; followRedirects?: number; strictSSL?: boolean; } -export interface IRequestResult { +export interface IRequestContext { req: http.ClientRequest; res: http.ClientResponse; stream: Stream; } -export function request(options: IRequestOptions): TPromise { +export function request(options: IRequestOptions): TPromise { let req: http.ClientRequest; - return new TPromise((c, e) => { + return new TPromise((c, e) => { let endpoint = parseUrl(options.url); let opts: https.RequestOptions = { diff --git a/src/vs/platform/request/common/request.ts b/src/vs/platform/request/common/request.ts index 5fa79164ab1..e1bfee9f86b 100644 --- a/src/vs/platform/request/common/request.ts +++ b/src/vs/platform/request/common/request.ts @@ -4,9 +4,13 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; +import { localize } from 'vs/nls'; import http = require('vs/base/common/http'); import { TPromise } from 'vs/base/common/winjs.base'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IRequestOptions, IRequestContext } from 'vs/base/node/request'; +import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; +import { Registry } from 'vs/platform/platform'; export const IRequestService = createDecorator('requestService'); @@ -18,4 +22,39 @@ export interface IRequestService { * of calling WinJS.XHR directly. */ makeRequest(options: http.IXHROptions): TPromise; -} \ No newline at end of file +} + +export const IRequestService2 = createDecorator('requestService2'); + +export interface IRequestService2 { + _serviceBrand: any; + + request(options: IRequestOptions): TPromise; +} + +export interface IHTTPConfiguration { + http?: { + proxy?: string; + proxyStrictSSL?: boolean; + }; +} + +Registry.as(Extensions.Configuration) + .registerConfiguration({ + id: 'http', + order: 15, + title: localize('httpConfigurationTitle', "HTTP"), + type: 'object', + properties: { + 'http.proxy': { + type: 'string', + pattern: '^https?://([^:]*(:[^@]*)?@)?([^:]+)(:\\d+)?/?$|^$', + description: localize('proxy', "The proxy setting to use. If not set will be taken from the http_proxy and https_proxy environment variables") + }, + 'http.proxyStrictSSL': { + type: 'boolean', + default: true, + description: localize('strictSSL', "Whether the proxy server certificate should be verified against the list of supplied CAs.") + } + } + }); \ No newline at end of file diff --git a/src/vs/platform/request/node/requestService2.ts b/src/vs/platform/request/node/requestService2.ts new file mode 100644 index 00000000000..2f2b066c7b8 --- /dev/null +++ b/src/vs/platform/request/node/requestService2.ts @@ -0,0 +1,50 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { TPromise } from 'vs/base/common/winjs.base'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { IRequestOptions, IRequestContext, request } from 'vs/base/node/request'; +import { getProxyAgent } from 'vs/base/node/proxy'; +import { IRequestService2, IHTTPConfiguration } from 'vs/platform/request/common/request'; +import { IConfigurationService, IConfigurationServiceEvent } from 'vs/platform/configuration/common/configuration'; + +/** + * This service exposes the `request` API, while using the global + * or configured proxy settings. + */ +export class RequestService2 implements IRequestService2 { + + _serviceBrand: any; + + private proxyUrl: string; + private strictSSL: boolean; + private disposables: IDisposable[] = []; + + constructor( + @IConfigurationService configurationService: IConfigurationService + ) { + this.configure(configurationService.getConfiguration()); + configurationService.onDidUpdateConfiguration(this.onDidUpdateConfiguration, this, this.disposables); + } + + private onDidUpdateConfiguration(e: IConfigurationServiceEvent) { + this.configure(e.config); + } + + private configure(config: IHTTPConfiguration) { + this.proxyUrl = config.http && config.http.proxy; + this.strictSSL = config.http && config.http.proxyStrictSSL; + } + + request(options: IRequestOptions): TPromise { + if (!options.agent) { + const { proxyUrl, strictSSL } = this; + options.agent = getProxyAgent(options.url, { proxyUrl, strictSSL }); + } + + return request(options); + } +} diff --git a/src/vs/workbench/services/request/node/requestService.ts b/src/vs/workbench/services/request/node/requestService.ts index a8bf00af55a..25742efb5fe 100644 --- a/src/vs/workbench/services/request/node/requestService.ts +++ b/src/vs/workbench/services/request/node/requestService.ts @@ -7,11 +7,9 @@ import { TPromise, Promise } from 'vs/base/common/winjs.base'; import { xhr } from 'vs/base/common/network'; -import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; import strings = require('vs/base/common/strings'); import nls = require('vs/nls'); import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import platform = require('vs/platform/platform'); import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { BaseRequestService } from 'vs/platform/request/common/baseRequestService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -132,25 +130,4 @@ export class RequestService extends BaseRequestService { dispose(): void { this.disposables = dispose(this.disposables); } -} - -// Configuration -let confRegistry = platform.Registry.as(Extensions.Configuration); -confRegistry.registerConfiguration({ - id: 'http', - order: 15, - title: nls.localize('httpConfigurationTitle', "HTTP"), - type: 'object', - properties: { - 'http.proxy': { - type: 'string', - pattern: '^https?://([^:]*(:[^@]*)?@)?([^:]+)(:\\d+)?/?$|^$', - description: nls.localize('proxy', "The proxy setting to use. If not set will be taken from the http_proxy and https_proxy environment variables") - }, - 'http.proxyStrictSSL': { - type: 'boolean', - default: true, - description: nls.localize('strictSSL', "Whether the proxy server certificate should be verified against the list of supplied CAs.") - } - } -}); \ No newline at end of file +} \ No newline at end of file