make json, download not call request
This commit is contained in:
parent
b9d112985f
commit
a672eeb462
|
@ -6,7 +6,7 @@
|
|||
'use strict';
|
||||
|
||||
import { Promise, TPromise } from 'vs/base/common/winjs.base';
|
||||
import { isBoolean } from 'vs/base/common/types';
|
||||
import { isBoolean, isNumber } from 'vs/base/common/types';
|
||||
import https = require('https');
|
||||
import http = require('http');
|
||||
import { Stream } from 'stream';
|
||||
|
@ -40,9 +40,9 @@ export function request(options: IRequestOptions): TPromise<IRequestContext> {
|
|||
let req: http.ClientRequest;
|
||||
|
||||
return new TPromise<IRequestContext>((c, e) => {
|
||||
let endpoint = parseUrl(options.url);
|
||||
|
||||
let opts: https.RequestOptions = {
|
||||
const endpoint = parseUrl(options.url);
|
||||
const protocol = endpoint.protocol === 'https:' ? https : http;
|
||||
const opts: https.RequestOptions = {
|
||||
hostname: endpoint.hostname,
|
||||
port: endpoint.port ? parseInt(endpoint.port) : (endpoint.protocol === 'https:' ? 443 : 80),
|
||||
path: endpoint.path,
|
||||
|
@ -56,12 +56,13 @@ export function request(options: IRequestOptions): TPromise<IRequestContext> {
|
|||
opts.auth = options.user + ':' + options.password;
|
||||
}
|
||||
|
||||
let protocol = endpoint.protocol === 'https:' ? https : http;
|
||||
req = protocol.request(opts, (res: http.ClientResponse) => {
|
||||
if (res.statusCode >= 300 && res.statusCode < 400 && options.followRedirects && options.followRedirects > 0 && res.headers['location']) {
|
||||
const followRedirects = isNumber(options.followRedirects) ? options.followRedirects : 3;
|
||||
|
||||
if (res.statusCode >= 300 && res.statusCode < 400 && followRedirects > 0 && res.headers['location']) {
|
||||
c(<any> request(assign({}, options, {
|
||||
url: res.headers['location'],
|
||||
followRedirects: options.followRedirects - 1
|
||||
followRedirects: followRedirects - 1
|
||||
})));
|
||||
} else {
|
||||
let stream: Stream = res;
|
||||
|
@ -73,11 +74,13 @@ export function request(options: IRequestOptions): TPromise<IRequestContext> {
|
|||
c({ req, res, stream });
|
||||
}
|
||||
});
|
||||
|
||||
req.on('error', e);
|
||||
|
||||
if (options.timeout) {
|
||||
req.setTimeout(options.timeout);
|
||||
}
|
||||
|
||||
if (options.data) {
|
||||
req.write(options.data);
|
||||
}
|
||||
|
@ -87,50 +90,41 @@ export function request(options: IRequestOptions): TPromise<IRequestContext> {
|
|||
() => req && req.abort());
|
||||
}
|
||||
|
||||
export function download(filePath: string, opts: IRequestOptions): TPromise<void> {
|
||||
return request(assign(opts, { followRedirects: 3 })).then(pair => new TPromise<void>((c, e) => {
|
||||
let out = createWriteStream(filePath);
|
||||
function isSuccess(context: IRequestContext): boolean {
|
||||
return (context.res.statusCode >= 200 && context.res.statusCode < 300) || context.res.statusCode === 1223;
|
||||
}
|
||||
|
||||
function hasNoContent(context: IRequestContext): boolean {
|
||||
return context.res.statusCode === 204;
|
||||
}
|
||||
|
||||
export function download(filePath: string, context: IRequestContext): TPromise<void> {
|
||||
return new TPromise<void>((c, e) => {
|
||||
const out = createWriteStream(filePath);
|
||||
|
||||
out.once('finish', () => c(null));
|
||||
pair.stream.once('error', e);
|
||||
pair.stream.pipe(out);
|
||||
}));
|
||||
context.stream.once('error', e);
|
||||
context.stream.pipe(out);
|
||||
});
|
||||
}
|
||||
|
||||
export function text(opts: IRequestOptions): TPromise<string> {
|
||||
return request(opts).then(pair => new Promise((c, e) => {
|
||||
if (!((pair.res.statusCode >= 200 && pair.res.statusCode < 300) || pair.res.statusCode === 1223)) {
|
||||
return e('Server returned ' + pair.res.statusCode);
|
||||
export function json<T>(context: IRequestContext): TPromise<T> {
|
||||
return new Promise((c, e) => {
|
||||
if (!isSuccess(context)) {
|
||||
return e('Server returned ' + context.res.statusCode);
|
||||
}
|
||||
|
||||
if (pair.res.statusCode === 204) {
|
||||
if (hasNoContent(context)) {
|
||||
return c(null);
|
||||
}
|
||||
|
||||
let buffer: string[] = [];
|
||||
pair.stream.on('data', d => buffer.push(d));
|
||||
pair.stream.on('end', () => c(buffer.join('')));
|
||||
pair.stream.on('error', e);
|
||||
}));
|
||||
}
|
||||
|
||||
export function json<T>(opts: IRequestOptions): TPromise<T> {
|
||||
return request(opts).then(pair => new Promise((c, e) => {
|
||||
if (!((pair.res.statusCode >= 200 && pair.res.statusCode < 300) || pair.res.statusCode === 1223)) {
|
||||
return e('Server returned ' + pair.res.statusCode);
|
||||
}
|
||||
|
||||
if (pair.res.statusCode === 204) {
|
||||
return c(null);
|
||||
}
|
||||
|
||||
if (!/application\/json/.test(pair.res.headers['content-type'])) {
|
||||
if (!/application\/json/.test(context.res.headers['content-type'])) {
|
||||
return e('Response doesn\'t appear to be JSON');
|
||||
}
|
||||
|
||||
let buffer: string[] = [];
|
||||
pair.stream.on('data', d => buffer.push(d));
|
||||
pair.stream.on('end', () => c(JSON.parse(buffer.join(''))));
|
||||
pair.stream.on('error', e);
|
||||
}));
|
||||
const buffer: string[] = [];
|
||||
context.stream.on('data', d => buffer.push(d));
|
||||
context.stream.on('end', () => c(JSON.parse(buffer.join(''))));
|
||||
context.stream.on('error', e);
|
||||
});
|
||||
}
|
|
@ -8,7 +8,7 @@
|
|||
import { EventEmitter } from 'events';
|
||||
import { isString } from 'vs/base/common/types';
|
||||
import { Promise } from 'vs/base/common/winjs.base';
|
||||
import { json } from 'vs/base/node/request';
|
||||
import { request, json } from 'vs/base/node/request';
|
||||
import { getProxyAgent } from 'vs/base/node/proxy';
|
||||
import { ISettingsService } from 'vs/code/electron-main/settings';
|
||||
import { IEnvironmentService } from 'vs/code/electron-main/env';
|
||||
|
@ -54,7 +54,8 @@ export class LinuxAutoUpdaterImpl extends EventEmitter {
|
|||
const strictSSL = this.settingsService.getValue('http.proxyStrictSSL', true);
|
||||
const agent = getProxyAgent(this.url, { proxyUrl, strictSSL });
|
||||
|
||||
this.currentRequest = json<IUpdate>({ url: this.url, agent })
|
||||
this.currentRequest = request({ url: this.url, agent })
|
||||
.then(context => json<IUpdate>(context))
|
||||
.then(update => {
|
||||
if (!update || !update.url || !update.version) {
|
||||
this.emit('update-not-available');
|
||||
|
|
|
@ -14,7 +14,7 @@ import { spawn } from 'child_process';
|
|||
import { mkdirp } from 'vs/base/node/extfs';
|
||||
import { isString } from 'vs/base/common/types';
|
||||
import { Promise, TPromise } from 'vs/base/common/winjs.base';
|
||||
import { download, json } from 'vs/base/node/request';
|
||||
import { request, download, json } from 'vs/base/node/request';
|
||||
import { getProxyAgent } from 'vs/base/node/proxy';
|
||||
import { ISettingsService } from 'vs/code/electron-main/settings';
|
||||
import { ILifecycleService } from 'vs/code/electron-main/lifecycle';
|
||||
|
@ -68,7 +68,8 @@ export class Win32AutoUpdaterImpl extends EventEmitter {
|
|||
const strictSSL = this.settingsService.getValue('http.proxyStrictSSL', true);
|
||||
const agent = getProxyAgent(this.url, { proxyUrl, strictSSL });
|
||||
|
||||
this.currentRequest = json<IUpdate>({ url: this.url, agent })
|
||||
this.currentRequest = request({ url: this.url, agent })
|
||||
.then(context => json<IUpdate>(context))
|
||||
.then(update => {
|
||||
if (!update || !update.url || !update.version) {
|
||||
this.emit('update-not-available');
|
||||
|
@ -89,7 +90,8 @@ export class Win32AutoUpdaterImpl extends EventEmitter {
|
|||
const downloadPath = `${updatePackagePath}.tmp`;
|
||||
const agent = getProxyAgent(url, { proxyUrl, strictSSL });
|
||||
|
||||
return download(downloadPath, { url, agent, strictSSL })
|
||||
return request({ url, agent, strictSSL })
|
||||
.then(context => download(downloadPath, context))
|
||||
.then(hash ? () => checksum(downloadPath, update.hash) : () => null)
|
||||
.then(() => pfs.rename(downloadPath, updatePackagePath))
|
||||
.then(() => updatePackagePath);
|
||||
|
|
|
@ -13,7 +13,7 @@ import { assign, getOrDefault } from 'vs/base/common/objects';
|
|||
import { IRequestService } from 'vs/platform/request/common/request';
|
||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { IPager } from 'vs/base/common/paging';
|
||||
import { download, json, IRequestOptions } from 'vs/base/node/request';
|
||||
import { request, download, json, IRequestOptions } from 'vs/base/node/request';
|
||||
import { getProxyAgent } from 'vs/base/node/proxy';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import pkg from 'vs/platform/package';
|
||||
|
@ -280,7 +280,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
|
|||
|
||||
private queryGallery(query: Query): TPromise<{ galleryExtensions: IRawGalleryExtension[], total: number; }> {
|
||||
const data = JSON.stringify(query.raw);
|
||||
const request = this.request(this.api('/extensionquery'));
|
||||
const opts = this.request(this.api('/extensionquery'));
|
||||
|
||||
return this.getCommonHeaders()
|
||||
.then(headers => assign(headers, {
|
||||
|
@ -289,8 +289,9 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
|
|||
'Accept-Encoding': 'gzip',
|
||||
'Content-Length': data.length
|
||||
}))
|
||||
.then(headers => assign(request, { type: 'POST', data, headers }))
|
||||
.then(() => json<any>(request))
|
||||
.then(headers => assign(opts, { type: 'POST', data, headers }))
|
||||
.then(() => request(opts))
|
||||
.then(context => json<any>(context))
|
||||
.then(result => {
|
||||
const r = result.results[0];
|
||||
const galleryExtensions = r.extensions;
|
||||
|
@ -319,11 +320,12 @@ 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 request = this.request(url);
|
||||
const opts = this.request(url);
|
||||
|
||||
return this.getCommonHeaders()
|
||||
.then(headers => assign(request, { headers }))
|
||||
.then(() => download(zipPath, request))
|
||||
.then(headers => assign(opts, { headers }))
|
||||
.then(() => request(opts))
|
||||
.then(context => download(zipPath, context))
|
||||
.then(() => zipPath);
|
||||
});
|
||||
});
|
||||
|
@ -336,22 +338,23 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
|
|||
|
||||
const version = versions[0];
|
||||
const url = getAssetSource(version.files, AssetType.Manifest);
|
||||
let request = this.request(url);
|
||||
request = assign(request, { headers: { 'accept-encoding': 'gzip' } });
|
||||
const opts = assign(this.request(url), { headers: { 'accept-encoding': 'gzip' } });
|
||||
|
||||
return json<IExtensionManifest>(request).then(manifest => {
|
||||
const desc = {
|
||||
isBuiltin: false,
|
||||
engines: { vscode: manifest.engines.vscode },
|
||||
main: manifest.main
|
||||
};
|
||||
return request(opts)
|
||||
.then(context => json<IExtensionManifest>(context))
|
||||
.then(manifest => {
|
||||
const desc = {
|
||||
isBuiltin: false,
|
||||
engines: { vscode: manifest.engines.vscode },
|
||||
main: manifest.main
|
||||
};
|
||||
|
||||
if (!isValidExtensionVersion(pkg.version, desc, [])) {
|
||||
return this.getLastValidExtensionVersion(extension, versions.slice(1));
|
||||
}
|
||||
if (!isValidExtensionVersion(pkg.version, desc, [])) {
|
||||
return this.getLastValidExtensionVersion(extension, versions.slice(1));
|
||||
}
|
||||
|
||||
return version;
|
||||
});
|
||||
return version;
|
||||
});
|
||||
}
|
||||
|
||||
// Helper for proxy business... shameful.
|
||||
|
|
Loading…
Reference in a new issue