Demo for query storing

Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/download/index.js b/node_modules/download/index.js
new file mode 100644
index 0000000..7e5fcb0
--- /dev/null
+++ b/node_modules/download/index.js
@@ -0,0 +1,108 @@
+'use strict';
+const fs = require('fs');
+const path = require('path');
+const url = require('url');
+const caw = require('caw');
+const contentDisposition = require('content-disposition');
+const decompress = require('decompress');
+const filenamify = require('filenamify');
+const getStream = require('get-stream');
+const got = require('got');
+const makeDir = require('make-dir');
+const pify = require('pify');
+const pEvent = require('p-event');
+const fileType = require('file-type');
+const extName = require('ext-name');
+
+const fsP = pify(fs);
+const filenameFromPath = res => path.basename(url.parse(res.requestUrl).pathname);
+
+const getExtFromMime = res => {
+	const header = res.headers['content-type'];
+
+	if (!header) {
+		return null;
+	}
+
+	const exts = extName.mime(header);
+
+	if (exts.length !== 1) {
+		return null;
+	}
+
+	return exts[0].ext;
+};
+
+const getFilename = (res, data) => {
+	const header = res.headers['content-disposition'];
+
+	if (header) {
+		const parsed = contentDisposition.parse(header);
+
+		if (parsed.parameters && parsed.parameters.filename) {
+			return parsed.parameters.filename;
+		}
+	}
+
+	let filename = filenameFromPath(res);
+
+	if (!path.extname(filename)) {
+		const ext = (fileType(data) || {}).ext || getExtFromMime(res);
+
+		if (ext) {
+			filename = `${filename}.${ext}`;
+		}
+	}
+
+	return filename;
+};
+
+module.exports = (uri, output, opts) => {
+	if (typeof output === 'object') {
+		opts = output;
+		output = null;
+	}
+
+	let protocol = url.parse(uri).protocol;
+
+	if (protocol) {
+		protocol = protocol.slice(0, -1);
+	}
+
+	opts = Object.assign({
+		encoding: null,
+		rejectUnauthorized: process.env.npm_config_strict_ssl !== 'false'
+	}, opts);
+
+	const agent = caw(opts.proxy, {protocol});
+	const stream = got.stream(uri, Object.assign({agent}, opts));
+
+	const promise = pEvent(stream, 'response').then(res => {
+		const encoding = opts.encoding === null ? 'buffer' : opts.encoding;
+		return Promise.all([getStream(stream, {encoding}), res]);
+	}).then(result => {
+		// TODO: Use destructuring when targeting Node.js 6
+		const data = result[0];
+		const res = result[1];
+
+		if (!output) {
+			return opts.extract ? decompress(data, opts) : data;
+		}
+
+		const filename = opts.filename || filenamify(getFilename(res, data));
+		const outputFilepath = path.join(output, filename);
+
+		if (opts.extract) {
+			return decompress(data, path.dirname(outputFilepath), opts);
+		}
+
+		return makeDir(path.dirname(outputFilepath))
+			.then(() => fsP.writeFile(outputFilepath, data))
+			.then(() => data);
+	});
+
+	stream.then = promise.then.bind(promise);
+	stream.catch = promise.catch.bind(promise);
+
+	return stream;
+};