From a672eeb4621d431f0077015723b2b1f059610ce2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 16 Aug 2016 17:29:54 +0200 Subject: [PATCH] make json, download not call request --- src/vs/base/node/request.ts | 76 +++++++++---------- .../code/electron-main/auto-updater.linux.ts | 5 +- .../code/electron-main/auto-updater.win32.ts | 8 +- .../node/extensionGalleryService.ts | 43 ++++++----- 4 files changed, 66 insertions(+), 66 deletions(-) diff --git a/src/vs/base/node/request.ts b/src/vs/base/node/request.ts index 289a0c9f654..8c62ba152ef 100644 --- a/src/vs/base/node/request.ts +++ b/src/vs/base/node/request.ts @@ -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 { let req: http.ClientRequest; return new TPromise((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 { 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( 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 { 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 { () => req && req.abort()); } -export function download(filePath: string, opts: IRequestOptions): TPromise { - return request(assign(opts, { followRedirects: 3 })).then(pair => new TPromise((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 { + return new TPromise((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 { - 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(context: IRequestContext): TPromise { + 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(opts: IRequestOptions): TPromise { - 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); + }); } \ No newline at end of file diff --git a/src/vs/code/electron-main/auto-updater.linux.ts b/src/vs/code/electron-main/auto-updater.linux.ts index edffa852c0d..ee97eb08316 100644 --- a/src/vs/code/electron-main/auto-updater.linux.ts +++ b/src/vs/code/electron-main/auto-updater.linux.ts @@ -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({ url: this.url, agent }) + this.currentRequest = request({ url: this.url, agent }) + .then(context => json(context)) .then(update => { if (!update || !update.url || !update.version) { this.emit('update-not-available'); diff --git a/src/vs/code/electron-main/auto-updater.win32.ts b/src/vs/code/electron-main/auto-updater.win32.ts index 2b1e8cf535e..5b1bff1d385 100644 --- a/src/vs/code/electron-main/auto-updater.win32.ts +++ b/src/vs/code/electron-main/auto-updater.win32.ts @@ -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({ url: this.url, agent }) + this.currentRequest = request({ url: this.url, agent }) + .then(context => json(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); diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index d40ab7e0ba7..d375b03be01 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -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(request)) + .then(headers => assign(opts, { type: 'POST', data, headers })) + .then(() => request(opts)) + .then(context => json(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(request).then(manifest => { - const desc = { - isBuiltin: false, - engines: { vscode: manifest.engines.vscode }, - main: manifest.main - }; + return request(opts) + .then(context => json(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.