From 8325ef1d025f474b663d46839143465548c1d125 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Mon, 16 Nov 2015 00:02:02 +0500 Subject: [PATCH 01/25] remove Node.js 0.10/0.12 from travis --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4e2a815..fc30ccf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,4 @@ language: node_js node_js: - '5' - '4' - - '0.12' - - '0.10' after_success: npm run coveralls From 870cd03c99e5c55810f17155ac36119543c6130b Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Mon, 16 Nov 2015 00:06:20 +0500 Subject: [PATCH 02/25] remove pinkie-promise --- index.js | 5 ++--- package.json | 1 - test/_server.js | 1 - 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index b100e67..a7cb7b9 100644 --- a/index.js +++ b/index.js @@ -12,7 +12,6 @@ var timedOut = require('timed-out'); var urlParseLax = require('url-parse-lax'); var lowercaseKeys = require('lowercase-keys'); var isRedirect = require('is-redirect'); -var PinkiePromise = require('pinkie-promise'); var unzipResponse = require('unzip-response'); var createErrorClass = require('create-error-class'); var nodeStatusCodes = require('node-status-codes'); @@ -119,7 +118,7 @@ function asCallback(opts, cb) { } function asPromise(opts) { - return new PinkiePromise(function (resolve, reject) { + return new Promise(function (resolve, reject) { asCallback(opts, function (err, data, response) { if (response) { response.body = data; @@ -295,7 +294,7 @@ function got(url, opts, cb) { try { return asPromise(normalizeArguments(url, opts)); } catch (error) { - return PinkiePromise.reject(error); + return Promise.reject(error); } } diff --git a/package.json b/package.json index b6a63b3..0ecde42 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,6 @@ "node-status-codes": "^1.0.0", "object-assign": "^4.0.1", "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", "read-all-stream": "^3.0.0", "timed-out": "^2.0.0", "unzip-response": "^1.0.0", diff --git a/test/_server.js b/test/_server.js index 663e009..9de2c8d 100644 --- a/test/_server.js +++ b/test/_server.js @@ -3,7 +3,6 @@ var http = require('http'); var https = require('https'); var pify = require('pify'); var getPort = require('get-port'); -var Promise = require('pinkie-promise'); var host = exports.host = 'localhost'; exports.createServer = function () { From 5f76fa016f102062b8233fd7e0cce71c45bf9a3d Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Mon, 16 Nov 2015 00:16:45 +0500 Subject: [PATCH 03/25] basic consts and function arrow replacement --- index.js | 84 +++++++++++++++++++++++++--------------------------- package.json | 1 + 2 files changed, 41 insertions(+), 44 deletions(-) diff --git a/index.js b/index.js index a7cb7b9..62bfbd8 100644 --- a/index.js +++ b/index.js @@ -1,22 +1,21 @@ -'use strict'; -var EventEmitter = require('events').EventEmitter; -var http = require('http'); -var https = require('https'); -var urlLib = require('url'); -var querystring = require('querystring'); -var objectAssign = require('object-assign'); -var duplexify = require('duplexify'); -var isStream = require('is-stream'); -var readAllStream = require('read-all-stream'); -var timedOut = require('timed-out'); -var urlParseLax = require('url-parse-lax'); -var lowercaseKeys = require('lowercase-keys'); -var isRedirect = require('is-redirect'); -var unzipResponse = require('unzip-response'); -var createErrorClass = require('create-error-class'); -var nodeStatusCodes = require('node-status-codes'); -var isPlainObj = require('is-plain-obj'); -var parseJson = require('parse-json'); +const EventEmitter = require('events').EventEmitter; +const http = require('http'); +const https = require('https'); +const urlLib = require('url'); +const querystring = require('querystring'); +const objectAssign = require('object-assign'); +const duplexify = require('duplexify'); +const isStream = require('is-stream'); +const readAllStream = require('read-all-stream'); +const timedOut = require('timed-out'); +const urlParseLax = require('url-parse-lax'); +const lowercaseKeys = require('lowercase-keys'); +const isRedirect = require('is-redirect'); +const unzipResponse = require('unzip-response'); +const createErrorClass = require('create-error-class'); +const nodeStatusCodes = require('node-status-codes'); +const isPlainObj = require('is-plain-obj'); +const parseJson = require('parse-json'); function requestAsEventEmitter(opts) { opts = opts || {}; @@ -25,10 +24,10 @@ function requestAsEventEmitter(opts) { var redirectCount = 0; var retryCount = 0; - var get = function (opts) { + var get = opts => { var fn = opts.protocol === 'https:' ? https : http; - var req = fn.request(opts, function (res) { + var req = fn.request(opts, res => { var statusCode = res.statusCode; if (isRedirect(statusCode) && 'location' in res.headers && (opts.method === 'GET' || opts.method === 'HEAD')) { @@ -48,14 +47,14 @@ function requestAsEventEmitter(opts) { return; } - // do not write ee.bind(...) instead of function - it will break gzip in Node.js 0.10 setImmediate(function () { ee.emit('response', typeof unzipResponse === 'function' && req.method !== 'HEAD' ? unzipResponse(res) : res); }); }); - req.once('error', function (err) { - var backoff = opts.retries(++retryCount, err); + req.once('error', err => { + const backoff = opts.retries(++retryCount, err); + if (backoff) { setTimeout(get, backoff, opts); return; @@ -68,7 +67,7 @@ function requestAsEventEmitter(opts) { timedOut(req, opts.timeout); } - setImmediate(ee.emit.bind(ee), 'request', req); + setImmediate(() => ee.emit('request', req)); }; get(opts); @@ -78,7 +77,7 @@ function requestAsEventEmitter(opts) { function asCallback(opts, cb) { var ee = requestAsEventEmitter(opts); - ee.on('request', function (req) { + ee.on('request', req => { if (isStream(opts.body)) { opts.body.pipe(req); opts.body = undefined; @@ -88,8 +87,8 @@ function asCallback(opts, cb) { req.end(opts.body); }); - ee.on('response', function (res) { - readAllStream(res, opts.encoding, function (err, data) { + ee.on('response', res => + readAllStream(res, opts.encoding, (err, data) => { var statusCode = res.statusCode; if (err) { @@ -111,31 +110,28 @@ function asCallback(opts, cb) { } cb(err, data, res); - }); - }); + }) + ); ee.on('error', cb); } function asPromise(opts) { - return new Promise(function (resolve, reject) { - asCallback(opts, function (err, data, response) { + return new Promise((resolve, reject) => + asCallback(opts, (err, data, response) => { if (response) { response.body = data; } if (err) { - Object.defineProperty(err, 'response', { - value: response, - enumerable: false - }); + Object.defineProperty(err, 'response', {value: response}); reject(err); return; } resolve(response); - }); - }); + }) + ); } function asStream(opts) { @@ -146,14 +142,14 @@ function asStream(opts) { } if (opts.body) { - proxy.write = function () { + proxy.write = () => { throw new Error('got\'s stream is not writable when options.body is used'); }; } var ee = requestAsEventEmitter(opts); - ee.on('request', function (req) { + ee.on('request', req => { proxy.emit('request', req); if (isStream.readable(opts.body)) { @@ -174,7 +170,7 @@ function asStream(opts) { req.end(); }); - ee.on('response', function (res) { + ee.on('response', res => { var statusCode = res.statusCode; proxy.setReadable(res); @@ -307,8 +303,8 @@ var helpers = [ 'delete' ]; -helpers.forEach(function (el) { - got[el] = function (url, opts, cb) { +helpers.forEach(el => { + got[el] = (url, opts, cb) => { if (typeof opts === 'function') { cb = opts; opts = {}; @@ -326,7 +322,7 @@ got.stream = function (url, opts, cb) { return asStream(normalizeArguments(url, opts)); }; -helpers.forEach(function (el) { +helpers.forEach(el => { got.stream[el] = function (url, opts) { return got.stream(url, objectAssign({}, opts, {method: el.toUpperCase()})); }; diff --git a/package.json b/package.json index 0ecde42..1d61b22 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "xo": "*" }, "xo": { + "esnext": true, "ignores": [ "test/**" ] From 3c66bd74c7bce044cb03c82e78a8f28c8bc03dfe Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Fri, 20 Nov 2015 22:57:28 +0500 Subject: [PATCH 04/25] use string templates where appropriate --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 62bfbd8..712b9e2 100644 --- a/index.js +++ b/index.js @@ -192,7 +192,7 @@ function asStream(opts) { function normalizeArguments(url, opts) { if (typeof url !== 'string' && typeof url !== 'object') { - throw new Error('Parameter `url` must be a string or object, not ' + typeof url); + throw new Error(`Parameter \`url\` must be a string or object, not ${typeof url}`); } if (typeof url === 'string') { @@ -350,7 +350,7 @@ got.HTTPError = createErrorClass('HTTPError', function (statusCode, opts) { stdError.call(this, {}, opts); this.statusCode = statusCode; this.statusMessage = nodeStatusCodes[this.statusCode]; - this.message = 'Response code ' + this.statusCode + ' (' + this.statusMessage + ')'; + this.message = `Response code ${this.statusCode} (${this.statusMessage})`; }); got.MaxRedirectsError = createErrorClass('MaxRedirectsError', function (statusCode, opts) { From 9378d921202e345aaedb14b2c66da0fbd79ebe21 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Fri, 20 Nov 2015 23:34:43 +0500 Subject: [PATCH 05/25] replace read-all-stream with get-stream Closes #132 --- index.js | 42 +++++++++++++++++++++--------------------- package.json | 4 ++-- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/index.js b/index.js index 712b9e2..e258b36 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,7 @@ const querystring = require('querystring'); const objectAssign = require('object-assign'); const duplexify = require('duplexify'); const isStream = require('is-stream'); -const readAllStream = require('read-all-stream'); +const getStream = require('get-stream'); const timedOut = require('timed-out'); const urlParseLax = require('url-parse-lax'); const lowercaseKeys = require('lowercase-keys'); @@ -87,31 +87,31 @@ function asCallback(opts, cb) { req.end(opts.body); }); - ee.on('response', res => - readAllStream(res, opts.encoding, (err, data) => { - var statusCode = res.statusCode; + ee.on('response', res => { + var stream = opts.encoding === null ? getStream.buffer(res) : getStream(res, opts); - if (err) { - cb(new got.ReadError(err, opts), null, res); - return; - } + stream + .then(data => { + var err; + var statusCode = res.statusCode; - if (statusCode < 200 || statusCode > 299) { - err = new got.HTTPError(statusCode, opts); - } + if (statusCode < 200 || statusCode > 299) { + err = new got.HTTPError(statusCode, opts); + } - if (opts.json && statusCode !== 204) { - try { - data = parseJson(data); - } catch (e) { - e.fileName = urlLib.format(opts); - err = new got.ParseError(e, opts); + if (opts.json && statusCode !== 204) { + try { + data = parseJson(data); + } catch (e) { + e.fileName = urlLib.format(opts); + err = new got.ParseError(e, opts); + } } - } - cb(err, data, res); - }) - ); + cb(err, data, res); + }) + .catch(err => cb(new got.ReadError(err, opts), null, res)); + }); ee.on('error', cb); } diff --git a/package.json b/package.json index 1d61b22..8888db7 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "dependencies": { "create-error-class": "^2.0.0", "duplexify": "^3.2.0", + "get-stream": "^1.1.0", "is-plain-obj": "^1.0.0", "is-redirect": "^1.0.0", "is-stream": "^1.0.0", @@ -54,7 +55,6 @@ "node-status-codes": "^1.0.0", "object-assign": "^4.0.1", "parse-json": "^2.1.0", - "read-all-stream": "^3.0.0", "timed-out": "^2.0.0", "unzip-response": "^1.0.0", "url-parse-lax": "^1.0.0" @@ -71,7 +71,7 @@ "xo": "*" }, "xo": { - "esnext": true, + "esnext": false, "ignores": [ "test/**" ] From df6526461b1ececbe69afb2480c1d1117b51740b Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Wed, 2 Dec 2015 18:26:53 +0500 Subject: [PATCH 06/25] =?UTF-8?q?var=20=E2=86=92=20const=20&=20let?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/index.js b/index.js index e258b36..56f2bdd 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,5 @@ +'use strict'; + const EventEmitter = require('events').EventEmitter; const http = require('http'); const https = require('https'); @@ -20,15 +22,15 @@ const parseJson = require('parse-json'); function requestAsEventEmitter(opts) { opts = opts || {}; - var ee = new EventEmitter(); - var redirectCount = 0; - var retryCount = 0; + const ee = new EventEmitter(); + let redirectCount = 0; + let retryCount = 0; - var get = opts => { - var fn = opts.protocol === 'https:' ? https : http; + const get = opts => { + const fn = opts.protocol === 'https:' ? https : http; - var req = fn.request(opts, res => { - var statusCode = res.statusCode; + const req = fn.request(opts, res => { + const statusCode = res.statusCode; if (isRedirect(statusCode) && 'location' in res.headers && (opts.method === 'GET' || opts.method === 'HEAD')) { res.resume(); @@ -38,8 +40,8 @@ function requestAsEventEmitter(opts) { return; } - var redirectUrl = urlLib.resolve(urlLib.format(opts), res.headers.location); - var redirectOpts = objectAssign({}, opts, urlLib.parse(redirectUrl)); + const redirectUrl = urlLib.resolve(urlLib.format(opts), res.headers.location); + const redirectOpts = objectAssign({}, opts, urlLib.parse(redirectUrl)); ee.emit('redirect', res, redirectOpts); @@ -75,7 +77,7 @@ function requestAsEventEmitter(opts) { } function asCallback(opts, cb) { - var ee = requestAsEventEmitter(opts); + const ee = requestAsEventEmitter(opts); ee.on('request', req => { if (isStream(opts.body)) { @@ -88,12 +90,12 @@ function asCallback(opts, cb) { }); ee.on('response', res => { - var stream = opts.encoding === null ? getStream.buffer(res) : getStream(res, opts); + const stream = opts.encoding === null ? getStream.buffer(res) : getStream(res, opts); stream .then(data => { - var err; - var statusCode = res.statusCode; + let err; + const statusCode = res.statusCode; if (statusCode < 200 || statusCode > 299) { err = new got.HTTPError(statusCode, opts); @@ -135,7 +137,7 @@ function asPromise(opts) { } function asStream(opts) { - var proxy = duplexify(); + const proxy = duplexify(); if (opts.json) { throw new Error('got can not be used as stream when options.json is used'); @@ -147,7 +149,7 @@ function asStream(opts) { }; } - var ee = requestAsEventEmitter(opts); + const ee = requestAsEventEmitter(opts); ee.on('request', req => { proxy.emit('request', req); @@ -171,7 +173,7 @@ function asStream(opts) { }); ee.on('response', res => { - var statusCode = res.statusCode; + const statusCode = res.statusCode; proxy.setReadable(res); @@ -214,14 +216,14 @@ function normalizeArguments(url, opts) { 'accept-encoding': 'gzip,deflate' }, lowercaseKeys(opts.headers)); - var query = opts.query; + const query = opts.query; if (query) { if (typeof query !== 'string') { opts.query = querystring.stringify(query); } - opts.path = opts.path.split('?')[0] + '?' + opts.query; + opts.path = `${opts.path.split('?')[0]}?${opts.query}`; delete opts.query; } @@ -229,7 +231,7 @@ function normalizeArguments(url, opts) { opts.headers.accept = 'application/json'; } - var body = opts.body; + let body = opts.body; if (body) { if (typeof body !== 'string' && !Buffer.isBuffer(body) && !isStream.readable(body) && !isPlainObj(body)) { @@ -244,7 +246,7 @@ function normalizeArguments(url, opts) { } if (opts.headers['content-length'] === undefined && opts.headers['transfer-encoding'] === undefined && !isStream.readable(body)) { - var length = typeof body === 'string' ? Buffer.byteLength(body) : body.length; + const length = typeof body === 'string' ? Buffer.byteLength(body) : body.length; opts.headers['content-length'] = length; } } @@ -252,7 +254,7 @@ function normalizeArguments(url, opts) { opts.method = opts.method || 'GET'; if (opts.hostname === 'unix') { - var matches = /(.+)\:(.+)/.exec(opts.path); + const matches = /(.+)\:(.+)/.exec(opts.path); if (matches) { opts.socketPath = matches[1]; @@ -294,7 +296,7 @@ function got(url, opts, cb) { } } -var helpers = [ +const helpers = [ 'get', 'post', 'put', From e10fb5e4c2445bfc5749b57b3eb597e8afa9a94c Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Sat, 21 Nov 2015 00:18:09 +0500 Subject: [PATCH 07/25] restrict engines in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8888db7..58d2613 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ } ], "engines": { - "node": ">=0.10.0" + "node": ">=4" }, "browser": { "unzip-response": false From cc36bb214a5b0e3863278973e9317c0134bd331b Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Sat, 21 Nov 2015 00:25:04 +0500 Subject: [PATCH 08/25] remove parse-json Closes #134 --- index.js | 11 ++++++----- package.json | 1 - 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index 56f2bdd..213ab60 100644 --- a/index.js +++ b/index.js @@ -17,7 +17,6 @@ const unzipResponse = require('unzip-response'); const createErrorClass = require('create-error-class'); const nodeStatusCodes = require('node-status-codes'); const isPlainObj = require('is-plain-obj'); -const parseJson = require('parse-json'); function requestAsEventEmitter(opts) { opts = opts || {}; @@ -103,10 +102,9 @@ function asCallback(opts, cb) { if (opts.json && statusCode !== 204) { try { - data = parseJson(data); + data = JSON.parse(data); } catch (e) { - e.fileName = urlLib.format(opts); - err = new got.ParseError(e, opts); + err = new got.ParseError(e, opts, data); } } @@ -346,7 +344,10 @@ function stdError(error, opts) { got.RequestError = createErrorClass('RequestError', stdError); got.ReadError = createErrorClass('ReadError', stdError); -got.ParseError = createErrorClass('ParseError', stdError); +got.ParseError = createErrorClass('ParseError', function (e, opts, data) { + stdError.call(this, e, opts); + this.message = `${e.message} in "${urlLib.format(opts)}": \n${data.slice(0, 77)}...`; +}); got.HTTPError = createErrorClass('HTTPError', function (statusCode, opts) { stdError.call(this, {}, opts); diff --git a/package.json b/package.json index 58d2613..78a95dc 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,6 @@ "lowercase-keys": "^1.0.0", "node-status-codes": "^1.0.0", "object-assign": "^4.0.1", - "parse-json": "^2.1.0", "timed-out": "^2.0.0", "unzip-response": "^1.0.0", "url-parse-lax": "^1.0.0" From 6fa957b53c767ba9833df8346c738e68d778b842 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Sat, 28 Nov 2015 22:35:45 +0500 Subject: [PATCH 09/25] replace duplexify with patched duplexer2 Closes #135 --- index.js | 11 +++++++---- package.json | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 213ab60..ec99d07 100644 --- a/index.js +++ b/index.js @@ -3,10 +3,11 @@ const EventEmitter = require('events').EventEmitter; const http = require('http'); const https = require('https'); +const PassThrough = require('stream').PassThrough; +const duplexer2 = require('duplexer2'); const urlLib = require('url'); const querystring = require('querystring'); const objectAssign = require('object-assign'); -const duplexify = require('duplexify'); const isStream = require('is-stream'); const getStream = require('get-stream'); const timedOut = require('timed-out'); @@ -135,7 +136,9 @@ function asPromise(opts) { } function asStream(opts) { - const proxy = duplexify(); + const input = new PassThrough(); + const output = new PassThrough(); + const proxy = duplexer2(input, output); if (opts.json) { throw new Error('got can not be used as stream when options.json is used'); @@ -163,7 +166,7 @@ function asStream(opts) { } if (opts.method === 'POST' || opts.method === 'PUT' || opts.method === 'PATCH') { - proxy.setWritable(req); + input.pipe(req); return; } @@ -173,7 +176,7 @@ function asStream(opts) { ee.on('response', res => { const statusCode = res.statusCode; - proxy.setReadable(res); + res.pipe(output); if (statusCode < 200 || statusCode > 299) { proxy.emit('error', new got.HTTPError(statusCode, opts), null, res); diff --git a/package.json b/package.json index 78a95dc..7a1f7f9 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ ], "dependencies": { "create-error-class": "^2.0.0", - "duplexify": "^3.2.0", + "duplexer2": "floatdrop/duplexer2#f770b34", "get-stream": "^1.1.0", "is-plain-obj": "^1.0.0", "is-redirect": "^1.0.0", From 93084e5840cc854e5b981397fc6d6d0e781a17f5 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Sat, 28 Nov 2015 22:47:34 +0500 Subject: [PATCH 10/25] remove section about Node.JS 0.10 in readme --- readme.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/readme.md b/readme.md index 1fed6ef..7be5e6a 100644 --- a/readme.md +++ b/readme.md @@ -267,18 +267,6 @@ got('todomvc.com', { ``` -## Node.js 0.10.x - -It is a known issue with old good Node 0.10.x [`http.Agent`](https://nodejs.org/docs/v0.10.39/api/http.html#http_class_http_agent) and `agent.maxSockets`, which is set to `5`. This can cause low performance and in rare cases deadlocks. To avoid this you can set it manually: - -```js -require('http').globalAgent.maxSockets = Infinity; -require('https').globalAgent.maxSockets = Infinity; -``` - -This should only ever be done if you have Node version 0.10.x and at the top-level app layer. - - ## Related - [gh-got](https://github.com/sindresorhus/gh-got) - Convenience wrapper for interacting with the GitHub API From 7169f8fe5d6e2ac94746327484922b1726a22b87 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Mon, 30 Nov 2015 14:24:22 +0700 Subject: [PATCH 11/25] :arrow_up: ava@0.7.0 --- package.json | 4 ++-- test/arguments.js | 4 ++-- test/helpers.js | 4 ++-- test/post.js | 2 -- test/stream.js | 25 +++++++++++-------------- 5 files changed, 17 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 7a1f7f9..b65e4bc 100644 --- a/package.json +++ b/package.json @@ -59,11 +59,11 @@ "url-parse-lax": "^1.0.0" }, "devDependencies": { - "ava": "^0.5.0", + "ava": "^0.7.0", "coveralls": "^2.11.4", "get-port": "^2.0.0", "into-stream": "^2.0.0", - "nyc": "^3.2.2", + "nyc": "^4.0.1", "pem": "^1.4.4", "pify": "^2.3.0", "tempfile": "^1.1.1", diff --git a/test/arguments.js b/test/arguments.js index 4221989..6c4ef34 100644 --- a/test/arguments.js +++ b/test/arguments.js @@ -36,8 +36,8 @@ test('options are optional', async t => { t.is((await got(`${s.url}/test`)).body, '/test'); }); -test('options are optional', t => { - got(`${s.url}/test`, function (err, data) { +test.cb('options are optional', t => { + got(`${s.url}/test`, (err, data) => { t.is(data, '/test'); t.end(); }); diff --git a/test/helpers.js b/test/helpers.js index 58bead5..c8d4cb2 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -19,8 +19,8 @@ test.before('setup', async t => { await s.listen(s.port); }); -test('callback mode', t => { - got.get(s.url, function (err, body) { +test.cb('callback mode', t => { + got.get(s.url, (err, body) => { t.ifError(err); t.is(body, 'ok'); t.end(); diff --git a/test/post.js b/test/post.js index 55aadac..5557940 100644 --- a/test/post.js +++ b/test/post.js @@ -1,5 +1,3 @@ -/**/ - import test from 'ava'; import intoStream from 'into-stream'; import got from '../'; diff --git a/test/stream.js b/test/stream.js index d51ad36..0663f53 100644 --- a/test/stream.js +++ b/test/stream.js @@ -35,7 +35,6 @@ test('option.json can not be used', t => { t.throws(() => { got.stream(s.url, {json: true}); }, 'got can not be used as stream when options.json is used'); - t.end(); }); test('callback can not be used', t => { @@ -46,11 +45,9 @@ test('callback can not be used', t => { t.throws(() => { got.stream(s.url, () => {}); }, 'callback can not be used with stream mode'); - - t.end(); }); -test('returns readable stream', t => { +test.cb('returns readable stream', t => { got.stream(s.url) .on('data', data => { t.is(data.toString(), 'ok'); @@ -58,25 +55,25 @@ test('returns readable stream', t => { }); }); -test('returns writeable stream', t => { - t.plan(1); +test.cb('returns writeable stream', t => { got.stream.post(`${s.url}/post`) .on('data', data => { t.is(data.toString(), 'wow'); + t.end(); }) .end('wow'); }); -test('throws on write to stream with body specified', t => { +test.cb('throws on write to stream with body specified', t => { t.throws(() => { got.stream(s.url, {body: 'wow'}).write('wow'); }, 'got\'s stream is not writable when options.body is used'); // wait for request to end - setTimeout(t.end.bind(t), 10); + setTimeout(t.end, 10); }); -test('have request event', t => { +test.cb('have request event', t => { got.stream(s.url) .on('request', req => { t.ok(req); @@ -84,7 +81,7 @@ test('have request event', t => { }); }); -test('have redirect event', t => { +test.cb('have redirect event', t => { got.stream(`${s.url}/redirect`) .on('redirect', res => { t.is(res.headers.location, s.url); @@ -92,7 +89,7 @@ test('have redirect event', t => { }); }); -test('have response event', t => { +test.cb('have response event', t => { got.stream(s.url) .on('response', res => { t.is(res.statusCode, 200); @@ -100,7 +97,7 @@ test('have response event', t => { }); }); -test('have error event', t => { +test.cb('have error event', t => { got.stream(`${s.url}/error`, {retries: 0}) .on('response', () => { t.fail('response event should not be emitted'); @@ -113,7 +110,7 @@ test('have error event', t => { }); }); -test('have error event', t => { +test.cb('have error event', t => { got.stream('.com', {retries: 0}) .on('response', () => { t.fail('response event should not be emitted'); @@ -124,7 +121,7 @@ test('have error event', t => { }); }); -test('accepts option.body as Stream', t => { +test.cb('accepts option.body as Stream', t => { got.stream(`${s.url}/post`, {body: intoStream(['wow'])}) .on('data', chunk => { t.is(chunk.toString(), 'wow'); From 8af13eee1893db37e5fce409c2c4bf2c530e3eda Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Wed, 2 Dec 2015 17:37:24 +0500 Subject: [PATCH 12/25] fix failed rebase conflict --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index ec99d07..43160d8 100644 --- a/index.js +++ b/index.js @@ -265,13 +265,13 @@ function normalizeArguments(url, opts) { } if (typeof opts.retries !== 'function') { - var retries = opts.retries; + const retries = opts.retries; opts.retries = function backoff(iter) { if (iter > retries) { return 0; } - var noise = Math.random() * 100; + const noise = Math.random() * 100; return (1 << iter) * 1000 + noise; }; } From 20b7e845a6013a988522c64e66aca21cf242456c Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Wed, 2 Dec 2015 17:46:10 +0500 Subject: [PATCH 13/25] remove callback interface Closes #133 --- index.js | 27 +++------------------------ readme.md | 30 ++++++------------------------ test/arguments.js | 7 ------- test/error.js | 7 ------- test/helpers.js | 8 -------- test/stream.js | 10 ---------- 6 files changed, 9 insertions(+), 80 deletions(-) diff --git a/index.js b/index.js index 43160d8..8318bd6 100644 --- a/index.js +++ b/index.js @@ -279,17 +279,7 @@ function normalizeArguments(url, opts) { return opts; } -function got(url, opts, cb) { - if (typeof opts === 'function') { - cb = opts; - opts = {}; - } - - if (cb) { - asCallback(normalizeArguments(url, opts), cb); - return null; - } - +function got(url, opts) { try { return asPromise(normalizeArguments(url, opts)); } catch (error) { @@ -307,21 +297,10 @@ const helpers = [ ]; helpers.forEach(el => { - got[el] = (url, opts, cb) => { - if (typeof opts === 'function') { - cb = opts; - opts = {}; - } - - return got(url, objectAssign({}, opts, {method: el.toUpperCase()}), cb); - }; + got[el] = (url, opts) => got(url, objectAssign({}, opts, {method: el.toUpperCase()})); }); -got.stream = function (url, opts, cb) { - if (cb || typeof opts === 'function') { - throw new Error('callback can not be used with stream mode'); - } - +got.stream = function (url, opts) { return asStream(normalizeArguments(url, opts)); }; diff --git a/readme.md b/readme.md index 7be5e6a..87ff78d 100644 --- a/readme.md +++ b/readme.md @@ -29,13 +29,6 @@ $ npm install --save got ```js const got = require('got'); -// Callback mode -got('todomvc.com', (error, body, response) => { - console.log(body); - //=> ' ...' -}); - -// Promise mode got('todomvc.com') .then(response => { console.log(response.body); @@ -46,7 +39,7 @@ got('todomvc.com') //=> 'Internal server error ...' }); -// Stream mode +// Streams got.stream('todomvc.com').pipe(fs.createWriteStream('index.html')); // For POST, PUT and PATCH methods got.stream returns a WritableStream @@ -58,7 +51,9 @@ fs.createReadStream('index.html').pipe(got.stream.post('todomvc.com')); It's a `GET` request by default, but can be changed in `options`. -#### got(url, [options], [callback]) +#### got(url, [options]) + +Return a Promise, that resolves to `response` object with `body` property. ##### url @@ -125,23 +120,10 @@ Number of request retries when network errors happens. Delays between retries co Option accepts `function` with `retry` and `error` arguments. Function must return delay in milliseconds (`0` return value cancels retry). -##### callback(error, data, response) - -Function to be called when error or data are received. If omitted, a promise will be returned. - -###### error - -`Error` object with HTTP status code as `statusCode` property. - -###### data - -The data you requested. - -###### response -The [response object](http://nodejs.org/api/http.html#http_http_incomingmessage). +#### Streams -When in stream mode, you can listen for events: +`stream` method will return Duplex stream with additional events: ##### .on('request', request) diff --git a/test/arguments.js b/test/arguments.js index 6c4ef34..9e25295 100644 --- a/test/arguments.js +++ b/test/arguments.js @@ -36,13 +36,6 @@ test('options are optional', async t => { t.is((await got(`${s.url}/test`)).body, '/test'); }); -test.cb('options are optional', t => { - got(`${s.url}/test`, (err, data) => { - t.is(data, '/test'); - t.end(); - }); -}); - test('accepts url.parse object as first argument', async t => { t.is((await got({hostname: s.host, port: s.port, path: '/test'})).body, '/test'); }); diff --git a/test/error.js b/test/error.js index 87c41c3..fd0279c 100644 --- a/test/error.js +++ b/test/error.js @@ -43,13 +43,6 @@ test('dns message', async t => { }); test('options.body error message', async t => { - try { - got(s.url, {body: () => {}}, () => {}); - t.fail('Exception was not thrown'); - } catch (err) { - t.regexTest(/options.body must be a ReadableStream, string, Buffer or plain Object/, err.message); - } - try { await got(s.url, {body: () => {}}); t.fail('Exception was not thrown'); diff --git a/test/helpers.js b/test/helpers.js index c8d4cb2..d4514ec 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -19,14 +19,6 @@ test.before('setup', async t => { await s.listen(s.port); }); -test.cb('callback mode', t => { - got.get(s.url, (err, body) => { - t.ifError(err); - t.is(body, 'ok'); - t.end(); - }); -}); - test('promise mode', async t => { t.is((await got.get(s.url)).body, 'ok'); diff --git a/test/stream.js b/test/stream.js index 0663f53..2d5aacf 100644 --- a/test/stream.js +++ b/test/stream.js @@ -37,16 +37,6 @@ test('option.json can not be used', t => { }, 'got can not be used as stream when options.json is used'); }); -test('callback can not be used', t => { - t.throws(() => { - got.stream(s.url, {json: true}, () => {}); - }, 'callback can not be used with stream mode'); - - t.throws(() => { - got.stream(s.url, () => {}); - }, 'callback can not be used with stream mode'); -}); - test.cb('returns readable stream', t => { got.stream(s.url) .on('data', data => { From 0e3954b05546f33920f286f1c22ba9cfdbda08e6 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Wed, 2 Dec 2015 17:59:35 +0500 Subject: [PATCH 14/25] merge asCallback with asPromise --- index.js | 88 +++++++++++++++++++++++++++----------------------------- 1 file changed, 42 insertions(+), 46 deletions(-) diff --git a/index.js b/index.js index 8318bd6..be56439 100644 --- a/index.js +++ b/index.js @@ -76,63 +76,59 @@ function requestAsEventEmitter(opts) { return ee; } -function asCallback(opts, cb) { - const ee = requestAsEventEmitter(opts); +function asPromise(opts) { + return new Promise((resolve, reject) => { + const ee = requestAsEventEmitter(opts); - ee.on('request', req => { - if (isStream(opts.body)) { - opts.body.pipe(req); - opts.body = undefined; - return; - } + ee.on('request', req => { + if (isStream(opts.body)) { + opts.body.pipe(req); + opts.body = undefined; + return; + } - req.end(opts.body); - }); + req.end(opts.body); + }); - ee.on('response', res => { - const stream = opts.encoding === null ? getStream.buffer(res) : getStream(res, opts); + ee.on('response', res => { + const stream = opts.encoding === null ? getStream.buffer(res) : getStream(res, opts); - stream - .then(data => { - let err; - const statusCode = res.statusCode; + stream + .then(data => { + let err; + const statusCode = res.statusCode; - if (statusCode < 200 || statusCode > 299) { - err = new got.HTTPError(statusCode, opts); - } + res.body = data; - if (opts.json && statusCode !== 204) { - try { - data = JSON.parse(data); - } catch (e) { - err = new got.ParseError(e, opts, data); + if (statusCode < 200 || statusCode > 299) { + err = new got.HTTPError(statusCode, opts); } - } - - cb(err, data, res); - }) - .catch(err => cb(new got.ReadError(err, opts), null, res)); - }); - ee.on('error', cb); -} + if (opts.json && statusCode !== 204) { + try { + res.body = JSON.parse(res.body); + } catch (e) { + err = new got.ParseError(e, opts, data); + } + } -function asPromise(opts) { - return new Promise((resolve, reject) => - asCallback(opts, (err, data, response) => { - if (response) { - response.body = data; - } + if (err) { + Object.defineProperty(err, 'response', {value: res}); + reject(err); + return; + } - if (err) { - Object.defineProperty(err, 'response', {value: response}); - reject(err); - return; - } + resolve(res); + }) + .catch(err => { + err = new got.ReadError(err, opts); + Object.defineProperty(err, 'response', {value: res}); + reject(err); + }); + }); - resolve(response); - }) - ); + ee.on('error', reject); + }); } function asStream(opts) { From 2989756030d24f4ad44cc7a29684c5853eb6e0d7 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Wed, 2 Dec 2015 18:09:26 +0500 Subject: [PATCH 15/25] simplify asPromise code --- index.js | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/index.js b/index.js index be56439..f592dc8 100644 --- a/index.js +++ b/index.js @@ -94,34 +94,27 @@ function asPromise(opts) { const stream = opts.encoding === null ? getStream.buffer(res) : getStream(res, opts); stream + .catch(err => reject(new got.ReadError(err, opts))) .then(data => { - let err; const statusCode = res.statusCode; res.body = data; - if (statusCode < 200 || statusCode > 299) { - err = new got.HTTPError(statusCode, opts); - } - if (opts.json && statusCode !== 204) { try { res.body = JSON.parse(res.body); } catch (e) { - err = new got.ParseError(e, opts, data); + throw new got.ParseError(e, opts, data); } } - if (err) { - Object.defineProperty(err, 'response', {value: res}); - reject(err); - return; + if (statusCode < 200 || statusCode > 299) { + throw new got.HTTPError(statusCode, opts); } resolve(res); }) .catch(err => { - err = new got.ReadError(err, opts); Object.defineProperty(err, 'response', {value: res}); reject(err); }); From fa5a296129e07ca04ad6b13ca5bf247384da296f Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Wed, 2 Dec 2015 18:52:33 +0500 Subject: [PATCH 16/25] remove object-assign Cudos to @f0rmat1k --- index.js | 13 ++++++------- package.json | 1 - 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/index.js b/index.js index f592dc8..a01ca3d 100644 --- a/index.js +++ b/index.js @@ -7,7 +7,6 @@ const PassThrough = require('stream').PassThrough; const duplexer2 = require('duplexer2'); const urlLib = require('url'); const querystring = require('querystring'); -const objectAssign = require('object-assign'); const isStream = require('is-stream'); const getStream = require('get-stream'); const timedOut = require('timed-out'); @@ -41,7 +40,7 @@ function requestAsEventEmitter(opts) { } const redirectUrl = urlLib.resolve(urlLib.format(opts), res.headers.location); - const redirectOpts = objectAssign({}, opts, urlLib.parse(redirectUrl)); + const redirectOpts = Object.assign({}, opts, urlLib.parse(redirectUrl)); ee.emit('redirect', res, redirectOpts); @@ -195,13 +194,13 @@ function normalizeArguments(url, opts) { } } - opts = objectAssign( + opts = Object.assign( {protocol: 'http:', path: '', retries: 5}, url, opts ); - opts.headers = objectAssign({ + opts.headers = Object.assign({ 'user-agent': 'https://github.com/sindresorhus/got', 'accept-encoding': 'gzip,deflate' }, lowercaseKeys(opts.headers)); @@ -286,7 +285,7 @@ const helpers = [ ]; helpers.forEach(el => { - got[el] = (url, opts) => got(url, objectAssign({}, opts, {method: el.toUpperCase()})); + got[el] = (url, opts) => got(url, Object.assign({}, opts, {method: el.toUpperCase()})); }); got.stream = function (url, opts) { @@ -295,7 +294,7 @@ got.stream = function (url, opts) { helpers.forEach(el => { got.stream[el] = function (url, opts) { - return got.stream(url, objectAssign({}, opts, {method: el.toUpperCase()})); + return got.stream(url, Object.assign({}, opts, {method: el.toUpperCase()})); }; }); @@ -304,7 +303,7 @@ function stdError(error, opts) { this.code = error.code; } - objectAssign(this, { + Object.assign(this, { message: error.message, host: opts.host, hostname: opts.hostname, diff --git a/package.json b/package.json index b65e4bc..5753373 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,6 @@ "is-stream": "^1.0.0", "lowercase-keys": "^1.0.0", "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", "timed-out": "^2.0.0", "unzip-response": "^1.0.0", "url-parse-lax": "^1.0.0" From 9190118b8a4b9482f409afbcebc306a42e5b6f56 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Thu, 3 Dec 2015 11:45:23 +0500 Subject: [PATCH 17/25] enable xo esnext mode --- package.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5753373..3376f75 100644 --- a/package.json +++ b/package.json @@ -69,9 +69,12 @@ "xo": "*" }, "xo": { - "esnext": false, + "esnext": true, "ignores": [ "test/**" - ] + ], + "rules": { + "prefer-reflect": 1 + } } } From 38590e5c34fcf98cd6fd969962bf54b4e0135323 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Sun, 6 Dec 2015 13:08:17 +0500 Subject: [PATCH 18/25] :arrow_up: create-error-class@3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3376f75..4a785ef 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "fetch" ], "dependencies": { - "create-error-class": "^2.0.0", + "create-error-class": "^3.0.0", "duplexer2": "floatdrop/duplexer2#f770b34", "get-stream": "^1.1.0", "is-plain-obj": "^1.0.0", From 112d70d3f7bdb6977b593d974614b810c712fa81 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Sun, 6 Dec 2015 13:53:16 +0500 Subject: [PATCH 19/25] replace git url with `@floatdrop/duplexer2` --- index.js | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index a01ca3d..52e9a01 100644 --- a/index.js +++ b/index.js @@ -4,7 +4,7 @@ const EventEmitter = require('events').EventEmitter; const http = require('http'); const https = require('https'); const PassThrough = require('stream').PassThrough; -const duplexer2 = require('duplexer2'); +const duplexer2 = require('@floatdrop/duplexer2'); const urlLib = require('url'); const querystring = require('querystring'); const isStream = require('is-stream'); diff --git a/package.json b/package.json index 4a785ef..b267049 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ ], "dependencies": { "create-error-class": "^3.0.0", - "duplexer2": "floatdrop/duplexer2#f770b34", + "@floatdrop/duplexer2": "^0.1.4", "get-stream": "^1.1.0", "is-plain-obj": "^1.0.0", "is-redirect": "^1.0.0", From d0668052fe1c743c30486a49c3ae36a30d0cc860 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Mon, 7 Dec 2015 10:36:34 +0500 Subject: [PATCH 20/25] 6.0.0-rc1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b267049..13826a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "got", - "version": "5.3.0", + "version": "6.0.0-rc1", "description": "Simplified HTTP/HTTPS requests", "license": "MIT", "repository": "sindresorhus/got", From 9fefbb3c02f1e61b5f5679d66d90bc92c5650c0f Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 22 Dec 2015 19:43:49 +0100 Subject: [PATCH 21/25] bump dev dependencies --- package.json | 11 ++++------- test/arguments.js | 4 ++-- test/error.js | 4 ++-- test/gzip.js | 4 ++-- test/headers.js | 6 +++--- test/helpers.js | 4 ++-- test/http.js | 4 ++-- test/https.js | 4 ++-- test/json.js | 4 ++-- test/post.js | 4 ++-- test/redirects.js | 4 ++-- test/retry.js | 4 ++-- test/stream.js | 5 ++--- test/unix-socket.js | 4 ++-- 14 files changed, 31 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 13826a6..7f1eb29 100644 --- a/package.json +++ b/package.json @@ -58,11 +58,11 @@ "url-parse-lax": "^1.0.0" }, "devDependencies": { - "ava": "^0.7.0", + "ava": "^0.8.0", "coveralls": "^2.11.4", "get-port": "^2.0.0", "into-stream": "^2.0.0", - "nyc": "^4.0.1", + "nyc": "^5.0.1", "pem": "^1.4.4", "pify": "^2.3.0", "tempfile": "^1.1.1", @@ -71,10 +71,7 @@ "xo": { "esnext": true, "ignores": [ - "test/**" - ], - "rules": { - "prefer-reflect": 1 - } + "test/_*" + ] } } diff --git a/test/arguments.js b/test/arguments.js index 9e25295..70d6437 100644 --- a/test/arguments.js +++ b/test/arguments.js @@ -4,7 +4,7 @@ import {createServer} from './_server'; let s; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/', (req, res) => { @@ -57,6 +57,6 @@ test('accepts url.parse object as first argument', async t => { t.is((await got({hostname: s.host, port: s.port, path: '/test'})).body, '/test'); }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/error.js b/test/error.js index fd0279c..6d3536a 100644 --- a/test/error.js +++ b/test/error.js @@ -4,7 +4,7 @@ import {createServer} from './_server'; let s; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/', (req, res) => { @@ -51,6 +51,6 @@ test('options.body error message', async t => { } }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/gzip.js b/test/gzip.js index bd8ba0a..9851b08 100644 --- a/test/gzip.js +++ b/test/gzip.js @@ -7,7 +7,7 @@ const testContent = 'Compressible response content.\n'; let s; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/', (req, res) => { @@ -56,6 +56,6 @@ test('do not break HEAD responses', async t => { t.is((await got.head(s.url)).body, ''); }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/headers.js b/test/headers.js index ffc87ce..23a1c22 100644 --- a/test/headers.js +++ b/test/headers.js @@ -4,7 +4,7 @@ import {createServer} from './_server'; let s; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/', (req, res) => { @@ -29,7 +29,7 @@ test('accept header with json option', async t => { let headers = (await got(s.url, {json: true})).body; t.is(headers.accept, 'application/json'); - headers = (await got(s.url, {headers: {'accept': ''}, json: true})).body; + headers = (await got(s.url, {headers: {accept: ''}, json: true})).body; t.is(headers.accept, ''); }); @@ -48,6 +48,6 @@ test('zero content-length', async t => { t.is(headers['content-length'], '0'); }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/helpers.js b/test/helpers.js index d4514ec..363ff31 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -4,7 +4,7 @@ import {createServer} from './_server'; let s; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/', (req, res) => { @@ -37,6 +37,6 @@ test('promise mode', async t => { } }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/http.js b/test/http.js index 3a09d0c..c2e4401 100644 --- a/test/http.js +++ b/test/http.js @@ -4,7 +4,7 @@ import {createServer} from './_server'; let s; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/', (req, res) => { @@ -70,6 +70,6 @@ test('query option', async t => { t.is((await got(s.url, {query: 'recent=true'})).body, 'recent'); }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/https.js b/test/https.js index 1bf5bc8..42dd7cb 100644 --- a/test/https.js +++ b/test/https.js @@ -12,7 +12,7 @@ let caRootCert; const pemP = pify(pem, Promise); -test.before('setup', async t => { +test.before('setup', async () => { const caKeys = await pemP.createCertificate({days: 1, selfSigned: true}); caRootKey = caKeys.serviceKey; @@ -58,6 +58,6 @@ test('make request to https server with ca', async t => { t.is(body, 'ok'); }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/json.js b/test/json.js index b0b08ef..a9b7421 100644 --- a/test/json.js +++ b/test/json.js @@ -4,7 +4,7 @@ import {createServer} from './_server'; let s; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/', (req, res) => { @@ -73,6 +73,6 @@ test('catches errors on invalid non-200 responses', async t => { } }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/post.js b/test/post.js index 5557940..70093c6 100644 --- a/test/post.js +++ b/test/post.js @@ -5,7 +5,7 @@ import {createServer} from './_server'; let s; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/', (req, res) => { @@ -109,6 +109,6 @@ test('content-type header is not overriden when object in options.body', async t t.is(body['content-type'], 'doge'); }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/redirects.js b/test/redirects.js index a723e8b..7680543 100644 --- a/test/redirects.js +++ b/test/redirects.js @@ -4,7 +4,7 @@ import {createServer} from './_server'; let s; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/', (req, res) => { @@ -78,6 +78,6 @@ test('redirect only GET and HEAD requests', async t => { } }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/retry.js b/test/retry.js index d4f42d0..1ac842d 100644 --- a/test/retry.js +++ b/test/retry.js @@ -7,7 +7,7 @@ let trys = 0; let knocks = 0; let fifth = 0; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/long', () => {}); @@ -69,6 +69,6 @@ test('falsy value prevent retries', async t => { } }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/stream.js b/test/stream.js index 2d5aacf..d5ba4d2 100644 --- a/test/stream.js +++ b/test/stream.js @@ -5,7 +5,7 @@ import {createServer} from './_server'; let s; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/', (req, res) => { @@ -117,9 +117,8 @@ test.cb('accepts option.body as Stream', t => { t.is(chunk.toString(), 'wow'); t.end(); }); - }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); diff --git a/test/unix-socket.js b/test/unix-socket.js index 7237d52..6cda334 100644 --- a/test/unix-socket.js +++ b/test/unix-socket.js @@ -8,7 +8,7 @@ const socketPath = tempfile('.socket'); let s; -test.before('setup', async t => { +test.before('setup', async () => { s = await createServer(); s.on('/', (req, res) => { @@ -28,6 +28,6 @@ test('protocol-less works', async t => { t.is((await got(url)).body, 'ok'); }); -test.after('cleanup', async t => { +test.after('cleanup', async () => { await s.close(); }); From f0c43efe34304dc60893a4f1fd090f92dd65466f Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Thu, 7 Jan 2016 21:04:08 +0500 Subject: [PATCH 22/25] fix rebase typo --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 52e9a01..3f62cdb 100644 --- a/index.js +++ b/index.js @@ -48,7 +48,7 @@ function requestAsEventEmitter(opts) { return; } - setImmediate(function () { + setImmediate(() => { ee.emit('response', typeof unzipResponse === 'function' && req.method !== 'HEAD' ? unzipResponse(res) : res); }); }); From 9c84db9602a0ff8133b0cbe68c67242569681255 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Thu, 7 Jan 2016 21:07:39 +0500 Subject: [PATCH 23/25] :up: ava@0.9.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7f1eb29..8fa66fc 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "url-parse-lax": "^1.0.0" }, "devDependencies": { - "ava": "^0.8.0", + "ava": "^0.9.0", "coveralls": "^2.11.4", "get-port": "^2.0.0", "into-stream": "^2.0.0", From 56f63b23d9443c70b8a573263d97231b8aef8971 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Thu, 7 Jan 2016 21:13:03 +0500 Subject: [PATCH 24/25] add warning about Node.JS version requirement --- readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme.md b/readme.md index 87ff78d..770faca 100644 --- a/readme.md +++ b/readme.md @@ -19,6 +19,8 @@ Created because [`request`](https://github.com/mikeal/request) is bloated *(seve ## Install +**WARNING: Node.JS 4.x or higher required for got@6.0.0 and above.** For older Node.JS versions use got@5. + ``` $ npm install --save got ``` From b60f955c3ee81887972501c41c83ea96959983a7 Mon Sep 17 00:00:00 2001 From: Vsevolod Strukchinsky Date: Thu, 7 Jan 2016 21:24:54 +0500 Subject: [PATCH 25/25] move _server.js to helpers --- package.json | 5 +---- test/_server.js | 42 ------------------------------------------ test/arguments.js | 2 +- test/error.js | 2 +- test/gzip.js | 2 +- test/headers.js | 2 +- test/helpers.js | 2 +- test/helpers/server.js | 38 ++++++++++++++++++++++++++++++++++++++ test/http.js | 2 +- test/https.js | 2 +- test/json.js | 2 +- test/post.js | 2 +- test/redirects.js | 2 +- test/retry.js | 2 +- test/stream.js | 2 +- test/unix-socket.js | 2 +- 16 files changed, 52 insertions(+), 59 deletions(-) delete mode 100644 test/_server.js create mode 100644 test/helpers/server.js diff --git a/package.json b/package.json index 8fa66fc..6b451b5 100644 --- a/package.json +++ b/package.json @@ -69,9 +69,6 @@ "xo": "*" }, "xo": { - "esnext": true, - "ignores": [ - "test/_*" - ] + "esnext": true } } diff --git a/test/_server.js b/test/_server.js deleted file mode 100644 index 9de2c8d..0000000 --- a/test/_server.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; -var http = require('http'); -var https = require('https'); -var pify = require('pify'); -var getPort = require('get-port'); -var host = exports.host = 'localhost'; - -exports.createServer = function () { - return getPort().then(function (port) { - var s = http.createServer(function (req, resp) { - s.emit(req.url, req, resp); - }); - - s.host = host; - s.port = port; - s.url = 'http://' + host + ':' + port; - s.protocol = 'http'; - - s.listen = pify(s.listen, Promise); - s.close = pify(s.close, Promise); - - return s; - }); -}; - -exports.createSSLServer = function (opts) { - return getPort().then(function (port) { - var s = https.createServer(opts, function (req, resp) { - s.emit(req.url, req, resp); - }); - - s.host = host; - s.port = port; - s.url = 'https://' + host + ':' + port; - s.protocol = 'https'; - - s.listen = pify(s.listen, Promise); - s.close = pify(s.close, Promise); - - return s; - }); -}; diff --git a/test/arguments.js b/test/arguments.js index 70d6437..f3ae980 100644 --- a/test/arguments.js +++ b/test/arguments.js @@ -1,6 +1,6 @@ import test from 'ava'; import got from '../'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; let s; diff --git a/test/error.js b/test/error.js index 6d3536a..bf9900e 100644 --- a/test/error.js +++ b/test/error.js @@ -1,6 +1,6 @@ import test from 'ava'; import got from '../'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; let s; diff --git a/test/gzip.js b/test/gzip.js index 9851b08..07466c4 100644 --- a/test/gzip.js +++ b/test/gzip.js @@ -1,7 +1,7 @@ import zlib from 'zlib'; import test from 'ava'; import got from '../'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; const testContent = 'Compressible response content.\n'; diff --git a/test/headers.js b/test/headers.js index 23a1c22..820d71d 100644 --- a/test/headers.js +++ b/test/headers.js @@ -1,6 +1,6 @@ import test from 'ava'; import got from '../'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; let s; diff --git a/test/helpers.js b/test/helpers.js index 363ff31..b07bf11 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -1,6 +1,6 @@ import test from 'ava'; import got from '../'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; let s; diff --git a/test/helpers/server.js b/test/helpers/server.js new file mode 100644 index 0000000..70a6bdc --- /dev/null +++ b/test/helpers/server.js @@ -0,0 +1,38 @@ +'use strict'; +const http = require('http'); +const https = require('https'); +const pify = require('pify'); +const getPort = require('get-port'); +const host = exports.host = 'localhost'; + +exports.createServer = function () { + return getPort().then(port => { + const s = http.createServer((req, resp) => s.emit(req.url, req, resp)); + + s.host = host; + s.port = port; + s.url = `http://${host}:${port}`; + s.protocol = 'http'; + + s.listen = pify(s.listen, Promise); + s.close = pify(s.close, Promise); + + return s; + }); +}; + +exports.createSSLServer = function (opts) { + return getPort().then(port => { + const s = https.createServer(opts, (req, resp) => s.emit(req.url, req, resp)); + + s.host = host; + s.port = port; + s.url = `https://${host}:${port}`; + s.protocol = 'https'; + + s.listen = pify(s.listen, Promise); + s.close = pify(s.close, Promise); + + return s; + }); +}; diff --git a/test/http.js b/test/http.js index c2e4401..b9bdf4e 100644 --- a/test/http.js +++ b/test/http.js @@ -1,6 +1,6 @@ import test from 'ava'; import got from '../'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; let s; diff --git a/test/https.js b/test/https.js index 42dd7cb..59e79de 100644 --- a/test/https.js +++ b/test/https.js @@ -2,7 +2,7 @@ import test from 'ava'; import pem from 'pem'; import pify from 'pify'; import got from '../'; -import {createSSLServer} from './_server'; +import {createSSLServer} from './helpers/server'; let s; let key; diff --git a/test/json.js b/test/json.js index a9b7421..2f0b2dc 100644 --- a/test/json.js +++ b/test/json.js @@ -1,6 +1,6 @@ import test from 'ava'; import got from '../'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; let s; diff --git a/test/post.js b/test/post.js index 70093c6..d2cd97a 100644 --- a/test/post.js +++ b/test/post.js @@ -1,7 +1,7 @@ import test from 'ava'; import intoStream from 'into-stream'; import got from '../'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; let s; diff --git a/test/redirects.js b/test/redirects.js index 7680543..b36a9ed 100644 --- a/test/redirects.js +++ b/test/redirects.js @@ -1,6 +1,6 @@ import test from 'ava'; import got from '../'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; let s; diff --git a/test/retry.js b/test/retry.js index 1ac842d..763b0b0 100644 --- a/test/retry.js +++ b/test/retry.js @@ -1,6 +1,6 @@ import test from 'ava'; import got from '../'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; let s; let trys = 0; diff --git a/test/stream.js b/test/stream.js index d5ba4d2..20652c4 100644 --- a/test/stream.js +++ b/test/stream.js @@ -1,7 +1,7 @@ import test from 'ava'; import got from '../'; import intoStream from 'into-stream'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; let s; diff --git a/test/unix-socket.js b/test/unix-socket.js index 6cda334..5ea490f 100644 --- a/test/unix-socket.js +++ b/test/unix-socket.js @@ -2,7 +2,7 @@ import {format} from 'util'; import tempfile from 'tempfile'; import test from 'ava'; import got from '../'; -import {createServer} from './_server'; +import {createServer} from './helpers/server'; const socketPath = tempfile('.socket');