72 lines
1.8 KiB
JavaScript
72 lines
1.8 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* Module dependencies.
|
||
|
*/
|
||
|
|
||
|
var parse = require('url').parse;
|
||
|
var debug = require('debug')('get-uri');
|
||
|
|
||
|
/**
|
||
|
* Module exports.
|
||
|
*/
|
||
|
|
||
|
module.exports = exports = getUri;
|
||
|
|
||
|
/**
|
||
|
* Supported "protocols".
|
||
|
*/
|
||
|
|
||
|
exports.protocols = {
|
||
|
data: require('./data'),
|
||
|
file: require('./file'),
|
||
|
ftp: require('./ftp'),
|
||
|
http: require('./http'),
|
||
|
https: require('./https')
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Async function that returns a `stream.Readable` instance to the
|
||
|
* callback function that will output the contents of the given URI.
|
||
|
*
|
||
|
* For caching purposes, you can pass in a `stream` instance from a previous
|
||
|
* `getUri()` call as a `cache: stream` option, and if the destination has
|
||
|
* not changed since the last time the endpoint was retreived then the callback
|
||
|
* will be invoked with an Error object with `code` set to "ENOTMODIFIED" and
|
||
|
* `null` for the "stream" instance argument. In this case, you can skip
|
||
|
* retreiving the file again and continue to use the previous payload.
|
||
|
*
|
||
|
* @param {String} uri URI to retrieve
|
||
|
* @param {Object} opts optional "options" object
|
||
|
* @param {Function} fn callback function
|
||
|
* @api public
|
||
|
*/
|
||
|
|
||
|
function getUri (uri, opts, fn) {
|
||
|
debug('getUri(%o)', uri);
|
||
|
|
||
|
if ('function' == typeof opts) {
|
||
|
fn = opts;
|
||
|
opts = null;
|
||
|
}
|
||
|
if ('function' != typeof fn) {
|
||
|
throw new TypeError('a callback function must be provided');
|
||
|
}
|
||
|
|
||
|
if (!uri) return fn(new TypeError('must pass in a URI to "get"'));
|
||
|
|
||
|
var parsed = parse(uri);
|
||
|
var protocol = parsed.protocol;
|
||
|
if (!protocol) return fn(new TypeError('URI does not contain a protocol: ' + uri));
|
||
|
|
||
|
// strip trailing :
|
||
|
protocol = protocol.replace(/\:$/, '');
|
||
|
|
||
|
var getter = exports.protocols[protocol];
|
||
|
|
||
|
if ('function' != typeof getter)
|
||
|
return fn(new TypeError('unsupported protocol "' + protocol + '" specified in URI: ' + uri));
|
||
|
|
||
|
getter(parsed, opts || {}, fn);
|
||
|
}
|