Skip to content

Commit b9d1129

Browse files
committed
RequestService2
1 parent ca41e24 commit b9d1129

5 files changed

Lines changed: 99 additions & 30 deletions

File tree

src/vs/base/node/proxy.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import { Url, parse as parseUrl } from 'url';
99
import { isBoolean } from 'vs/base/common/types';
10+
import { Agent } from './request';
1011
import HttpProxyAgent = require('http-proxy-agent');
1112
import HttpsProxyAgent = require('https-proxy-agent');
1213

@@ -25,7 +26,7 @@ export interface IOptions {
2526
strictSSL?: boolean;
2627
}
2728

28-
export function getProxyAgent(rawRequestURL: string, options: IOptions = {}): any {
29+
export function getProxyAgent(rawRequestURL: string, options: IOptions = {}): Agent {
2930
const requestURL = parseUrl(rawRequestURL);
3031
const proxyURL = options.proxyUrl || getSystemProxyURI(requestURL);
3132

src/vs/base/node/request.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import { createWriteStream } from 'fs';
1515
import { assign } from 'vs/base/common/objects';
1616
import { createGunzip } from 'zlib';
1717

18+
export type Agent = any;
19+
1820
export interface IRequestOptions {
1921
type?: string;
2022
url?: string;
@@ -23,21 +25,21 @@ export interface IRequestOptions {
2325
headers?: any;
2426
timeout?: number;
2527
data?: any;
26-
agent?: any;
28+
agent?: Agent;
2729
followRedirects?: number;
2830
strictSSL?: boolean;
2931
}
3032

31-
export interface IRequestResult {
33+
export interface IRequestContext {
3234
req: http.ClientRequest;
3335
res: http.ClientResponse;
3436
stream: Stream;
3537
}
3638

37-
export function request(options: IRequestOptions): TPromise<IRequestResult> {
39+
export function request(options: IRequestOptions): TPromise<IRequestContext> {
3840
let req: http.ClientRequest;
3941

40-
return new TPromise<IRequestResult>((c, e) => {
42+
return new TPromise<IRequestContext>((c, e) => {
4143
let endpoint = parseUrl(options.url);
4244

4345
let opts: https.RequestOptions = {

src/vs/platform/request/common/request.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
*--------------------------------------------------------------------------------------------*/
55
'use strict';
66

7+
import { localize } from 'vs/nls';
78
import http = require('vs/base/common/http');
89
import { TPromise } from 'vs/base/common/winjs.base';
910
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
11+
import { IRequestOptions, IRequestContext } from 'vs/base/node/request';
12+
import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry';
13+
import { Registry } from 'vs/platform/platform';
1014

1115
export const IRequestService = createDecorator<IRequestService>('requestService');
1216

@@ -18,4 +22,39 @@ export interface IRequestService {
1822
* of calling WinJS.XHR directly.
1923
*/
2024
makeRequest(options: http.IXHROptions): TPromise<http.IXHRResponse>;
21-
}
25+
}
26+
27+
export const IRequestService2 = createDecorator<IRequestService>('requestService2');
28+
29+
export interface IRequestService2 {
30+
_serviceBrand: any;
31+
32+
request(options: IRequestOptions): TPromise<IRequestContext>;
33+
}
34+
35+
export interface IHTTPConfiguration {
36+
http?: {
37+
proxy?: string;
38+
proxyStrictSSL?: boolean;
39+
};
40+
}
41+
42+
Registry.as<IConfigurationRegistry>(Extensions.Configuration)
43+
.registerConfiguration({
44+
id: 'http',
45+
order: 15,
46+
title: localize('httpConfigurationTitle', "HTTP"),
47+
type: 'object',
48+
properties: {
49+
'http.proxy': {
50+
type: 'string',
51+
pattern: '^https?://([^:]*(:[^@]*)?@)?([^:]+)(:\\d+)?/?$|^$',
52+
description: localize('proxy', "The proxy setting to use. If not set will be taken from the http_proxy and https_proxy environment variables")
53+
},
54+
'http.proxyStrictSSL': {
55+
type: 'boolean',
56+
default: true,
57+
description: localize('strictSSL', "Whether the proxy server certificate should be verified against the list of supplied CAs.")
58+
}
59+
}
60+
});
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
'use strict';
6+
7+
import { TPromise } from 'vs/base/common/winjs.base';
8+
import { IDisposable } from 'vs/base/common/lifecycle';
9+
import { IRequestOptions, IRequestContext, request } from 'vs/base/node/request';
10+
import { getProxyAgent } from 'vs/base/node/proxy';
11+
import { IRequestService2, IHTTPConfiguration } from 'vs/platform/request/common/request';
12+
import { IConfigurationService, IConfigurationServiceEvent } from 'vs/platform/configuration/common/configuration';
13+
14+
/**
15+
* This service exposes the `request` API, while using the global
16+
* or configured proxy settings.
17+
*/
18+
export class RequestService2 implements IRequestService2 {
19+
20+
_serviceBrand: any;
21+
22+
private proxyUrl: string;
23+
private strictSSL: boolean;
24+
private disposables: IDisposable[] = [];
25+
26+
constructor(
27+
@IConfigurationService configurationService: IConfigurationService
28+
) {
29+
this.configure(configurationService.getConfiguration<IHTTPConfiguration>());
30+
configurationService.onDidUpdateConfiguration(this.onDidUpdateConfiguration, this, this.disposables);
31+
}
32+
33+
private onDidUpdateConfiguration(e: IConfigurationServiceEvent) {
34+
this.configure(e.config);
35+
}
36+
37+
private configure(config: IHTTPConfiguration) {
38+
this.proxyUrl = config.http && config.http.proxy;
39+
this.strictSSL = config.http && config.http.proxyStrictSSL;
40+
}
41+
42+
request(options: IRequestOptions): TPromise<IRequestContext> {
43+
if (!options.agent) {
44+
const { proxyUrl, strictSSL } = this;
45+
options.agent = getProxyAgent(options.url, { proxyUrl, strictSSL });
46+
}
47+
48+
return request(options);
49+
}
50+
}

src/vs/workbench/services/request/node/requestService.ts

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77

88
import { TPromise, Promise } from 'vs/base/common/winjs.base';
99
import { xhr } from 'vs/base/common/network';
10-
import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry';
1110
import strings = require('vs/base/common/strings');
1211
import nls = require('vs/nls');
1312
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
14-
import platform = require('vs/platform/platform');
1513
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1614
import { BaseRequestService } from 'vs/platform/request/common/baseRequestService';
1715
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
@@ -132,25 +130,4 @@ export class RequestService extends BaseRequestService {
132130
dispose(): void {
133131
this.disposables = dispose(this.disposables);
134132
}
135-
}
136-
137-
// Configuration
138-
let confRegistry = <IConfigurationRegistry>platform.Registry.as(Extensions.Configuration);
139-
confRegistry.registerConfiguration({
140-
id: 'http',
141-
order: 15,
142-
title: nls.localize('httpConfigurationTitle', "HTTP"),
143-
type: 'object',
144-
properties: {
145-
'http.proxy': {
146-
type: 'string',
147-
pattern: '^https?://([^:]*(:[^@]*)?@)?([^:]+)(:\\d+)?/?$|^$',
148-
description: nls.localize('proxy', "The proxy setting to use. If not set will be taken from the http_proxy and https_proxy environment variables")
149-
},
150-
'http.proxyStrictSSL': {
151-
type: 'boolean',
152-
default: true,
153-
description: nls.localize('strictSSL', "Whether the proxy server certificate should be verified against the list of supplied CAs.")
154-
}
155-
}
156-
});
133+
}

0 commit comments

Comments
 (0)