Compare commits
No commits in common. "95a12a82850a16c50ea239c7056c8f1807bc7564" and "3574e356359e6a619cd68edf5cd36eb85fce5ca3" have entirely different histories.
95a12a8285
...
3574e35635
50
README.md
50
README.md
|
@ -14,8 +14,6 @@ Written from scratch, with zero-dependencies.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install --save @root/request
|
npm install --save @root/request
|
||||||
|
|
||||||
# or npm install git+ssh://git@git.therootcompany.com/request.js
|
|
||||||
```
|
```
|
||||||
|
|
||||||
```js
|
```js
|
||||||
|
@ -42,54 +40,6 @@ request('http://www.google.com')
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
**Streaming**
|
|
||||||
|
|
||||||
In order to keep this library lightweight, performant, and keep the code easy to
|
|
||||||
read, the streaming behavior is **_slightly different_** from that of
|
|
||||||
`request.js`.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var request = require('@root/request');
|
|
||||||
|
|
||||||
var resp = await request({
|
|
||||||
url: 'http://www.google.com',
|
|
||||||
stream: true
|
|
||||||
});
|
|
||||||
|
|
||||||
resp.on('data', function () {
|
|
||||||
// got some data
|
|
||||||
});
|
|
||||||
|
|
||||||
resp.on('end', function () {
|
|
||||||
// the data has ended
|
|
||||||
});
|
|
||||||
|
|
||||||
// resp.stream is a Promise that is resolved when the read stream is destroyed
|
|
||||||
await resp.stream;
|
|
||||||
console.log('Done');
|
|
||||||
```
|
|
||||||
|
|
||||||
The difference is that we don't add an extra layer of stream abstraction.
|
|
||||||
You must use the response from await, a Promise, or the callback.
|
|
||||||
|
|
||||||
You can also give a file path:
|
|
||||||
|
|
||||||
```js
|
|
||||||
request({
|
|
||||||
url: 'http://www.google.com',
|
|
||||||
stream: '/tmp/google-index.html'
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
Which is equivalent to passing a write stream for the file:
|
|
||||||
|
|
||||||
```js
|
|
||||||
request({
|
|
||||||
url: 'http://www.google.com',
|
|
||||||
stream: fs.createWriteStream('/tmp/google-index.html')
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## Table of contents
|
## Table of contents
|
||||||
|
|
||||||
- [Forms](#forms)
|
- [Forms](#forms)
|
||||||
|
|
|
@ -5,9 +5,11 @@ var request = require('../');
|
||||||
|
|
||||||
// will redirect to https://www.github.com and then https://github.com
|
// will redirect to https://www.github.com and then https://github.com
|
||||||
//request('http://www.github.com', function (error, response, body) {
|
//request('http://www.github.com', function (error, response, body) {
|
||||||
request(
|
request({ uri: { protocol: 'http:', hostname: 'www.github.com' } }, function(
|
||||||
{ uri: { protocol: 'http:', hostname: 'www.github.com' } },
|
error,
|
||||||
function (error, response, body) {
|
response,
|
||||||
|
body
|
||||||
|
) {
|
||||||
if (error) {
|
if (error) {
|
||||||
console.log('error:', error); // Print the error if one occurred
|
console.log('error:', error); // Print the error if one occurred
|
||||||
return;
|
return;
|
||||||
|
@ -15,5 +17,4 @@ request(
|
||||||
console.log('statusCode:', response.statusCode); // The final statusCode
|
console.log('statusCode:', response.statusCode); // The final statusCode
|
||||||
console.log('Final href:', response.request.uri.href); // The final URI
|
console.log('Final href:', response.request.uri.href); // The final URI
|
||||||
console.log('Body Length:', body.length); // body length
|
console.log('Body Length:', body.length); // body length
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
|
@ -4,9 +4,11 @@
|
||||||
var request = require('../');
|
var request = require('../');
|
||||||
|
|
||||||
// would normally redirect to https://www.github.com and then https://github.com
|
// would normally redirect to https://www.github.com and then https://github.com
|
||||||
request(
|
request({ uri: 'https://www.github.com', followRedirect: false }, function(
|
||||||
{ uri: 'https://www.github.com', followRedirect: false },
|
error,
|
||||||
function (error, response, body) {
|
response,
|
||||||
|
body
|
||||||
|
) {
|
||||||
if (error) {
|
if (error) {
|
||||||
console.log('error:', error); // Print the error if one occurred
|
console.log('error:', error); // Print the error if one occurred
|
||||||
return;
|
return;
|
||||||
|
@ -15,5 +17,4 @@ request(
|
||||||
console.log('statusCode:', response.statusCode); // Should be 301 or 302
|
console.log('statusCode:', response.statusCode); // Should be 301 or 302
|
||||||
console.log('Location:', response.headers.location); // The redirect
|
console.log('Location:', response.headers.location); // The redirect
|
||||||
console.log('Body:', body || JSON.stringify(body));
|
console.log('Body:', body || JSON.stringify(body));
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var request = require('../');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
var tpath = '/tmp/google-index.html';
|
|
||||||
var resp = await request({
|
|
||||||
url: 'https://google.com',
|
|
||||||
encoding: null,
|
|
||||||
stream: tpath
|
|
||||||
});
|
|
||||||
console.log('[Response Headers]');
|
|
||||||
console.log(resp.toJSON().headers);
|
|
||||||
|
|
||||||
//console.error(resp.headers, resp.body.byteLength);
|
|
||||||
await resp.stream;
|
|
||||||
console.log('[Response Body] written to', tpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
main()
|
|
||||||
.then(function () {
|
|
||||||
console.log('Pass');
|
|
||||||
})
|
|
||||||
.catch(function (e) {
|
|
||||||
console.error('Fail');
|
|
||||||
console.error(e.stack);
|
|
||||||
});
|
|
|
@ -1,34 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var request = require('../');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
var tpath = '/tmp/google-index.html';
|
|
||||||
var resp = await request({
|
|
||||||
url: 'https://google.com',
|
|
||||||
encoding: null,
|
|
||||||
stream: true
|
|
||||||
});
|
|
||||||
console.log('[Response Headers]');
|
|
||||||
console.log(resp.toJSON().headers);
|
|
||||||
|
|
||||||
resp.on('data', function (chunk) {
|
|
||||||
console.log('[Data]', chunk.byteLength);
|
|
||||||
});
|
|
||||||
resp.on('end', function (chunk) {
|
|
||||||
console.log('[End]');
|
|
||||||
});
|
|
||||||
|
|
||||||
//console.error(resp.headers, resp.body.byteLength);
|
|
||||||
await resp.stream;
|
|
||||||
console.log('[Close]');
|
|
||||||
}
|
|
||||||
|
|
||||||
main()
|
|
||||||
.then(function () {
|
|
||||||
console.log('Pass');
|
|
||||||
})
|
|
||||||
.catch(function (e) {
|
|
||||||
console.error('Fail');
|
|
||||||
console.error(e.stack);
|
|
||||||
});
|
|
69
index.js
69
index.js
|
@ -5,7 +5,6 @@ var https = require('https');
|
||||||
var url = require('url');
|
var url = require('url');
|
||||||
var os = require('os');
|
var os = require('os');
|
||||||
var pkg = require('./package.json');
|
var pkg = require('./package.json');
|
||||||
var fs = require('fs'); // only for streams
|
|
||||||
|
|
||||||
function debug() {
|
function debug() {
|
||||||
if (module.exports.debug) {
|
if (module.exports.debug) {
|
||||||
|
@ -141,68 +140,6 @@ function setDefaults(defs) {
|
||||||
return urequestHelper(opts, cb);
|
return urequestHelper(opts, cb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opts.stream) {
|
|
||||||
// make the response await-able
|
|
||||||
var resolve;
|
|
||||||
var reject;
|
|
||||||
resp.stream = new Promise(function (_resolve, _reject) {
|
|
||||||
resolve = _resolve;
|
|
||||||
reject = _reject;
|
|
||||||
});
|
|
||||||
|
|
||||||
// allow specifying a file
|
|
||||||
if ('string' === typeof opts.stream) {
|
|
||||||
try {
|
|
||||||
if (opts.debug) {
|
|
||||||
console.debug(
|
|
||||||
'[@root/request] file write stream created'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
opts.stream = fs.createWriteStream(opts.stream);
|
|
||||||
} catch (e) {
|
|
||||||
cb(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// or an existing write stream
|
|
||||||
if ('function' === typeof opts.stream.pipe) {
|
|
||||||
if (opts.debug) {
|
|
||||||
console.debug('[@root/request] stream piped');
|
|
||||||
}
|
|
||||||
resp.pipe(opts.stream);
|
|
||||||
}
|
|
||||||
resp.on('error', function (e) {
|
|
||||||
if (opts.debug) {
|
|
||||||
console.debug("[@root/request] stream 'error'");
|
|
||||||
console.error(e.stack);
|
|
||||||
}
|
|
||||||
resp.destroy();
|
|
||||||
if ('function' === opts.stream.destroy) {
|
|
||||||
opts.stream.destroy(e);
|
|
||||||
}
|
|
||||||
reject(e);
|
|
||||||
});
|
|
||||||
resp.on('end', function () {
|
|
||||||
if (opts.debug) {
|
|
||||||
console.debug("[@root/request] stream 'end'");
|
|
||||||
}
|
|
||||||
if ('function' === opts.stream.destroy) {
|
|
||||||
opts.stream.end();
|
|
||||||
// this will close the stream (i.e. sync to disk)
|
|
||||||
opts.stream.destroy();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
resp.on('close', function () {
|
|
||||||
if (opts.debug) {
|
|
||||||
console.debug("[@root/request] stream 'close'");
|
|
||||||
}
|
|
||||||
resolve();
|
|
||||||
});
|
|
||||||
// and in all cases, return the stream
|
|
||||||
cb(null, resp);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (null === opts.encoding) {
|
if (null === opts.encoding) {
|
||||||
resp._body = [];
|
resp._body = [];
|
||||||
} else {
|
} else {
|
||||||
|
@ -237,9 +174,7 @@ function setDefaults(defs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
debug('\n[urequest] resp.toJSON():');
|
debug('\n[urequest] resp.toJSON():');
|
||||||
if (module.exports.debug) {
|
|
||||||
debug(resp.toJSON());
|
debug(resp.toJSON());
|
||||||
}
|
|
||||||
if (opts.debug) {
|
if (opts.debug) {
|
||||||
console.debug('[@root/request] Response Body:');
|
console.debug('[@root/request] Response Body:');
|
||||||
console.debug(resp.body);
|
console.debug(resp.body);
|
||||||
|
@ -633,8 +568,7 @@ var _defaults = {
|
||||||
followOriginalHttpMethod: false,
|
followOriginalHttpMethod: false,
|
||||||
maxRedirects: 10,
|
maxRedirects: 10,
|
||||||
removeRefererHeader: false,
|
removeRefererHeader: false,
|
||||||
// encoding: undefined,
|
//, encoding: undefined
|
||||||
// stream: false, // TODO allow a stream?
|
|
||||||
gzip: false
|
gzip: false
|
||||||
//, body: undefined
|
//, body: undefined
|
||||||
//, json: undefined
|
//, json: undefined
|
||||||
|
@ -643,7 +577,6 @@ module.exports = setDefaults(_defaults);
|
||||||
|
|
||||||
module.exports._keys = Object.keys(_defaults).concat([
|
module.exports._keys = Object.keys(_defaults).concat([
|
||||||
'encoding',
|
'encoding',
|
||||||
'stream',
|
|
||||||
'body',
|
'body',
|
||||||
'json',
|
'json',
|
||||||
'form',
|
'form',
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"name": "@root/request",
|
"name": "@root/request",
|
||||||
"version": "1.7.0",
|
"version": "1.5.0",
|
||||||
"lockfileVersion": 1
|
"lockfileVersion": 1
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@root/request",
|
"name": "@root/request",
|
||||||
"version": "1.7.0",
|
"version": "1.6.1",
|
||||||
"description": "A lightweight, zero-dependency drop-in replacement for request",
|
"description": "A lightweight, zero-dependency drop-in replacement for request",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"files": [
|
"files": [
|
||||||
|
|
Loading…
Reference in New Issue