提交 a61546ac 编写于 作者: J Joao Moreno

extension gallery service uses IRequestService2

moves proxy business away from each consumer
上级 a672eeb4
......@@ -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<void> {
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));
......
......@@ -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);
......
......@@ -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<any>(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<IRawGalleryQueryResult>(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<IExtensionManifest>(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<any>('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
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册