Skip to content

Commit f3d9762

Browse files
author
Benjamin Pasero
committed
debt - allow to use request helper from base
1 parent b872866 commit f3d9762

9 files changed

Lines changed: 120 additions & 96 deletions

File tree

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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+
6+
import { CancellationToken } from 'vs/base/common/cancellation';
7+
import { canceled } from 'vs/base/common/errors';
8+
import { assign } from 'vs/base/common/objects';
9+
import { VSBuffer, bufferToStream } from 'vs/base/common/buffer';
10+
import { IRequestOptions, IRequestContext } from 'vs/base/parts/request/common/request';
11+
12+
export function request(options: IRequestOptions, token: CancellationToken): Promise<IRequestContext> {
13+
if (options.proxyAuthorization) {
14+
options.headers = assign(options.headers || {}, { 'Proxy-Authorization': options.proxyAuthorization });
15+
}
16+
17+
const xhr = new XMLHttpRequest();
18+
return new Promise<IRequestContext>((resolve, reject) => {
19+
20+
xhr.open(options.type || 'GET', options.url || '', true, options.user, options.password);
21+
setRequestHeaders(xhr, options);
22+
23+
xhr.responseType = 'arraybuffer';
24+
xhr.onerror = e => reject(new Error(xhr.statusText && ('XHR failed: ' + xhr.statusText)));
25+
xhr.onload = (e) => {
26+
resolve({
27+
res: {
28+
statusCode: xhr.status,
29+
headers: getResponseHeaders(xhr)
30+
},
31+
stream: bufferToStream(VSBuffer.wrap(new Uint8Array(xhr.response)))
32+
});
33+
};
34+
xhr.ontimeout = e => reject(new Error(`XHR timeout: ${options.timeout}ms`));
35+
36+
if (options.timeout) {
37+
xhr.timeout = options.timeout;
38+
}
39+
40+
xhr.send(options.data);
41+
42+
// cancel
43+
token.onCancellationRequested(() => {
44+
xhr.abort();
45+
reject(canceled());
46+
});
47+
});
48+
}
49+
50+
function setRequestHeaders(xhr: XMLHttpRequest, options: IRequestOptions): void {
51+
if (options.headers) {
52+
outer: for (let k in options.headers) {
53+
switch (k) {
54+
case 'User-Agent':
55+
case 'Accept-Encoding':
56+
case 'Content-Length':
57+
// unsafe headers
58+
continue outer;
59+
}
60+
xhr.setRequestHeader(k, options.headers[k]);
61+
}
62+
}
63+
}
64+
65+
function getResponseHeaders(xhr: XMLHttpRequest): { [name: string]: string } {
66+
const headers: { [name: string]: string } = Object.create(null);
67+
for (const line of xhr.getAllResponseHeaders().split(/\r\n|\n|\r/g)) {
68+
if (line) {
69+
const idx = line.indexOf(':');
70+
headers[line.substr(0, idx).trim().toLowerCase()] = line.substr(idx + 1).trim();
71+
}
72+
}
73+
return headers;
74+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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+
6+
import { VSBufferReadableStream } from 'vs/base/common/buffer';
7+
8+
export interface IHeaders {
9+
[header: string]: string;
10+
}
11+
12+
export interface IRequestOptions {
13+
type?: string;
14+
url?: string;
15+
user?: string;
16+
password?: string;
17+
headers?: IHeaders;
18+
timeout?: number;
19+
data?: string;
20+
followRedirects?: number;
21+
proxyAuthorization?: string;
22+
}
23+
24+
export interface IRequestContext {
25+
res: {
26+
headers: IHeaders;
27+
statusCode?: number;
28+
};
29+
stream: VSBufferReadableStream;
30+
}

src/vs/platform/extensionManagement/common/extensionGalleryService.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import { getGalleryExtensionId, getGalleryExtensionTelemetryData, adoptToGallery
99
import { assign, getOrDefault } from 'vs/base/common/objects';
1010
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
1111
import { IPager } from 'vs/base/common/paging';
12-
import { IRequestService, IRequestOptions, IRequestContext, asJson, asText, IHeaders } from 'vs/platform/request/common/request';
12+
import { IRequestService, asJson, asText } from 'vs/platform/request/common/request';
13+
import { IRequestOptions, IRequestContext, IHeaders } from 'vs/base/parts/request/common/request';
1314
import { isEngineValid } from 'vs/platform/extensions/common/extensionValidator';
1415
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
1516
import { generateUuid, isUUID } from 'vs/base/common/uuid';

src/vs/platform/request/browser/requestService.ts

Lines changed: 6 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { IRequestOptions, IRequestContext } from 'vs/platform/request/common/request';
6+
import { IRequestOptions, IRequestContext } from 'vs/base/parts/request/common/request';
77
import { CancellationToken } from 'vs/base/common/cancellation';
8-
import { canceled } from 'vs/base/common/errors';
98
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
109
import { ILogService } from 'vs/platform/log/common/log';
11-
import { assign } from 'vs/base/common/objects';
12-
import { VSBuffer, bufferToStream } from 'vs/base/common/buffer';
10+
import { request } from 'vs/base/parts/request/browser/request';
1311

1412
/**
1513
* This service exposes the `request` API, while using the global
@@ -28,69 +26,10 @@ export class RequestService {
2826
request(options: IRequestOptions, token: CancellationToken): Promise<IRequestContext> {
2927
this.logService.trace('RequestService#request', options.url);
3028

31-
const authorization = this.configurationService.getValue<string>('http.proxyAuthorization');
32-
if (authorization) {
33-
options.headers = assign(options.headers || {}, { 'Proxy-Authorization': authorization });
29+
if (!options.proxyAuthorization) {
30+
options.proxyAuthorization = this.configurationService.getValue<string>('http.proxyAuthorization');
3431
}
3532

36-
const xhr = new XMLHttpRequest();
37-
return new Promise<IRequestContext>((resolve, reject) => {
38-
39-
xhr.open(options.type || 'GET', options.url || '', true, options.user, options.password);
40-
this.setRequestHeaders(xhr, options);
41-
42-
xhr.responseType = 'arraybuffer';
43-
xhr.onerror = e => reject(new Error(xhr.statusText && ('XHR failed: ' + xhr.statusText)));
44-
xhr.onload = (e) => {
45-
resolve({
46-
res: {
47-
statusCode: xhr.status,
48-
headers: this.getResponseHeaders(xhr)
49-
},
50-
stream: bufferToStream(VSBuffer.wrap(new Uint8Array(xhr.response)))
51-
});
52-
};
53-
xhr.ontimeout = e => reject(new Error(`XHR timeout: ${options.timeout}ms`));
54-
55-
if (options.timeout) {
56-
xhr.timeout = options.timeout;
57-
}
58-
59-
xhr.send(options.data);
60-
61-
// cancel
62-
token.onCancellationRequested(() => {
63-
xhr.abort();
64-
reject(canceled());
65-
});
66-
});
33+
return request(options, token);
6734
}
68-
69-
private setRequestHeaders(xhr: XMLHttpRequest, options: IRequestOptions): void {
70-
if (options.headers) {
71-
outer: for (let k in options.headers) {
72-
switch (k) {
73-
case 'User-Agent':
74-
case 'Accept-Encoding':
75-
case 'Content-Length':
76-
// unsafe headers
77-
continue outer;
78-
}
79-
xhr.setRequestHeader(k, options.headers[k]);
80-
81-
}
82-
}
83-
}
84-
85-
private getResponseHeaders(xhr: XMLHttpRequest): { [name: string]: string } {
86-
const headers: { [name: string]: string } = Object.create(null);
87-
for (const line of xhr.getAllResponseHeaders().split(/\r\n|\n|\r/g)) {
88-
if (line) {
89-
const idx = line.indexOf(':');
90-
headers[line.substr(0, idx).trim().toLowerCase()] = line.substr(idx + 1).trim();
91-
}
92-
}
93-
return headers;
94-
}
95-
96-
}
35+
}

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

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,11 @@ import { CancellationToken } from 'vs/base/common/cancellation';
88
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
99
import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry';
1010
import { Registry } from 'vs/platform/registry/common/platform';
11-
import { VSBufferReadableStream, streamToBuffer } from 'vs/base/common/buffer';
11+
import { streamToBuffer } from 'vs/base/common/buffer';
12+
import { IRequestOptions, IRequestContext } from 'vs/base/parts/request/common/request';
1213

1314
export const IRequestService = createDecorator<IRequestService>('requestService');
1415

15-
export interface IHeaders {
16-
[header: string]: string;
17-
}
18-
19-
export interface IRequestOptions {
20-
type?: string;
21-
url?: string;
22-
user?: string;
23-
password?: string;
24-
headers?: IHeaders;
25-
timeout?: number;
26-
data?: string;
27-
followRedirects?: number;
28-
}
29-
30-
export interface IRequestContext {
31-
res: {
32-
headers: IHeaders;
33-
statusCode?: number;
34-
};
35-
stream: VSBufferReadableStream;
36-
}
37-
3816
export interface IRequestService {
3917
_serviceBrand: any;
4018

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55

66
import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc';
77
import { Event } from 'vs/base/common/event';
8-
import { IRequestService, IRequestOptions, IRequestContext, IHeaders } from 'vs/platform/request/common/request';
8+
import { IRequestService } from 'vs/platform/request/common/request';
9+
import { IRequestOptions, IRequestContext, IHeaders } from 'vs/base/parts/request/common/request';
910
import { CancellationToken } from 'vs/base/common/cancellation';
1011
import { VSBuffer, bufferToStream, streamToBuffer } from 'vs/base/common/buffer';
1112

src/vs/platform/request/electron-main/requestService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { IRequestOptions, IRequestContext } from 'vs/platform/request/common/request';
6+
import { IRequestOptions, IRequestContext } from 'vs/base/parts/request/common/request';
77
import { RequestService as NodeRequestService, IRawRequestFunction } from 'vs/platform/request/node/requestService';
88
import { assign } from 'vs/base/common/objects';
99
import { net } from 'electron';

src/vs/platform/request/node/requestService.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import { assign } from 'vs/base/common/objects';
1313
import { isBoolean, isNumber } from 'vs/base/common/types';
1414
import { canceled } from 'vs/base/common/errors';
1515
import { CancellationToken } from 'vs/base/common/cancellation';
16-
import { IRequestOptions, IRequestContext, IRequestService, IHTTPConfiguration } from 'vs/platform/request/common/request';
16+
import { IRequestService, IHTTPConfiguration } from 'vs/platform/request/common/request';
17+
import { IRequestOptions, IRequestContext } from 'vs/base/parts/request/common/request';
1718
import { getProxyAgent, Agent } from 'vs/platform/request/node/proxy';
1819
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1920
import { ILogService } from 'vs/platform/log/common/log';

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { IRequestOptions, IRequestContext } from 'vs/platform/request/common/request';
6+
import { IRequestOptions, IRequestContext } from 'vs/base/parts/request/common/request';
77
import { CancellationToken } from 'vs/base/common/cancellation';
88
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
99
import { ILogService } from 'vs/platform/log/common/log';

0 commit comments

Comments
 (0)