initial commit
This commit is contained in:
commit
956c16e48c
|
@ -0,0 +1,41 @@
|
||||||
|
Copyright 2018 AJ ONeal
|
||||||
|
|
||||||
|
This is open source software; you can redistribute it and/or modify it under the
|
||||||
|
terms of either:
|
||||||
|
|
||||||
|
a) the "MIT License"
|
||||||
|
b) the "Apache-2.0 License"
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
Apache-2.0 License Summary
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
|
@ -0,0 +1,16 @@
|
||||||
|
# µRequest - Minimalist HTTP client
|
||||||
|
|
||||||
|
A minimal drop-in replacement for request with 0 dependenciese.
|
||||||
|
|
||||||
|
## Super simple to use
|
||||||
|
|
||||||
|
µRequest is designed to be a minimal drop-in replacement for request.
|
||||||
|
|
||||||
|
```js
|
||||||
|
var request = require('urequest');
|
||||||
|
request('http://www.google.com', function (error, response, body) {
|
||||||
|
console.log('error:', error); // Print the error if one occurred
|
||||||
|
console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
|
||||||
|
console.log('body:', body); // Print the HTML for the Google homepage.
|
||||||
|
});
|
||||||
|
```
|
|
@ -0,0 +1,7 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// if NODE_DEBUG contains 'urequest' then this should print out 'DEBUG ON for urequest'
|
||||||
|
// NODE_DEBUG="urequest" node examples/debug.js
|
||||||
|
//
|
||||||
|
//require('urequest');
|
||||||
|
require('../');
|
|
@ -0,0 +1,15 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
//var request = require('urequest');
|
||||||
|
var request = require('../');
|
||||||
|
|
||||||
|
// will redirect to https://www.github.com and then https://github.com
|
||||||
|
request('http://www.github.com', function (error, response, body) {
|
||||||
|
if (error) {
|
||||||
|
console.log('error:', error); // Print the error if one occurred
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log('statusCode:', response.statusCode); // The final statusCode
|
||||||
|
console.log('Final URI:', response.request.uri); // The final URI
|
||||||
|
console.log('Body Length:', body.length); // body length
|
||||||
|
});
|
|
@ -0,0 +1,9 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
//var request = require('urequest');
|
||||||
|
var request = require('../');
|
||||||
|
request('http://www.google.com', function (error, response, body) {
|
||||||
|
console.log('error:', error); // Print the error if one occurred
|
||||||
|
console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
|
||||||
|
console.log('body:', body); // Print the HTML for the Google homepage.
|
||||||
|
});
|
|
@ -0,0 +1,9 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
//var request = require('urequest');
|
||||||
|
var request = require('../');
|
||||||
|
request('https://www.google.com', function (error, response, body) {
|
||||||
|
console.log('error:', error); // Print the error if one occurred
|
||||||
|
console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
|
||||||
|
console.log('body:', body); // Print the HTML for the Google homepage.
|
||||||
|
});
|
|
@ -0,0 +1,16 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
//var request = require('urequest');
|
||||||
|
var request = require('../');
|
||||||
|
|
||||||
|
// would normally redirect to https://www.github.com and then https://github.com
|
||||||
|
request({ uri: 'https://www.github.com', followRedirect: false }, function (error, response, body) {
|
||||||
|
if (error) {
|
||||||
|
console.log('error:', error); // Print the error if one occurred
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log('URI:', response.request.uri); // The final URI
|
||||||
|
console.log('statusCode:', response.statusCode); // Should be 301 or 302
|
||||||
|
console.log('Location:', response.headers.location); // The redirect
|
||||||
|
console.log('Body:', body || JSON.stringify(body));
|
||||||
|
});
|
|
@ -0,0 +1,196 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var http = require('http');
|
||||||
|
var https = require('https');
|
||||||
|
var url = require('url');
|
||||||
|
|
||||||
|
function debug() {
|
||||||
|
if (module.exports.debug) {
|
||||||
|
console.log.apply(console, arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyUrl(opts, urlstr) {
|
||||||
|
var urlObj = url.parse(urlstr);
|
||||||
|
opts.url = opts.uri = urlstr;
|
||||||
|
Object.keys(urlObj).forEach(function (key) {
|
||||||
|
opts[key] = urlObj[key];
|
||||||
|
});
|
||||||
|
return opts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mergeOrDelete(defaults, updates) {
|
||||||
|
Object.keys(defaults).forEach(function (key) {
|
||||||
|
if (!(key in updates)) {
|
||||||
|
updates[key] = defaults[key];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// neither accept the prior default nor define an explicit value
|
||||||
|
// CRDT probs...
|
||||||
|
if ('undefined' === typeof updates[key]) {
|
||||||
|
delete updates[key];
|
||||||
|
} else if ('object' === typeof defaults[key] && 'object' === typeof updates[key]) {
|
||||||
|
updates[key] = mergeOrDelete(defaults[key], updates[key]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return updates;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setDefaults(defs) {
|
||||||
|
defs = defs || {};
|
||||||
|
|
||||||
|
function urequest(opts, cb) {
|
||||||
|
var req;
|
||||||
|
// request.js behavior:
|
||||||
|
// encoding: null + json ? unknown
|
||||||
|
// json => attempt to parse, fail silently
|
||||||
|
// encoding => buffer.toString(encoding)
|
||||||
|
// null === encoding => Buffer.concat(buffers)
|
||||||
|
if ('string' === typeof opts) {
|
||||||
|
opts = { url: opts };
|
||||||
|
}
|
||||||
|
if (!opts.method) {
|
||||||
|
opts.method = 'GET';
|
||||||
|
}
|
||||||
|
if (!opts.method) {
|
||||||
|
opts.method = 'GET';
|
||||||
|
}
|
||||||
|
if (opts.url || opts.uri) {
|
||||||
|
opts = applyUrl(opts, opts.url || opts.uri);
|
||||||
|
}
|
||||||
|
function onResponse(resp) {
|
||||||
|
var encoding = opts.encoding || defs.encoding;
|
||||||
|
var followRedirect;
|
||||||
|
Object.keys(defs).forEach(function (key) {
|
||||||
|
if (key in opts && 'undefined' !== typeof opts[key]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
opts[key] = defs[key];
|
||||||
|
});
|
||||||
|
followRedirect = opts.followRedirect;
|
||||||
|
|
||||||
|
resp.request = req;
|
||||||
|
resp.request.uri = opts.uri;
|
||||||
|
if (resp.headers.location && opts.followRedirect) {
|
||||||
|
debug('Following redirect: ' + resp.headers.location);
|
||||||
|
if (opts.followAllRedirects || -1 !== [ 301, 302 ].indexOf(resp.statusCode)) {
|
||||||
|
followRedirect = true;
|
||||||
|
}
|
||||||
|
if (opts._redirectCount >= opts.maxRedirects) {
|
||||||
|
followRedirect = false;
|
||||||
|
}
|
||||||
|
if ('function' === opts.followRedirect) {
|
||||||
|
if (!opts.followRedirect(resp)) {
|
||||||
|
followRedirect = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!opts.followOriginalHttpMethod) {
|
||||||
|
opts.method = 'GET';
|
||||||
|
opts.body = null;
|
||||||
|
}
|
||||||
|
if (followRedirect) {
|
||||||
|
opts.url = resp.headers.location;
|
||||||
|
return urequest(opts, cb);
|
||||||
|
}
|
||||||
|
if (opts.removeRefererHeader && opts.headers) {
|
||||||
|
delete opts.headers.referer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (null === encoding) {
|
||||||
|
resp._body = [];
|
||||||
|
} else {
|
||||||
|
resp.body = '';
|
||||||
|
}
|
||||||
|
resp._bodyLength = 0;
|
||||||
|
resp.on('data', function (chunk) {
|
||||||
|
if ('string' === typeof resp.body) {
|
||||||
|
resp.body += chunk.toString(encoding);
|
||||||
|
} else {
|
||||||
|
resp._body.push(chunk);
|
||||||
|
resp._bodyLength += chunk.length;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
resp.on('end', function () {
|
||||||
|
if ('string' !== typeof resp.body) {
|
||||||
|
if (1 === resp._body.length) {
|
||||||
|
resp.body = resp._body[0];
|
||||||
|
} else {
|
||||||
|
resp.body = Buffer.concat(resp._body, resp._bodyLength);
|
||||||
|
}
|
||||||
|
resp._body = null;
|
||||||
|
}
|
||||||
|
if (opts.json && 'string' === typeof resp.body) {
|
||||||
|
// TODO I would parse based on Content-Type
|
||||||
|
// but request.js doesn't do that.
|
||||||
|
try {
|
||||||
|
resp.body = JSON.parse(resp.body);
|
||||||
|
} catch(e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cb(null, resp, resp.body);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!opts.protocol) {
|
||||||
|
opts.protocol = 'https:';
|
||||||
|
}
|
||||||
|
if ('https:' === opts.protocol) {
|
||||||
|
req = https.request(opts, onResponse);
|
||||||
|
} else if ('http:' === opts.protocol) {
|
||||||
|
req = http.request(opts, onResponse);
|
||||||
|
} else {
|
||||||
|
throw new Error("unknown protocol: '" + opts.protocol + "'");
|
||||||
|
}
|
||||||
|
req.on('error', function (e) {
|
||||||
|
cb(e);
|
||||||
|
});
|
||||||
|
if (opts.body) {
|
||||||
|
if (true === opts.json) {
|
||||||
|
req.end(JSON.stringify(opts.json));
|
||||||
|
} else {
|
||||||
|
req.end(opts.body);
|
||||||
|
}
|
||||||
|
} else if (opts.json && true !== opts.json) {
|
||||||
|
req.end(JSON.stringify(opts.json));
|
||||||
|
} else {
|
||||||
|
req.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
urequest.defaults = function (_defs) {
|
||||||
|
_defs = mergeOrDelete(defs, _defs);
|
||||||
|
return setDefaults(_defs);
|
||||||
|
};
|
||||||
|
[ 'get', 'put', 'post', 'patch', 'delete', 'head', 'options' ].forEach(function (method) {
|
||||||
|
urequest[method] = function (obj) {
|
||||||
|
if ('string' === typeof obj) {
|
||||||
|
obj = { url: obj };
|
||||||
|
}
|
||||||
|
obj.method = method.toUpperCase();
|
||||||
|
urequest(obj);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
urequest.del = urequest.delete;
|
||||||
|
|
||||||
|
return urequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = setDefaults({
|
||||||
|
sendImmediately: true
|
||||||
|
, method: 'GET'
|
||||||
|
, headers: {}
|
||||||
|
, useQuerystring: false
|
||||||
|
, followRedirect: true
|
||||||
|
, followAllRedirects: false
|
||||||
|
, followOriginalHttpMethod: false
|
||||||
|
, maxRedirects: 10
|
||||||
|
, removeRefererHeader: false
|
||||||
|
//, encoding: undefined
|
||||||
|
, gzip: false
|
||||||
|
});
|
||||||
|
module.exports.debug = (-1 !== (process.env.NODE_DEBUG||'').split(/\s+/g).indexOf('urequest'));
|
||||||
|
|
||||||
|
debug("DEBUG ON for urequest");
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"name": "urequest",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "A lightweight drop-in replacement for request",
|
||||||
|
"main": "index.js",
|
||||||
|
"directories": {
|
||||||
|
"example": "examples"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.ppl.family/ppl/urequest.js.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"request",
|
||||||
|
"lightweight",
|
||||||
|
"alternative",
|
||||||
|
"http",
|
||||||
|
"https",
|
||||||
|
"call"
|
||||||
|
],
|
||||||
|
"author": "AJ ONeal <coolaj86@gmail.com> (https://coolaj86.com/)",
|
||||||
|
"license": "(MIT OR Apache-2.0)"
|
||||||
|
}
|
Loading…
Reference in New Issue