diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 8f3649fd0444ddc088171eefb474715377e9c89d..d12dc3591a58f38c8c5378e3c7076078670d6086 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -25,8 +25,9 @@ import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/ex import { ITelemetryService, combinedAppender, NullTelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProperties'; -import { IRequestService } from 'vs/platform/request/common/request'; +import { IRequestService, IRequestService2 } from 'vs/platform/request/common/request'; import { NodeRequestService } from 'vs/platform/request/node/nodeRequestService'; +import { RequestService2 } from 'vs/platform/request/node/requestService2'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { NodeConfigurationService } from 'vs/platform/configuration/node/nodeConfigurationService'; import { AppInsightsAppender } from 'vs/platform/telemetry/node/appInsightsAppender'; @@ -158,6 +159,7 @@ export function main(argv: ParsedArgs): TPromise { services.set(IEventService, new SyncDescriptor(EventService)); services.set(IConfigurationService, new SyncDescriptor(NodeConfigurationService)); services.set(IRequestService, new SyncDescriptor(NodeRequestService)); + services.set(IRequestService2, new SyncDescriptor(RequestService2)); services.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementService)); services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryService)); diff --git a/src/vs/code/node/sharedProcessMain.ts b/src/vs/code/node/sharedProcessMain.ts index 4155fcc209975a76cb1e677f00aca7d3ee8ddcf6..3f1bf205f0669f5eb1a9139a139611acd3c7f085 100644 --- a/src/vs/code/node/sharedProcessMain.ts +++ b/src/vs/code/node/sharedProcessMain.ts @@ -22,6 +22,8 @@ import { ExtensionManagementService } from 'vs/platform/extensionManagement/node import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { NodeConfigurationService } from 'vs/platform/configuration/node/nodeConfigurationService'; +import { IRequestService2 } from 'vs/platform/request/common/request'; +import { RequestService2 } from 'vs/platform/request/node/requestService2'; import { ITelemetryService, combinedAppender, NullTelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProperties'; import { TelemetryAppenderChannel } from 'vs/platform/telemetry/common/telemetryIpc'; @@ -57,6 +59,7 @@ function main(server: Server): void { services.set(IEventService, new SyncDescriptor(EventService)); services.set(IEnvironmentService, new SyncDescriptor(EnvironmentService)); services.set(IConfigurationService, new SyncDescriptor(NodeConfigurationService)); + services.set(IRequestService2, new SyncDescriptor(RequestService2)); const instantiationService = new InstantiationService(services); diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index d375b03be01266d44e44a5dd9ab4f99b5a061dd9..1d3ae88bfc1e89f63ffeb482df8db55cb0aab422 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -10,11 +10,10 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IGalleryExtension, IExtensionGalleryService, IQueryOptions, SortBy, SortOrder, IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement'; import { isUndefined } from 'vs/base/common/types'; import { assign, getOrDefault } from 'vs/base/common/objects'; -import { IRequestService } from 'vs/platform/request/common/request'; +import { IRequestService2 } from 'vs/platform/request/common/request'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IPager } from 'vs/base/common/paging'; -import { request, download, json, IRequestOptions } from 'vs/base/node/request'; -import { getProxyAgent } from 'vs/base/node/proxy'; +import { download, json } from 'vs/base/node/request'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import pkg from 'vs/platform/package'; import product from 'vs/platform/product'; @@ -32,6 +31,11 @@ interface IRawGalleryExtensionVersion { files: IRawGalleryExtensionFile[]; } +interface IRawGalleryExtensionStatistics { + statisticName: string; + value: number; +} + interface IRawGalleryExtension { extensionId: string; extensionName: string; @@ -42,9 +46,17 @@ interface IRawGalleryExtension { statistics: IRawGalleryExtensionStatistics[]; } -interface IRawGalleryExtensionStatistics { - statisticName: string; - value: number; +interface IRawGalleryQueryResult { + results: { + extensions: IRawGalleryExtension[]; + resultMetadata: { + metadataType: string; + metadataItems: { + name: string; + count: number; + }[]; + }[] + }[]; } enum Flags { @@ -215,7 +227,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } constructor( - @IRequestService private requestService: IRequestService, + @IRequestService2 private requestService: IRequestService2, @ITelemetryService private telemetryService: ITelemetryService, @IConfigurationService private configurationService: IConfigurationService ) { @@ -279,19 +291,25 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } private queryGallery(query: Query): TPromise<{ galleryExtensions: IRawGalleryExtension[], total: number; }> { - const data = JSON.stringify(query.raw); - const opts = this.request(this.api('/extensionquery')); - return this.getCommonHeaders() - .then(headers => assign(headers, { - 'Content-Type': 'application/json', - 'Accept': 'application/json;api-version=3.0-preview.1', - 'Accept-Encoding': 'gzip', - 'Content-Length': data.length - })) - .then(headers => assign(opts, { type: 'POST', data, headers })) - .then(() => request(opts)) - .then(context => json(context)) + .then(headers => { + const data = JSON.stringify(query.raw); + + headers = assign(headers, { + 'Content-Type': 'application/json', + 'Accept': 'application/json;api-version=3.0-preview.1', + 'Accept-Encoding': 'gzip', + 'Content-Length': data.length + }); + + return this.requestService.request({ + type: 'POST', + url: this.api('/extensionquery'), + data, + headers + }); + }) + .then(context => json(context)) .then(result => { const r = result.results[0]; const galleryExtensions = r.extensions; @@ -320,11 +338,9 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return this.getLastValidExtensionVersion(rawExtension, rawExtension.versions).then(rawVersion => { const url = `${ getAssetSource(rawVersion.files, AssetType.VSIX) }?install=true`; const zipPath = path.join(tmpdir(), extension.id); - const opts = this.request(url); return this.getCommonHeaders() - .then(headers => assign(opts, { headers })) - .then(() => request(opts)) + .then(headers => this.requestService.request({ url, headers })) .then(context => download(zipPath, context)) .then(() => zipPath); }); @@ -338,9 +354,10 @@ export class ExtensionGalleryService implements IExtensionGalleryService { const version = versions[0]; const url = getAssetSource(version.files, AssetType.Manifest); - const opts = assign(this.request(url), { headers: { 'accept-encoding': 'gzip' } }); - return request(opts) + return this.getCommonHeaders() + .then(headers => assign(headers, { 'accept-encoding': 'gzip' })) + .then(headers => this.requestService.request({ url, headers })) .then(context => json(context)) .then(manifest => { const desc = { @@ -356,15 +373,4 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return version; }); } - - // Helper for proxy business... shameful. - // This should be pushed down and not rely on the context service - private request(url: string): IRequestOptions { - const httpConfig = this.configurationService.getConfiguration('http') || {}; - const proxyUrl = httpConfig.proxy as string; - const strictSSL = httpConfig.proxyStrictSSL as boolean; - const agent = getProxyAgent(url, { proxyUrl, strictSSL }); - - return { url, agent, strictSSL }; - } } \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index fc6043347ea9992dce963482be20268e051d6485..411e907b40838f1a90ee4fcbf07dc0c46b0808de 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -30,7 +30,9 @@ import {Update} from 'vs/workbench/electron-browser/update'; import {WorkspaceStats} from 'vs/workbench/services/telemetry/common/workspaceStats'; import {IWindowService, WindowService} from 'vs/workbench/services/window/electron-browser/windowService'; import {MessageService} from 'vs/workbench/services/message/electron-browser/messageService'; +import {IRequestService,IRequestService2} from 'vs/platform/request/common/request'; import {RequestService} from 'vs/workbench/services/request/node/requestService'; +import {RequestService2} from 'vs/platform/request/node/requestService2'; import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; import {FileService} from 'vs/workbench/services/files/electron-browser/fileService'; import {SearchService} from 'vs/workbench/services/search/node/searchService'; @@ -57,7 +59,6 @@ import {ILifecycleService} from 'vs/platform/lifecycle/common/lifecycle'; import {IMarkerService} from 'vs/platform/markers/common/markers'; import {IEnvironmentService} from 'vs/platform/environment/common/environment'; import {IMessageService, Severity} from 'vs/platform/message/common/message'; -import {IRequestService} from 'vs/platform/request/common/request'; import {ISearchService} from 'vs/platform/search/common/search'; import {IThreadService} from 'vs/workbench/services/thread/common/threadService'; import {ICommandService} from 'vs/platform/commands/common/commands'; @@ -296,6 +297,9 @@ export class WorkbenchShell { const requestService = disposables.add(instantiationService.createInstance(RequestService)); serviceCollection.set(IRequestService, requestService); + const requestService2 = instantiationService.createInstance(RequestService2); + serviceCollection.set(IRequestService2, requestService2); + const markerService = instantiationService.createInstance(MarkerService); serviceCollection.set(IMarkerService, markerService);