| '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); |
| } |