make json, download not call request

This commit is contained in:
Joao Moreno 2016-08-16 17:29:54 +02:00
parent b9d112985f
commit a672eeb462
4 changed files with 66 additions and 66 deletions

View file

@ -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);
});
}

View file

@ -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');

View file

@ -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);

View file

@ -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.