aboutsummaryrefslogtreecommitdiffstats
path: root/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test
diff options
context:
space:
mode:
Diffstat (limited to 'vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test')
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/README.md10
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/common.js190
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/pummel/test-http-upload-timeout.js69
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/run90
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/run-single70
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-chunked.js63
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-abort.js80
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-abort2.js41
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-upload-buf.js74
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-upload.js77
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-contentLength0.js42
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-eof-on-connect.js40
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-extra-response.js86
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-request.js56
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-response-has-no-body-end.js61
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-response-has-no-body.js58
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-host-headers.js101
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-many-keep-alive-connections.js68
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-multi-line-headers.js59
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-proxy.js109
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-response-close.js55
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-server-multiheaders.js59
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-set-cookies.js84
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-status-code.js69
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-upgrade-server2.js72
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http.js108
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/examples-test.js26
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-cert.pem13
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-csr.pem10
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-key.pem9
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2.cnf19
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/http.js182
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/index.js105
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/ws.js112
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/http/http-test.js102
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/http/routing-table-test.js107
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/examples.js101
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/http.js531
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/index.js11
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/ws.js232
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/routing-table-test.js25
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/socket.io-test.js20
-rw-r--r--vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/ws-test.js23
43 files changed, 3519 insertions, 0 deletions
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/README.md b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/README.md
new file mode 100644
index 00000000..152e5c66
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/README.md
@@ -0,0 +1,10 @@
+# `test/core`
+
+`test/core` directory is a place where tests from node.js core go. They are
+here to ensure that node-http-proxy works just fine with all kinds of
+different situations, which are covered in core tests, but are not covered in
+our tests.
+
+All these tests require little modifications to make them test node-http-proxy,
+but we try to keep them as vanilla as possible.
+
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/common.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/common.js
new file mode 100644
index 00000000..3f584a54
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/common.js
@@ -0,0 +1,190 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var path = require('path');
+var assert = require('assert');
+
+exports.testDir = path.dirname(__filename);
+exports.fixturesDir = path.join(exports.testDir, 'fixtures');
+exports.libDir = path.join(exports.testDir, '../lib');
+exports.tmpDir = path.join(exports.testDir, 'tmp');
+exports.PORT = 12346;
+exports.PROXY_PORT = 1234567;
+
+if (process.platform === 'win32') {
+ exports.PIPE = '\\\\.\\pipe\\libuv-test';
+} else {
+ exports.PIPE = exports.tmpDir + '/test.sock';
+}
+
+var util = require('util');
+for (var i in util) exports[i] = util[i];
+//for (var i in exports) global[i] = exports[i];
+
+function protoCtrChain(o) {
+ var result = [];
+ for (; o; o = o.__proto__) { result.push(o.constructor); }
+ return result.join();
+}
+
+exports.indirectInstanceOf = function (obj, cls) {
+ if (obj instanceof cls) { return true; }
+ var clsChain = protoCtrChain(cls.prototype);
+ var objChain = protoCtrChain(obj);
+ return objChain.slice(-clsChain.length) === clsChain;
+};
+
+
+exports.ddCommand = function (filename, kilobytes) {
+ if (process.platform === 'win32') {
+ var p = path.resolve(exports.fixturesDir, 'create-file.js');
+ return '"' + process.argv[0] + '" "' + p + '" "' +
+ filename + '" ' + (kilobytes * 1024);
+ } else {
+ return 'dd if=/dev/zero of="' + filename + '" bs=1024 count=' + kilobytes;
+ }
+};
+
+
+exports.spawnPwd = function (options) {
+ var spawn = require('child_process').spawn;
+
+ if (process.platform === 'win32') {
+ return spawn('cmd.exe', ['/c', 'cd'], options);
+ } else {
+ return spawn('pwd', [], options);
+ }
+};
+
+
+// Turn this off if the test should not check for global leaks.
+exports.globalCheck = true;
+
+process.on('exit', function () {
+ if (!exports.globalCheck) return;
+ var knownGlobals = [setTimeout,
+ setInterval,
+ clearTimeout,
+ clearInterval,
+ console,
+ Buffer,
+ process,
+ global];
+
+ if (global.setImmediate) {
+ knownGlobals.push(setImmediate);
+ knownGlobals.push(clearImmediate);
+ }
+
+ if (global.errno) {
+ knownGlobals.push(errno);
+ }
+
+ if (global.gc) {
+ knownGlobals.push(gc);
+ }
+
+ if (global.DTRACE_HTTP_SERVER_RESPONSE) {
+ knownGlobals.push(DTRACE_HTTP_SERVER_RESPONSE);
+ knownGlobals.push(DTRACE_HTTP_SERVER_REQUEST);
+ knownGlobals.push(DTRACE_HTTP_CLIENT_RESPONSE);
+ knownGlobals.push(DTRACE_HTTP_CLIENT_REQUEST);
+ knownGlobals.push(DTRACE_NET_STREAM_END);
+ knownGlobals.push(DTRACE_NET_SERVER_CONNECTION);
+ knownGlobals.push(DTRACE_NET_SOCKET_READ);
+ knownGlobals.push(DTRACE_NET_SOCKET_WRITE);
+ }
+
+ if (global.ArrayBuffer) {
+ knownGlobals.push(ArrayBuffer);
+ knownGlobals.push(Int8Array);
+ knownGlobals.push(Uint8Array);
+ knownGlobals.push(Int16Array);
+ knownGlobals.push(Uint16Array);
+ knownGlobals.push(Int32Array);
+ knownGlobals.push(Uint32Array);
+ knownGlobals.push(Float32Array);
+ knownGlobals.push(Float64Array);
+ knownGlobals.push(DataView);
+
+ if (global.Uint8ClampedArray) {
+ knownGlobals.push(Uint8ClampedArray);
+ }
+ }
+
+ for (var x in global) {
+ var found = false;
+
+ for (var y in knownGlobals) {
+ if (global[x] === knownGlobals[y]) {
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ console.error('Unknown global: %s', x);
+ assert.ok(false, 'Unknown global found');
+ }
+ }
+});
+
+
+var mustCallChecks = [];
+
+
+function runCallChecks() {
+ var failed = mustCallChecks.filter(function (context) {
+ return context.actual !== context.expected;
+ });
+
+ failed.forEach(function (context) {
+ console.log('Mismatched %s function calls. Expected %d, actual %d.',
+ context.name,
+ context.expected,
+ context.actual);
+ console.log(context.stack.split('\n').slice(2).join('\n'));
+ });
+
+ if (failed.length) process.exit(1);
+}
+
+
+exports.mustCall = function (fn, expected) {
+ if (typeof expected !== 'number') expected = 1;
+
+ var context = {
+ expected: expected,
+ actual: 0,
+ stack: (new Error).stack,
+ name: fn.name || '<anonymous>'
+ };
+
+ // add the exit listener only once to avoid listener leak warnings
+ if (mustCallChecks.length === 0) process.on('exit', runCallChecks);
+
+ mustCallChecks.push(context);
+
+ return function () {
+ context.actual++;
+ return fn.apply(this, arguments);
+ };
+};
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/pummel/test-http-upload-timeout.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/pummel/test-http-upload-timeout.js
new file mode 100644
index 00000000..74b458f8
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/pummel/test-http-upload-timeout.js
@@ -0,0 +1,69 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// This tests setTimeout() by having multiple clients connecting and sending
+// data in random intervals. Clients are also randomly disconnecting until there
+// are no more clients left. If no false timeout occurs, this test has passed.
+var common = require('../common'),
+ assert = require('assert'),
+ http = require('http'),
+ server = http.createServer(),
+ connections = 0;
+
+server.on('request', function (req, res) {
+ req.socket.setTimeout(1000);
+ req.socket.on('timeout', function () {
+ throw new Error('Unexpected timeout');
+ });
+ req.on('end', function () {
+ connections--;
+ res.writeHead(200);
+ res.end('done\n');
+ if (connections == 0) {
+ server.close();
+ }
+ });
+});
+
+server.listen(common.PORT, '127.0.0.1', function () {
+ for (var i = 0; i < 10; i++) {
+ connections++;
+
+ setTimeout(function () {
+ var request = http.request({
+ port: common.PROXY_PORT,
+ method: 'POST',
+ path: '/'
+ });
+
+ function ping() {
+ var nextPing = (Math.random() * 900).toFixed();
+ if (nextPing > 600) {
+ request.end();
+ return;
+ }
+ request.write('ping');
+ setTimeout(ping, nextPing);
+ }
+ ping();
+ }, i * 50);
+ }
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/run b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/run
new file mode 100644
index 00000000..adec53ba
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/run
@@ -0,0 +1,90 @@
+#!/usr/bin/env node
+/*
+ run.js: test runner for core tests
+
+ Copyright (c) 2011 Nodejitsu
+
+ 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.
+
+*/
+
+var fs = require('fs'),
+ path = require('path'),
+ spawn = require('child_process').spawn,
+ async = require('async'),
+ colors = require('colors'),
+ optimist = require('optimist');
+
+optimist.argv.color && (colors.mode = optimist.argv.color);
+
+var testTimeout = 15000;
+var results = {};
+
+function runTest(test, callback) {
+ var child = spawn(path.join(__dirname, 'run-single'), [ test ]);
+
+ var killTimeout = setTimeout(function () {
+ child.kill();
+ console.log(' ' + path.basename(test).yellow + ' timed out'.red);
+ }, testTimeout);
+
+ child.on('exit', function (exitCode) {
+ clearTimeout(killTimeout);
+
+ console.log(' ' + ((exitCode) ? '✘'.red : '✔'.green) + ' ' +
+ path.basename(test) +
+ (exitCode ? (' (exit code: ' + exitCode + ')') : ''));
+ results[test] = { exitCode: exitCode };
+ callback();
+ //
+ // We don't want tests to be stopped after first failure, and that's what
+ // async does when it receives truthy value in callback.
+ //
+ });
+};
+
+var tests = process.argv.slice(2).filter(function (test) {
+ return test.substr(0, 2) != '--';
+});
+
+if (!tests.length) {
+ var pathPrefix = path.join(__dirname, 'simple');
+ tests = fs.readdirSync(pathPrefix).map(function (test) {
+ return path.join(pathPrefix, test);
+ });
+ //
+ // We only run simple tests by default.
+ //
+}
+
+console.log('Running tests:'.bold);
+async.forEachSeries(tests, runTest, function () {
+ var failed = [], ok = [];
+ for (var test in results) {
+ (results[test].exitCode != 0 ? failed : ok).push(test);
+ }
+
+ console.log('\nSummary:'.bold);
+ console.log((' ' + ok.length + '\tpassed tests').green);
+ console.log((' ' + failed.length + '\tfailed tests').red);
+});
+
+// vim:filetype=javascript
+
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/run-single b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/run-single
new file mode 100644
index 00000000..ae53588a
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/run-single
@@ -0,0 +1,70 @@
+#!/usr/bin/env node
+/*
+ run-single.js: test runner for core tests
+
+ Copyright (c) 2011 Nodejitsu
+
+ 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.
+
+*/
+
+//
+// Basic idea behind core test runner is to modify core tests as little as
+// possible. That's why we start up node-http-proxy here instead of embeeding
+// this code in tests.
+//
+// In most cases only modification to core tests you'll need is changing port
+// of http client to common.PROXY_PORT.
+//
+
+var path = require('path'),
+ spawn = require('child_process').spawn,
+ httpProxy = require('../../'),
+ common = require('./common');
+
+var test = process.argv[2],
+ testProcess;
+
+if (!test) {
+ return console.error('Need test to run');
+}
+
+console.log('Running test ' + test);
+
+var proxy = httpProxy.createServer(common.PORT, 'localhost');
+proxy.listen(common.PROXY_PORT);
+
+proxy.on('listening', function () {
+ console.log('Proxy server listening on ' + common.PROXY_PORT);
+ testProcess = spawn(process.argv[0], [ process.argv[2] ]);
+ testProcess.stdout.pipe(process.stdout);
+ testProcess.stderr.pipe(process.stderr);
+
+ testProcess.on('exit', function (code) {
+ process.exit(code);
+ });
+});
+
+process.on('SIGTERM', function () {
+ testProcess.kill();
+ process.exit(1);
+});
+
+// vim:filetype=javascript
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-chunked.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-chunked.js
new file mode 100644
index 00000000..b1cbf0db
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-chunked.js
@@ -0,0 +1,63 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var UTF8_STRING = '南越国是前203年至前111年存在于岭南地区的一个国家,' +
+ '国都位于番禺,疆域包括今天中国的广东、广西两省区的大部份地区,福建省、湖南、' +
+ '贵州、云南的一小部份地区和越南的北部。南越国是秦朝灭亡后,' +
+ '由南海郡尉赵佗于前203年起兵兼并桂林郡和象郡后建立。前196年和前179年,' +
+ '南越国曾先后两次名义上臣属于西汉,成为西汉的“外臣”。前112年,' +
+ '南越国末代君主赵建德与西汉发生战争,被汉武帝于前111年所灭。' +
+ '南越国共存在93年,历经五代君主。南越国是岭南地区的第一个有记载的政权国家,' +
+ '采用封建制和郡县制并存的制度,它的建立保证了秦末乱世岭南地区社会秩序的稳定,' +
+ '有效的改善了岭南地区落后的政治、经济现状。';
+
+var server = http.createServer(function (req, res) {
+ res.writeHead(200, {'Content-Type': 'text/plain; charset=utf8'});
+ res.end(UTF8_STRING, 'utf8');
+});
+server.listen(common.PORT, function () {
+ var data = '';
+ var get = http.get({
+ path: '/',
+ host: 'localhost',
+ port: common.PROXY_PORT
+ }, function (x) {
+ x.setEncoding('utf8');
+ x.on('data', function (c) {data += c});
+ x.on('error', function (e) {
+ throw e;
+ });
+ x.on('end', function () {
+ assert.equal('string', typeof data);
+ console.log('here is the response:');
+ assert.equal(UTF8_STRING, data);
+ console.log(data);
+ server.close();
+ });
+ });
+ get.on('error', function (e) {throw e});
+ get.end();
+
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-abort.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-abort.js
new file mode 100644
index 00000000..78d0a6f9
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-abort.js
@@ -0,0 +1,80 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var clientAborts = 0;
+
+var server = http.Server(function (req, res) {
+ console.log('Got connection');
+ res.writeHead(200);
+ res.write('Working on it...');
+
+ // I would expect an error event from req or res that the client aborted
+ // before completing the HTTP request / response cycle, or maybe a new
+ // event like "aborted" or something.
+ req.on('aborted', function () {
+ clientAborts++;
+ console.log('Got abort ' + clientAborts);
+ if (clientAborts === N) {
+ console.log('All aborts detected, you win.');
+ server.close();
+ }
+ });
+
+ // since there is already clientError, maybe that would be appropriate,
+ // since "error" is magical
+ req.on('clientError', function () {
+ console.log('Got clientError');
+ });
+});
+
+var responses = 0;
+var N = http.Agent.defaultMaxSockets - 1;
+var requests = [];
+
+server.listen(common.PORT, function () {
+ console.log('Server listening.');
+
+ for (var i = 0; i < N; i++) {
+ console.log('Making client ' + i);
+ var options = { port: common.PROXY_PORT, path: '/?id=' + i };
+ var req = http.get(options, function (res) {
+ console.log('Client response code ' + res.statusCode);
+
+ if (++responses == N) {
+ console.log('All clients connected, destroying.');
+ requests.forEach(function (outReq) {
+ console.log('abort');
+ outReq.abort();
+ });
+ }
+ });
+
+ requests.push(req);
+ }
+});
+
+process.on('exit', function () {
+ assert.equal(N, clientAborts);
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-abort2.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-abort2.js
new file mode 100644
index 00000000..eef05fb4
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-abort2.js
@@ -0,0 +1,41 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// libuv-broken
+
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var server = http.createServer(function (req, res) {
+ res.end('Hello');
+});
+
+server.listen(common.PORT, function () {
+ var req = http.get({port: common.PROXY_PORT}, function (res) {
+ res.on('data', function (data) {
+ req.abort();
+ server.close();
+ });
+ });
+});
+
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-upload-buf.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-upload-buf.js
new file mode 100644
index 00000000..3b8e9abc
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-upload-buf.js
@@ -0,0 +1,74 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var N = 1024;
+var bytesRecieved = 0;
+var server_req_complete = false;
+var client_res_complete = false;
+
+var server = http.createServer(function (req, res) {
+ assert.equal('POST', req.method);
+
+ req.on('data', function (chunk) {
+ bytesRecieved += chunk.length;
+ });
+
+ req.on('end', function () {
+ server_req_complete = true;
+ console.log('request complete from server');
+ res.writeHead(200, {'Content-Type': 'text/plain'});
+ res.write('hello\n');
+ res.end();
+ });
+});
+server.listen(common.PORT);
+
+server.on('listening', function () {
+ var req = http.request({
+ port: common.PROXY_PORT,
+ method: 'POST',
+ path: '/'
+ }, function (res) {
+ res.setEncoding('utf8');
+ res.on('data', function (chunk) {
+ console.log(chunk);
+ });
+ res.on('end', function () {
+ client_res_complete = true;
+ server.close();
+ });
+ });
+
+ req.write(new Buffer(N));
+ req.end();
+
+ common.error('client finished sending request');
+});
+
+process.on('exit', function () {
+ assert.equal(N, bytesRecieved);
+ assert.equal(true, server_req_complete);
+ assert.equal(true, client_res_complete);
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-upload.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-upload.js
new file mode 100644
index 00000000..fef706f2
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-client-upload.js
@@ -0,0 +1,77 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var sent_body = '';
+var server_req_complete = false;
+var client_res_complete = false;
+
+var server = http.createServer(function (req, res) {
+ assert.equal('POST', req.method);
+ req.setEncoding('utf8');
+
+ req.on('data', function (chunk) {
+ console.log('server got: ' + JSON.stringify(chunk));
+ sent_body += chunk;
+ });
+
+ req.on('end', function () {
+ server_req_complete = true;
+ console.log('request complete from server');
+ res.writeHead(200, {'Content-Type': 'text/plain'});
+ res.write('hello\n');
+ res.end();
+ });
+});
+server.listen(common.PORT);
+
+server.on('listening', function () {
+ var req = http.request({
+ port: common.PROXY_PORT,
+ method: 'POST',
+ path: '/'
+ }, function (res) {
+ res.setEncoding('utf8');
+ res.on('data', function (chunk) {
+ console.log(chunk);
+ });
+ res.on('end', function () {
+ client_res_complete = true;
+ server.close();
+ });
+ });
+
+ req.write('1\n');
+ req.write('2\n');
+ req.write('3\n');
+ req.end();
+
+ common.error('client finished sending request');
+});
+
+process.on('exit', function () {
+ assert.equal('1\n2\n3\n', sent_body);
+ assert.equal(true, server_req_complete);
+ assert.equal(true, client_res_complete);
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-contentLength0.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-contentLength0.js
new file mode 100644
index 00000000..abc3747e
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-contentLength0.js
@@ -0,0 +1,42 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var http = require('http');
+
+// Simple test of Node's HTTP Client choking on a response
+// with a 'Content-Length: 0 ' response header.
+// I.E. a space character after the 'Content-Length' throws an `error` event.
+
+
+var s = http.createServer(function (req, res) {
+ res.writeHead(200, {'Content-Length': '0 '});
+ res.end();
+});
+s.listen(common.PORT, function () {
+
+ var request = http.request({ port: common.PROXY_PORT }, function (response) {
+ console.log('STATUS: ' + response.statusCode);
+ s.close();
+ });
+
+ request.end();
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-eof-on-connect.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-eof-on-connect.js
new file mode 100644
index 00000000..d02ee6d1
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-eof-on-connect.js
@@ -0,0 +1,40 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var net = require('net');
+var http = require('http');
+
+// This is a regression test for http://github.com/ry/node/issues/#issue/44
+// It is separate from test-http-malformed-request.js because it is only
+// reproduceable on the first packet on the first connection to a server.
+
+var server = http.createServer(function (req, res) {});
+server.listen(common.PORT);
+
+server.on('listening', function () {
+ net.createConnection(common.PROXY_PORT).on('connect', function () {
+ this.destroy();
+ }).on('close', function () {
+ server.close();
+ });
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-extra-response.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-extra-response.js
new file mode 100644
index 00000000..a3d27462
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-extra-response.js
@@ -0,0 +1,86 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+var net = require('net');
+
+// If an HTTP server is broken and sends data after the end of the response,
+// node should ignore it and drop the connection.
+// Demos this bug: https://github.com/ry/node/issues/680
+
+var body = 'hello world\r\n';
+var fullResponse =
+ 'HTTP/1.1 500 Internal Server Error\r\n' +
+ 'Content-Length: ' + body.length + '\r\n' +
+ 'Content-Type: text/plain\r\n' +
+ 'Date: Fri + 18 Feb 2011 06:22:45 GMT\r\n' +
+ 'Host: 10.20.149.2\r\n' +
+ 'Access-Control-Allow-Credentials: true\r\n' +
+ 'Server: badly broken/0.1 (OS NAME)\r\n' +
+ '\r\n' +
+ body;
+
+var gotResponse = false;
+
+
+var server = net.createServer(function (socket) {
+ var postBody = '';
+
+ socket.setEncoding('utf8');
+
+ socket.on('data', function (chunk) {
+ postBody += chunk;
+
+ if (postBody.indexOf('\r\n') > -1) {
+ socket.write(fullResponse);
+ // omg, I wrote the response twice, what a terrible HTTP server I am.
+ socket.end(fullResponse);
+ }
+ });
+});
+
+
+server.listen(common.PORT, function () {
+ http.get({ port: common.PROXY_PORT }, function (res) {
+ var buffer = '';
+ console.log('Got res code: ' + res.statusCode);
+
+ res.setEncoding('utf8');
+ res.on('data', function (chunk) {
+ buffer += chunk;
+ });
+
+ res.on('end', function () {
+ console.log('Response ended, read ' + buffer.length + ' bytes');
+ assert.equal(body, buffer);
+ server.close();
+ gotResponse = true;
+ });
+ });
+});
+
+
+process.on('exit', function () {
+ assert.ok(gotResponse);
+});
+
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-request.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-request.js
new file mode 100644
index 00000000..e8c203ef
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-request.js
@@ -0,0 +1,56 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+var util = require('util');
+
+
+var body = 'hello world\n';
+
+var server = http.createServer(function (req, res) {
+ common.error('req: ' + req.method);
+ res.writeHead(200, {'Content-Length': body.length});
+ res.end();
+ server.close();
+});
+
+var gotEnd = false;
+
+server.listen(common.PORT, function () {
+ var request = http.request({
+ port: common.PROXY_PORT,
+ method: 'HEAD',
+ path: '/'
+ }, function (response) {
+ common.error('response start');
+ response.on('end', function () {
+ common.error('response end');
+ gotEnd = true;
+ });
+ });
+ request.end();
+});
+
+process.on('exit', function () {
+ assert.ok(gotEnd);
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-response-has-no-body-end.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-response-has-no-body-end.js
new file mode 100644
index 00000000..6d89bee9
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-response-has-no-body-end.js
@@ -0,0 +1,61 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// libuv-broken
+
+
+var common = require('../common');
+var assert = require('assert');
+
+var http = require('http');
+
+// This test is to make sure that when the HTTP server
+// responds to a HEAD request with data to res.end,
+// it does not send any body.
+
+var server = http.createServer(function (req, res) {
+ res.writeHead(200);
+ res.end('FAIL'); // broken: sends FAIL from hot path.
+});
+server.listen(common.PORT);
+
+var responseComplete = false;
+
+server.on('listening', function () {
+ var req = http.request({
+ port: common.PROXY_PORT,
+ method: 'HEAD',
+ path: '/'
+ }, function (res) {
+ common.error('response');
+ res.on('end', function () {
+ common.error('response end');
+ server.close();
+ responseComplete = true;
+ });
+ });
+ common.error('req');
+ req.end();
+});
+
+process.on('exit', function () {
+ assert.ok(responseComplete);
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-response-has-no-body.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-response-has-no-body.js
new file mode 100644
index 00000000..aa7a281b
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-head-response-has-no-body.js
@@ -0,0 +1,58 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+
+var http = require('http');
+
+// This test is to make sure that when the HTTP server
+// responds to a HEAD request, it does not send any body.
+// In this case it was sending '0\r\n\r\n'
+
+var server = http.createServer(function (req, res) {
+ res.writeHead(200); // broken: defaults to TE chunked
+ res.end();
+});
+server.listen(common.PORT);
+
+var responseComplete = false;
+
+server.on('listening', function () {
+ var req = http.request({
+ port: common.PROXY_PORT,
+ method: 'HEAD',
+ path: '/'
+ }, function (res) {
+ common.error('response');
+ res.on('end', function () {
+ common.error('response end');
+ server.close();
+ responseComplete = true;
+ });
+ });
+ common.error('req');
+ req.end();
+});
+
+process.on('exit', function () {
+ assert.ok(responseComplete);
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-host-headers.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-host-headers.js
new file mode 100644
index 00000000..2dae1182
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-host-headers.js
@@ -0,0 +1,101 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// libuv-broken
+
+
+var http = require('http'),
+ common = require('../common'),
+ assert = require('assert'),
+ httpServer = http.createServer(reqHandler);
+
+function reqHandler(req, res) {
+ console.log('Got request: ' + req.headers.host + ' ' + req.url);
+ if (req.url === '/setHostFalse5') {
+ assert.equal(req.headers.host, undefined);
+ } else {
+ assert.equal(req.headers.host, 'localhost:' + common.PROXY_PORT,
+ 'Wrong host header for req[' + req.url + ']: ' +
+ req.headers.host);
+ }
+ res.writeHead(200, {});
+ //process.nextTick(function () { res.end('ok'); });
+ res.end('ok');
+}
+
+function thrower(er) {
+ throw er;
+}
+
+testHttp();
+
+function testHttp() {
+
+ console.log('testing http on port ' + common.PROXY_PORT + ' (proxied to ' +
+ common.PORT + ')');
+
+ var counter = 0;
+
+ function cb() {
+ counter--;
+ console.log('back from http request. counter = ' + counter);
+ if (counter === 0) {
+ httpServer.close();
+ }
+ }
+
+ httpServer.listen(common.PORT, function (er) {
+ console.error('listening on ' + common.PORT);
+
+ if (er) throw er;
+
+ http.get({ method: 'GET',
+ path: '/' + (counter++),
+ host: 'localhost',
+ //agent: false,
+ port: common.PROXY_PORT }, cb).on('error', thrower);
+
+ http.request({ method: 'GET',
+ path: '/' + (counter++),
+ host: 'localhost',
+ //agent: false,
+ port: common.PROXY_PORT }, cb).on('error', thrower).end();
+
+ http.request({ method: 'POST',
+ path: '/' + (counter++),
+ host: 'localhost',
+ //agent: false,
+ port: common.PROXY_PORT }, cb).on('error', thrower).end();
+
+ http.request({ method: 'PUT',
+ path: '/' + (counter++),
+ host: 'localhost',
+ //agent: false,
+ port: common.PROXY_PORT }, cb).on('error', thrower).end();
+
+ http.request({ method: 'DELETE',
+ path: '/' + (counter++),
+ host: 'localhost',
+ //agent: false,
+ port: common.PROXY_PORT }, cb).on('error', thrower).end();
+ });
+}
+
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-many-keep-alive-connections.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-many-keep-alive-connections.js
new file mode 100644
index 00000000..6b79619b
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-many-keep-alive-connections.js
@@ -0,0 +1,68 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var expected = 10000;
+var responses = 0;
+var requests = 0;
+var connection;
+
+var server = http.Server(function (req, res) {
+ requests++;
+ assert.equal(req.connection, connection);
+ res.writeHead(200);
+ res.end('hello world\n');
+});
+
+server.once('connection', function (c) {
+ connection = c;
+});
+
+server.listen(common.PORT, function () {
+ var callee = arguments.callee;
+ var request = http.get({
+ port: common.PROXY_PORT,
+ path: '/',
+ headers: {
+ 'Connection': 'Keep-alive'
+ }
+ }, function (res) {
+ res.on('end', function () {
+ if (++responses < expected) {
+ callee();
+ } else {
+ process.exit();
+ }
+ });
+ }).on('error', function (e) {
+ console.log(e.message);
+ process.exit(1);
+ });
+ request.agent.maxSockets = 1;
+});
+
+process.on('exit', function () {
+ assert.equal(expected, responses);
+ assert.equal(expected, requests);
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-multi-line-headers.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-multi-line-headers.js
new file mode 100644
index 00000000..e0eeb2c1
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-multi-line-headers.js
@@ -0,0 +1,59 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+
+var http = require('http');
+var net = require('net');
+
+var gotResponse = false;
+
+var server = net.createServer(function (conn) {
+ var body = 'Yet another node.js server.';
+
+ var response =
+ 'HTTP/1.1 200 OK\r\n' +
+ 'Connection: close\r\n' +
+ 'Content-Length: ' + body.length + '\r\n' +
+ 'Content-Type: text/plain;\r\n' +
+ ' x-unix-mode=0600;\r\n' +
+ ' name=\"hello.txt\"\r\n' +
+ '\r\n' +
+ body;
+
+ conn.write(response, function () {
+ conn.destroy();
+ server.close();
+ });
+});
+
+server.listen(common.PORT, function () {
+ http.get({host: '127.0.0.1', port: common.PROXY_PORT}, function (res) {
+ assert.equal(res.headers['content-type'],
+ 'text/plain;x-unix-mode=0600;name="hello.txt"');
+ gotResponse = true;
+ });
+});
+
+process.on('exit', function () {
+ assert.ok(gotResponse);
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-proxy.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-proxy.js
new file mode 100644
index 00000000..fdddb3cd
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-proxy.js
@@ -0,0 +1,109 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+var url = require('url');
+
+var PROXY_PORT = common.PORT;
+var BACKEND_PORT = common.PORT + 1;
+
+var cookies = [
+ 'session_token=; path=/; expires=Sun, 15-Sep-2030 13:48:52 GMT',
+ 'prefers_open_id=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT'
+];
+
+var headers = {'content-type': 'text/plain',
+ 'set-cookie': cookies,
+ 'hello': 'world' };
+
+var backend = http.createServer(function (req, res) {
+ common.debug('backend request');
+ res.writeHead(200, headers);
+ res.write('hello world\n');
+ res.end();
+});
+
+var proxy = http.createServer(function (req, res) {
+ common.debug('proxy req headers: ' + JSON.stringify(req.headers));
+ var proxy_req = http.get({
+ port: BACKEND_PORT,
+ path: url.parse(req.url).pathname
+ }, function (proxy_res) {
+
+ common.debug('proxy res headers: ' + JSON.stringify(proxy_res.headers));
+
+ assert.equal('world', proxy_res.headers['hello']);
+ assert.equal('text/plain', proxy_res.headers['content-type']);
+ assert.deepEqual(cookies, proxy_res.headers['set-cookie']);
+
+ res.writeHead(proxy_res.statusCode, proxy_res.headers);
+
+ proxy_res.on('data', function (chunk) {
+ res.write(chunk);
+ });
+
+ proxy_res.on('end', function () {
+ res.end();
+ common.debug('proxy res');
+ });
+ });
+});
+
+var body = '';
+
+var nlistening = 0;
+function startReq() {
+ nlistening++;
+ if (nlistening < 2) return;
+
+ var client = http.get({
+ port: common.PROXY_PORT,
+ path: '/test'
+ }, function (res) {
+ common.debug('got res');
+ assert.equal(200, res.statusCode);
+
+ assert.equal('world', res.headers['hello']);
+ assert.equal('text/plain', res.headers['content-type']);
+ assert.deepEqual(cookies, res.headers['set-cookie']);
+
+ res.setEncoding('utf8');
+ res.on('data', function (chunk) { body += chunk; });
+ res.on('end', function () {
+ proxy.close();
+ backend.close();
+ common.debug('closed both');
+ });
+ });
+ common.debug('client req');
+}
+
+common.debug('listen proxy');
+proxy.listen(PROXY_PORT, startReq);
+
+common.debug('listen backend');
+backend.listen(BACKEND_PORT, startReq);
+
+process.on('exit', function () {
+ assert.equal(body, 'hello world\n');
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-response-close.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-response-close.js
new file mode 100644
index 00000000..b92abb01
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-response-close.js
@@ -0,0 +1,55 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var gotEnd = false;
+
+var server = http.createServer(function (req, res) {
+ res.writeHead(200);
+ res.write('a');
+
+ req.on('close', function () {
+ console.error('aborted');
+ gotEnd = true;
+ });
+});
+server.listen(common.PORT);
+
+server.on('listening', function () {
+ console.error('make req');
+ http.get({
+ port: common.PROXY_PORT
+ }, function (res) {
+ console.error('got res');
+ res.on('data', function (data) {
+ console.error('destroy res');
+ res.destroy();
+ server.close();
+ });
+ });
+});
+
+process.on('exit', function () {
+ assert.ok(gotEnd);
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-server-multiheaders.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-server-multiheaders.js
new file mode 100644
index 00000000..6a5b8be7
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-server-multiheaders.js
@@ -0,0 +1,59 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// Verify that the HTTP server implementation handles multiple instances
+// of the same header as per RFC2616: joining the handful of fields by ', '
+// that support it, and dropping duplicates for other fields.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var srv = http.createServer(function (req, res) {
+ assert.equal(req.headers.accept, 'abc, def, ghijklmnopqrst');
+ assert.equal(req.headers.host, 'foo');
+ assert.equal(req.headers['x-foo'], 'bingo');
+ assert.equal(req.headers['x-bar'], 'banjo, bango');
+
+ res.writeHead(200, {'Content-Type' : 'text/plain'});
+ res.end('EOF');
+
+ srv.close();
+});
+
+srv.listen(common.PORT, function () {
+ http.get({
+ host: 'localhost',
+ port: common.PROXY_PORT,
+ path: '/',
+ headers: [
+ ['accept', 'abc'],
+ ['accept', 'def'],
+ ['Accept', 'ghijklmnopqrst'],
+ ['host', 'foo'],
+ ['Host', 'bar'],
+ ['hOst', 'baz'],
+ ['x-foo', 'bingo'],
+ ['x-bar', 'banjo'],
+ ['x-bar', 'bango']
+ ]
+ });
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-set-cookies.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-set-cookies.js
new file mode 100644
index 00000000..aac29940
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-set-cookies.js
@@ -0,0 +1,84 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var nresponses = 0;
+
+var server = http.createServer(function (req, res) {
+ if (req.url == '/one') {
+ res.writeHead(200, [['set-cookie', 'A'],
+ ['content-type', 'text/plain']]);
+ res.end('one\n');
+ } else {
+ res.writeHead(200, [['set-cookie', 'A'],
+ ['set-cookie', 'B'],
+ ['content-type', 'text/plain']]);
+ res.end('two\n');
+ }
+});
+server.listen(common.PORT);
+
+server.on('listening', function () {
+ //
+ // one set-cookie header
+ //
+ http.get({ port: common.PROXY_PORT, path: '/one' }, function (res) {
+ // set-cookie headers are always return in an array.
+ // even if there is only one.
+ assert.deepEqual(['A'], res.headers['set-cookie']);
+ assert.equal('text/plain', res.headers['content-type']);
+
+ res.on('data', function (chunk) {
+ console.log(chunk.toString());
+ });
+
+ res.on('end', function () {
+ if (++nresponses == 2) {
+ server.close();
+ }
+ });
+ });
+
+ // two set-cookie headers
+
+ http.get({ port: common.PROXY_PORT, path: '/two' }, function (res) {
+ assert.deepEqual(['A', 'B'], res.headers['set-cookie']);
+ assert.equal('text/plain', res.headers['content-type']);
+
+ res.on('data', function (chunk) {
+ console.log(chunk.toString());
+ });
+
+ res.on('end', function () {
+ if (++nresponses == 2) {
+ server.close();
+ }
+ });
+ });
+
+});
+
+process.on('exit', function () {
+ assert.equal(2, nresponses);
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-status-code.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-status-code.js
new file mode 100644
index 00000000..dffbaf7c
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-status-code.js
@@ -0,0 +1,69 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// libuv-broken
+
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+// Simple test of Node's HTTP ServerResponse.statusCode
+// ServerResponse.prototype.statusCode
+
+var testsComplete = 0;
+var tests = [200, 202, 300, 404, 500];
+var testIdx = 0;
+
+var s = http.createServer(function (req, res) {
+ var t = tests[testIdx];
+ res.writeHead(t, {'Content-Type': 'text/plain'});
+ console.log('--\nserver: statusCode after writeHead: ' + res.statusCode);
+ assert.equal(res.statusCode, t);
+ res.end('hello world\n');
+});
+
+s.listen(common.PORT, nextTest);
+
+
+function nextTest() {
+ if (testIdx + 1 === tests.length) {
+ return s.close();
+ }
+ var test = tests[testIdx];
+
+ http.get({ port: common.PROXY_PORT }, function (response) {
+ console.log('client: expected status: ' + test);
+ console.log('client: statusCode: ' + response.statusCode);
+ assert.equal(response.statusCode, test);
+ response.on('end', function () {
+ testsComplete++;
+ testIdx += 1;
+ nextTest();
+ });
+ });
+}
+
+
+process.on('exit', function () {
+ assert.equal(4, testsComplete);
+});
+
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-upgrade-server2.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-upgrade-server2.js
new file mode 100644
index 00000000..a5273761
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http-upgrade-server2.js
@@ -0,0 +1,72 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+var net = require('net');
+
+var server = http.createServer(function (req, res) {
+ common.error('got req');
+ throw new Error('This shouldn\'t happen.');
+});
+
+server.on('upgrade', function (req, socket, upgradeHead) {
+ common.error('got upgrade event');
+ // test that throwing an error from upgrade gets
+ // is uncaught
+ throw new Error('upgrade error');
+});
+
+var gotError = false;
+
+process.on('uncaughtException', function (e) {
+ common.error('got \'clientError\' event');
+ assert.equal('upgrade error', e.message);
+ gotError = true;
+ process.exit(0);
+});
+
+
+server.listen(common.PORT, function () {
+ var c = net.createConnection(common.PROXY_PORT);
+
+ c.on('connect', function () {
+ common.error('client wrote message');
+ c.write('GET /blah HTTP/1.1\r\n' +
+ 'Upgrade: WebSocket\r\n' +
+ 'Connection: Upgrade\r\n' +
+ '\r\n\r\nhello world');
+ });
+
+ c.on('end', function () {
+ c.end();
+ });
+
+ c.on('close', function () {
+ common.error('client close');
+ server.close();
+ });
+});
+
+process.on('exit', function () {
+ assert.ok(gotError);
+});
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http.js
new file mode 100644
index 00000000..e082eb2c
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/core/simple/test-http.js
@@ -0,0 +1,108 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+var url = require('url');
+
+function p(x) {
+ common.error(common.inspect(x));
+}
+
+var responses_sent = 0;
+var responses_recvd = 0;
+var body0 = '';
+var body1 = '';
+
+var server = http.Server(function (req, res) {
+ if (responses_sent == 0) {
+ assert.equal('GET', req.method);
+ assert.equal('/hello', url.parse(req.url).pathname);
+
+ console.dir(req.headers);
+ assert.equal(true, 'accept' in req.headers);
+ assert.equal('*/*', req.headers['accept']);
+
+ assert.equal(true, 'foo' in req.headers);
+ assert.equal('bar', req.headers['foo']);
+ }
+
+ if (responses_sent == 1) {
+ assert.equal('POST', req.method);
+ assert.equal('/world', url.parse(req.url).pathname);
+ this.close();
+ }
+
+ req.on('end', function () {
+ res.writeHead(200, {'Content-Type': 'text/plain'});
+ res.write('The path was ' + url.parse(req.url).pathname);
+ res.end();
+ responses_sent += 1;
+ });
+
+ //assert.equal('127.0.0.1', res.connection.remoteAddress);
+});
+server.listen(common.PORT);
+
+server.on('listening', function () {
+ var agent = new http.Agent({ port: common.PROXY_PORT, maxSockets: 1 });
+ http.get({
+ port: common.PROXY_PORT,
+ path: '/hello',
+ headers: {'Accept': '*/*', 'Foo': 'bar'},
+ agent: agent
+ }, function (res) {
+ assert.equal(200, res.statusCode);
+ responses_recvd += 1;
+ res.setEncoding('utf8');
+ res.on('data', function (chunk) { body0 += chunk; });
+ common.debug('Got /hello response');
+ });
+
+ setTimeout(function () {
+ var req = http.request({
+ port: common.PROXY_PORT,
+ method: 'POST',
+ path: '/world',
+ agent: agent
+ }, function (res) {
+ assert.equal(200, res.statusCode);
+ responses_recvd += 1;
+ res.setEncoding('utf8');
+ res.on('data', function (chunk) { body1 += chunk; });
+ common.debug('Got /world response');
+ });
+ req.end();
+ }, 1);
+});
+
+process.on('exit', function () {
+ common.debug('responses_recvd: ' + responses_recvd);
+ assert.equal(2, responses_recvd);
+
+ common.debug('responses_sent: ' + responses_sent);
+ assert.equal(2, responses_sent);
+
+ assert.equal('The path was /hello', body0);
+ assert.equal('The path was /world', body1);
+});
+
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/examples-test.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/examples-test.js
new file mode 100644
index 00000000..36beb89a
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/examples-test.js
@@ -0,0 +1,26 @@
+/*
+ * examples.js: Tests which ensure all examples do not throw errors.
+ *
+ * (C) 2010, Charlie Robbins
+ *
+ */
+
+var vows = require('vows')
+ macros = require('./macros'),
+ examples = macros.examples;
+
+//
+// Suppress `EADDRINUSE` errors since
+// we are just checking for require-time errors
+//
+process.on('uncaughtException', function (err) {
+ if (err.code !== 'EADDRINUSE') {
+ throw err;
+ }
+});
+
+vows.describe('node-http-proxy/examples').addBatch(
+ examples.shouldHaveDeps()
+).addBatch(
+ examples.shouldHaveNoErrors()
+).export(module); \ No newline at end of file
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-cert.pem b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-cert.pem
new file mode 100644
index 00000000..8e4354db
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-cert.pem
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIIB7DCCAZYCCQC7gs0MDNn6MTANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJV
+UzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO
+BgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEgMB4GCSqGSIb3DQEJARYR
+cnlAdGlueWNsb3Vkcy5vcmcwHhcNMTEwMzE0MTgyOTEyWhcNMzgwNzI5MTgyOTEy
+WjB9MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYD
+VQQKEwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEg
+MB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwXDANBgkqhkiG9w0BAQEF
+AANLADBIAkEAyXb8FrRdKbhrKLgLSsn61i1C7w7fVVVd7OQsmV/7p9WB2lWFiDlC
+WKGU9SiIz/A6wNZDUAuc2E+VwtpCT561AQIDAQABMA0GCSqGSIb3DQEBBQUAA0EA
+C8HzpuNhFLCI3A5KkBS5zHAQax6TFUOhbpBCR0aTDbJ6F1liDTK1lmU/BjvPoj+9
+1LHwrmh29rK8kBPEjmymCQ==
+-----END CERTIFICATE-----
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-csr.pem b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-csr.pem
new file mode 100644
index 00000000..a670c4c6
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-csr.pem
@@ -0,0 +1,10 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIBXTCCAQcCAQAwfTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQswCQYDVQQH
+EwJTRjEPMA0GA1UEChMGSm95ZW50MRAwDgYDVQQLEwdOb2RlLmpzMQ8wDQYDVQQD
+EwZhZ2VudDIxIDAeBgkqhkiG9w0BCQEWEXJ5QHRpbnljbG91ZHMub3JnMFwwDQYJ
+KoZIhvcNAQEBBQADSwAwSAJBAMl2/Ba0XSm4ayi4C0rJ+tYtQu8O31VVXezkLJlf
++6fVgdpVhYg5QlihlPUoiM/wOsDWQ1ALnNhPlcLaQk+etQECAwEAAaAlMCMGCSqG
+SIb3DQEJBzEWExRBIGNoYWxsZW5nZSBwYXNzd29yZDANBgkqhkiG9w0BAQUFAANB
+AJnll2pt5l0pzskQSpjjLVTlFDFmJr/AZ3UK8v0WxBjYjCe5Jx4YehkChpxIyDUm
+U3J9q9MDUf0+Y2+EGkssFfk=
+-----END CERTIFICATE REQUEST-----
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-key.pem b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-key.pem
new file mode 100644
index 00000000..522903c6
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2-key.pem
@@ -0,0 +1,9 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOgIBAAJBAMl2/Ba0XSm4ayi4C0rJ+tYtQu8O31VVXezkLJlf+6fVgdpVhYg5
+QlihlPUoiM/wOsDWQ1ALnNhPlcLaQk+etQECAwEAAQJBAMT6Bf34+UHKY1ObpsbH
+9u2jsVblFq1rWvs8GPMY6oertzvwm3DpuSUp7PTgOB1nLTLYtCERbQ4ovtN8tn3p
+OHUCIQDzIEGsoCr5vlxXvy2zJwu+fxYuhTZWMVuo1397L0VyhwIhANQh+yzqUgaf
+WRtSB4T2W7ADtJI35ET61jKBty3CqJY3AiAIwju7dVW3A5WeD6Qc1SZGKZvp9yCb
+AFI2BfVwwaY11wIgXF3PeGcvACMyMWsuSv7aPXHfliswAbkWuzcwA4TW01ECIGWa
+cgsDvVFxmfM5NPSuT/UDTa6R5BFISB5ea0N0AR3I
+-----END RSA PRIVATE KEY-----
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2.cnf b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2.cnf
new file mode 100644
index 00000000..0a9f2c73
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/fixtures/agent2.cnf
@@ -0,0 +1,19 @@
+[ req ]
+default_bits = 1024
+days = 999
+distinguished_name = req_distinguished_name
+attributes = req_attributes
+prompt = no
+
+[ req_distinguished_name ]
+C = US
+ST = CA
+L = SF
+O = Joyent
+OU = Node.js
+CN = agent2
+emailAddress = ry@tinyclouds.org
+
+[ req_attributes ]
+challengePassword = A challenge password
+
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/http.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/http.js
new file mode 100644
index 00000000..aaf7a804
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/http.js
@@ -0,0 +1,182 @@
+/*
+ * http.js: Top level include for node-http-proxy http helpers
+ *
+ * (C) 2010 Nodejitsu Inc.
+ * MIT LICENCE
+ *
+ */
+
+var assert = require('assert'),
+ http = require('http'),
+ https = require('https'),
+ url = require('url'),
+ async = require('async'),
+ helpers = require('./index'),
+ protocols = helpers.protocols,
+ httpProxy = require('../../lib/node-http-proxy');
+
+//
+// ### function createServerPair (options, callback)
+// #### @options {Object} Options to create target and proxy server.
+// #### @callback {function} Continuation to respond to when complete.
+//
+// Creates http target and proxy servers
+//
+exports.createServerPair = function (options, callback) {
+ async.series([
+ //
+ // 1. Create the target server
+ //
+ function createTarget(next) {
+ exports.createServer(options.target, next);
+ },
+ //
+ // 2. Create the proxy server
+ //
+ function createTarget(next) {
+ exports.createProxyServer(options.proxy, next);
+ }
+ ], callback);
+};
+
+//
+// ### function createServer (options, callback)
+// #### @options {Object} Options for creatig an http server.
+// #### @port {number} Port to listen on
+// #### @output {string} String to write to each HTTP response
+// #### @headers {Object} Headers to assert are sent by `node-http-proxy`.
+// #### @callback {function} Continuation to respond to when complete.
+//
+// Creates a target server that the tests will proxy to.
+//
+exports.createServer = function (options, callback) {
+ //
+ // Request handler to use in either `http`
+ // or `https` server.
+ //
+ function requestHandler(req, res) {
+ if (options.headers) {
+ Object.keys(options.headers).forEach(function (key) {
+ assert.equal(req.headers[key], options.headers[key]);
+ });
+ }
+
+ if (options.outputHeaders) {
+ Object.keys(options.outputHeaders).forEach(function (header) {
+ res.setHeader(header, options.outputHeaders[header]);
+ });
+ }
+
+ setTimeout(function() {
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
+ res.write(options.output || 'hello proxy');
+ res.end();
+ }, options.latency || 1);
+ }
+
+ var server = protocols.target === 'https'
+ ? https.createServer(helpers.https, requestHandler)
+ : http.createServer(requestHandler);
+
+ server.listen(options.port, function () {
+ callback(null, this);
+ });
+};
+
+//
+// ### function createProxyServer (options, callback)
+// #### @options {Object} Options for creatig an http server.
+// #### @port {number} Port to listen on
+// #### @latency {number} Latency of this server in milliseconds
+// #### @proxy {Object} Options to pass to the HttpProxy.
+// #### @routing {boolean} Enables `httpProxy.RoutingProxy`
+// #### @callback {function} Continuation to respond to when complete.
+//
+// Creates a proxy server that the tests will request against.
+//
+exports.createProxyServer = function (options, callback) {
+ if (!options.latency) {
+ if (protocols.proxy === 'https') {
+ options.proxy.https = helpers.https;
+ }
+ options.proxy.rejectUnauthorized = false;
+
+ return httpProxy
+ .createServer(options.proxy)
+ .listen(options.port, function () {
+ callback(null, this);
+ });
+ }
+
+ var server,
+ proxy;
+
+ proxy = options.routing
+ ? new httpProxy.RoutingProxy(options.proxy)
+ : new httpProxy.HttpProxy(options.proxy);
+
+ //
+ // Request handler to use in either `http`
+ // or `https` server.
+ //
+ function requestHandler(req, res) {
+ var buffer = httpProxy.buffer(req);
+
+ if (options.outputHeaders) {
+ Object.keys(options.outputHeaders).forEach(function (header) {
+ res.setHeader(header, options.outputHeaders[header]);
+ });
+ }
+ setTimeout(function () {
+ //
+ // Setup options dynamically for `RoutingProxy.prototype.proxyRequest`
+ // or `HttpProxy.prototype.proxyRequest`.
+ //
+ buffer = options.routing ? { buffer: buffer } : buffer;
+ proxy.proxyRequest(req, res, buffer);
+ }, options.latency);
+ }
+
+ server = protocols.proxy === 'https'
+ ? https.createServer(helpers.https, requestHandler)
+ : http.createServer(requestHandler);
+
+ server.listen(options.port, function () {
+ callback(null, this);
+ });
+};
+
+//
+// ### function assignPortsToRoutes (routes)
+// #### @routes {Object} Routing table to assign ports to
+//
+// Assigns dynamic ports to the `routes` for runtime testing.
+//
+exports.assignPortsToRoutes = function (routes) {
+ Object.keys(routes).forEach(function (source) {
+ routes[source] = routes[source].replace('{PORT}', helpers.nextPort);
+ });
+
+ return routes;
+};
+
+//
+// ### function parseRoutes (options)
+// #### @options {Object} Options to use when parsing routes
+// #### @protocol {string} Protocol to use in the routes
+// #### @routes {Object} Routes to parse.
+//
+// Returns an Array of fully-parsed URLs for the source and
+// target of `options.routes`.
+//
+exports.parseRoutes = function (options) {
+ var protocol = options.protocol || 'http',
+ routes = options.routes;
+
+ return Object.keys(routes).map(function (source) {
+ return {
+ source: url.parse(protocol + '://' + source),
+ target: url.parse(protocol + '://' + routes[source])
+ };
+ });
+};
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/index.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/index.js
new file mode 100644
index 00000000..7e3c3f48
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/index.js
@@ -0,0 +1,105 @@
+/*
+ * index.js: Top level include for node-http-proxy helpers
+ *
+ * (C) 2010 Nodejitsu Inc.
+ * MIT LICENCE
+ *
+ */
+
+var fs = require('fs'),
+ path = require('path');
+
+var fixturesDir = path.join(__dirname, '..', 'fixtures');
+
+//
+// @https {Object}
+// Returns the necessary `https` credentials.
+//
+Object.defineProperty(exports, 'https', {
+ get: function () {
+ delete this.https;
+ return this.https = {
+ key: fs.readFileSync(path.join(fixturesDir, 'agent2-key.pem'), 'utf8'),
+ cert: fs.readFileSync(path.join(fixturesDir, 'agent2-cert.pem'), 'utf8')
+ };
+ }
+});
+
+//
+// @protocols {Object}
+// Returns an object representing the desired protocols
+// for the `proxy` and `target` server.
+//
+Object.defineProperty(exports, 'protocols', {
+ get: function () {
+ delete this.protocols;
+ return this.protocols = {
+ target: exports.argv.target || 'http',
+ proxy: exports.argv.proxy || 'http'
+ };
+ }
+});
+
+//
+// @nextPort {number}
+// Returns an auto-incrementing port for tests.
+//
+Object.defineProperty(exports, 'nextPort', {
+ get: function () {
+ var current = this.port || 9050;
+ this.port = current + 1;
+ return current;
+ }
+});
+
+//
+// @nextPortPair {Object}
+// Returns an auto-incrementing pair of ports for tests.
+//
+Object.defineProperty(exports, 'nextPortPair', {
+ get: function () {
+ return {
+ target: this.nextPort,
+ proxy: this.nextPort
+ };
+ }
+});
+
+//
+// ### function describe(prefix)
+// #### @prefix {string} Prefix to use before the description
+//
+// Returns a string representing the protocols that this suite
+// is testing based on CLI arguments.
+//
+exports.describe = function (prefix, base) {
+ prefix = prefix || '';
+ base = base || 'http';
+
+ function protocol(endpoint) {
+ return exports.protocols[endpoint] === 'https'
+ ? base + 's'
+ : base;
+ }
+
+ return [
+ 'node-http-proxy',
+ prefix,
+ [
+ protocol('proxy'),
+ '-to-',
+ protocol('target')
+ ].join('')
+ ].filter(Boolean).join('/');
+};
+
+//
+// Expose the CLI arguments
+//
+exports.argv = require('optimist').argv;
+
+//
+// Export additional helpers for `http` and `websockets`.
+//
+exports.http = require('./http');
+exports.ws = require('./ws'); \ No newline at end of file
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/ws.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/ws.js
new file mode 100644
index 00000000..a4905227
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/helpers/ws.js
@@ -0,0 +1,112 @@
+/*
+ * ws.js: Top level include for node-http-proxy websocket helpers
+ *
+ * (C) 2010 Nodejitsu Inc.
+ * MIT LICENCE
+ *
+ */
+
+var assert = require('assert'),
+ https = require('https'),
+ async = require('async'),
+ io = require('socket.io'),
+ ws = require('ws'),
+ helpers = require('./index'),
+ protocols = helpers.protocols,
+ http = require('./http');
+
+//
+// ### function createServerPair (options, callback)
+// #### @options {Object} Options to create target and proxy server.
+// #### @target {Object} Options for the target server.
+// #### @proxy {Object} Options for the proxy server.
+// #### @callback {function} Continuation to respond to when complete.
+//
+// Creates http target and proxy servers
+//
+exports.createServerPair = function (options, callback) {
+ async.series([
+ //
+ // 1. Create the target server
+ //
+ function createTarget(next) {
+ exports.createServer(options.target, next);
+ },
+ //
+ // 2. Create the proxy server
+ //
+ function createTarget(next) {
+ http.createProxyServer(options.proxy, next);
+ }
+ ], callback);
+};
+
+//
+// ### function createServer (options, callback)
+// #### @options {Object} Options for creating the socket.io or ws server.
+// #### @raw {boolean} Enables ws.Websocket server.
+//
+// Creates a socket.io or ws server using the specified `options`.
+//
+exports.createServer = function (options, callback) {
+ return options.raw
+ ? exports.createWsServer(options, callback)
+ : exports.createSocketIoServer(options, callback);
+};
+
+//
+// ### function createSocketIoServer (options, callback)
+// #### @options {Object} Options for creating the socket.io server
+// #### @port {number} Port to listen on
+// #### @input {string} Input to expect from the only socket
+// #### @output {string} Output to send the only socket
+//
+// Creates a socket.io server on the specified `options.port` which
+// will expect `options.input` and then send `options.output`.
+//
+exports.createSocketIoServer = function (options, callback) {
+ var server = protocols.target === 'https'
+ ? io.listen(options.port, helpers.https, callback)
+ : io.listen(options.port, callback);
+
+ server.sockets.on('connection', function (socket) {
+ socket.on('incoming', function (data) {
+ assert.equal(data, options.input);
+ socket.emit('outgoing', options.output);
+ });
+ });
+};
+
+//
+// ### function createWsServer (options, callback)
+// #### @options {Object} Options for creating the ws.Server instance
+// #### @port {number} Port to listen on
+// #### @input {string} Input to expect from the only socket
+// #### @output {string} Output to send the only socket
+//
+// Creates a ws.Server instance on the specified `options.port` which
+// will expect `options.input` and then send `options.output`.
+//
+exports.createWsServer = function (options, callback) {
+ var server,
+ wss;
+
+ if (protocols.target === 'https') {
+ server = https.createServer(helpers.https, function (req, res) {
+ req.writeHead(200);
+ req.end();
+ }).listen(options.port, callback);
+
+ wss = new ws.Server({ server: server });
+ }
+ else {
+ wss = new ws.Server({ port: options.port }, callback);
+ }
+
+ wss.on('connection', function (socket) {
+ socket.on('message', function (data) {
+ assert.equal(data, options.input);
+ socket.send(options.output);
+ });
+ });
+}; \ No newline at end of file
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/http/http-test.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/http/http-test.js
new file mode 100644
index 00000000..81f8726a
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/http/http-test.js
@@ -0,0 +1,102 @@
+/*
+ node-http-proxy-test.js: http proxy for node.js
+
+ Copyright (c) 2010 Charlie Robbins, Marak Squires and Fedor Indutny
+
+ 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.
+
+*/
+
+var assert = require('assert'),
+ fs = require('fs'),
+ path = require('path'),
+ async = require('async'),
+ request = require('request'),
+ vows = require('vows'),
+ macros = require('../macros'),
+ helpers = require('../helpers');
+
+var routeFile = path.join(__dirname, 'config.json');
+
+vows.describe(helpers.describe()).addBatch({
+ "With a valid target server": {
+ "and no latency": {
+ "and no headers": macros.http.assertProxied(),
+ "and headers": macros.http.assertProxied({
+ request: { headers: { host: 'unknown.com' } }
+ }),
+ "and request close connection header": macros.http.assertProxied({
+ request: { headers: { connection: "close" } },
+ outputHeaders: { connection: "close" }
+ }),
+ "and request keep alive connection header": macros.http.assertProxied({
+ request: { headers: { connection: "keep-alive" } },
+ outputHeaders: { connection: "keep-alive" }
+ }),
+ "and response close connection header": macros.http.assertProxied({
+ request: { headers: { connection: "" } }, // Must explicitly set to "" because otherwise node will automatically add a "connection: keep-alive" header
+ targetHeaders: { connection: "close" },
+ outputHeaders: { connection: "close" }
+ }),
+ "and response keep-alive connection header": macros.http.assertProxied({
+ request: { headers: { connection: "" } }, // Must explicitly set to "" because otherwise node will automatically add a "connection: keep-alive" header
+ targetHeaders: { connection: "keep-alive" },
+ outputHeaders: { connection: "keep-alive" }
+ }),
+ "and response keep-alive connection header from http 1.0 client": macros.http.assertRawHttpProxied({
+ rawRequest: "GET / HTTP/1.0\r\n\r\n",
+ targetHeaders: { connection: "keep-alive" },
+ match: /connection: close/i
+ }),
+ "and request keep alive from http 1.0 client": macros.http.assertRawHttpProxied({
+ rawRequest: "GET / HTTP/1.0\r\nConnection: Keep-Alive\r\n\r\n",
+ targetHeaders: { connection: "keep-alive" },
+ match: /connection: keep-alive/i
+ }),
+ "and no connection header": macros.http.assertProxied({
+ request: { headers: { connection: "" } }, // Must explicitly set to "" because otherwise node will automatically add a "connection: keep-alive" header
+ outputHeaders: { connection: "keep-alive" }
+ }),
+ "and forwarding enabled": macros.http.assertForwardProxied()
+ },
+ "and latency": {
+ "and no headers": macros.http.assertProxied({
+ latency: 2000
+ }),
+ "and response headers": macros.http.assertProxied({
+ targetHeaders: { "x-testheader": "target" },
+ proxyHeaders: { "X-TestHeader": "proxy" },
+ outputHeaders: { "x-testheader": "target" },
+ latency: 1000
+ })
+ },
+ "and timeout set": macros.http.assertProxied({
+ shouldFail: true,
+ timeout: 2000,
+ requestLatency: 4000
+ })
+ },
+ "With a no valid target server": {
+ "and no latency": macros.http.assertInvalidProxy(),
+ "and latency": macros.http.assertInvalidProxy({
+ latency: 2000
+ })
+ }
+}).export(module);
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/http/routing-table-test.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/http/routing-table-test.js
new file mode 100644
index 00000000..f3dcf31e
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/http/routing-table-test.js
@@ -0,0 +1,107 @@
+/*
+ * routing-table-test.js: Tests for the proxying using the ProxyTable object.
+ *
+ * (C) 2010, Charlie Robbins
+ *
+ */
+
+var assert = require('assert'),
+ fs = require('fs'),
+ path = require('path'),
+ async = require('async'),
+ request = require('request'),
+ vows = require('vows'),
+ macros = require('../macros'),
+ helpers = require('../helpers');
+
+var routeFile = path.join(__dirname, 'config.json');
+
+vows.describe(helpers.describe('routing-table')).addBatch({
+ "With a routing table": {
+ "with latency": macros.http.assertProxiedToRoutes({
+ latency: 2000,
+ routes: {
+ "icanhaz.com": "127.0.0.1:{PORT}",
+ "latency.com": "127.0.0.1:{PORT}"
+ }
+ }),
+ "addHost() / removeHost()": macros.http.assertDynamicProxy({
+ hostnameOnly: true,
+ routes: {
+ "static.com": "127.0.0.1:{PORT}",
+ "removed.com": "127.0.0.1:{PORT}"
+ }
+ }, {
+ add: [{ host: 'dynamic1.com', target: '127.0.0.1:' }],
+ drop: ['removed.com']
+ }),
+ "using RegExp": macros.http.assertProxiedToRoutes({
+ routes: {
+ "foo.com": "127.0.0.1:{PORT}",
+ "bar.com": "127.0.0.1:{PORT}",
+ "baz.com/taco": "127.0.0.1:{PORT}",
+ "pizza.com/taco/muffins": "127.0.0.1:{PORT}",
+ "blah.com/me": "127.0.0.1:{PORT}/remapped",
+ "bleh.com/remap/this": "127.0.0.1:{PORT}/remap/remapped",
+ "test.com/double/tap": "127.0.0.1:{PORT}/remap"
+ }
+ }),
+ "using hostnameOnly": macros.http.assertProxiedToRoutes({
+ hostnameOnly: true,
+ routes: {
+ "foo.com": "127.0.0.1:{PORT}",
+ "bar.com": "127.0.0.1:{PORT}"
+ }
+ }),
+ "using pathnameOnly": macros.http.assertProxiedToRoutes({
+ pathnameOnly: true,
+ routes: {
+ "/foo": "127.0.0.1:{PORT}",
+ "/bar": "127.0.0.1:{PORT}",
+ "/pizza": "127.0.0.1:{PORT}"
+ }
+ }),
+ "using a routing file": macros.http.assertProxiedToRoutes({
+ filename: routeFile,
+ routes: {
+ "foo.com": "127.0.0.1:{PORT}",
+ "bar.com": "127.0.0.1:{PORT}"
+ }
+ }, {
+ "after the file has been modified": {
+ topic: function () {
+ var config = JSON.parse(fs.readFileSync(routeFile, 'utf8')),
+ protocol = helpers.protocols.proxy,
+ port = helpers.nextPort,
+ that = this;
+
+ config.router['dynamic.com'] = "127.0.0.1:" + port;
+ fs.writeFileSync(routeFile, JSON.stringify(config));
+
+ async.parallel([
+ function waitForRoutes(next) {
+ that.proxyServer.on('routes', next);
+ },
+ async.apply(
+ helpers.http.createServer,
+ {
+ port: port,
+ output: 'hello from dynamic.com'
+ }
+ )
+ ], function () {
+ request({
+ uri: protocol + '://127.0.0.1:' + that.port,
+ headers: {
+ host: 'dynamic.com'
+ }
+ }, that.callback);
+ });
+ },
+ "should receive 'hello from dynamic.com'": function (err, res, body) {
+ assert.equal(body, 'hello from dynamic.com');
+ }
+ }
+ })
+ }
+}).export(module);
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/examples.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/examples.js
new file mode 100644
index 00000000..9d4202e6
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/examples.js
@@ -0,0 +1,101 @@
+/*
+ * examples.js: Macros for testing code in examples/
+ *
+ * (C) 2010 Nodejitsu Inc.
+ * MIT LICENCE
+ *
+ */
+
+var assert = require('assert'),
+ fs = require('fs'),
+ path = require('path'),
+ spawn = require('child_process').spawn,
+ async = require('async');
+
+var rootDir = path.join(__dirname, '..', '..'),
+ examplesDir = path.join(rootDir, 'examples');
+
+//
+// ### function shouldHaveDeps ()
+//
+// Ensures that all `npm` dependencies are installed in `/examples`.
+//
+exports.shouldHaveDeps = function () {
+ return {
+ "Before testing examples": {
+ topic: function () {
+ async.waterfall([
+ //
+ // 1. Read files in examples dir
+ //
+ async.apply(fs.readdir, examplesDir),
+ //
+ // 2. If node_modules exists, continue. Otherwise
+ // exec `npm` to install them
+ //
+ function checkNodeModules(files, next) {
+ if (files.indexOf('node_modules') !== -1) {
+ return next();
+ }
+
+ var child = spawn('npm', ['install', '-f'], {
+ cwd: examplesDir
+ });
+
+ child.on('exit', function (code) {
+ return code
+ ? next(new Error('npm install exited with non-zero exit code'))
+ : next();
+ });
+ },
+ //
+ // 3. Read files in examples dir again to ensure the install
+ // worked as expected.
+ //
+ async.apply(fs.readdir, examplesDir),
+ ], this.callback);
+ },
+ "examples/node_modules should exist": function (err, files) {
+ assert.notEqual(files.indexOf('node_modules'), -1);
+ }
+ }
+ }
+};
+
+//
+// ### function shouldRequire (file)
+// #### @file {string} File to attempt to require
+//
+// Returns a test which attempts to require `file`.
+//
+exports.shouldRequire = function (file) {
+ return {
+ "should have no errors": function () {
+ try { assert.isObject(require(file)) }
+ catch (ex) { assert.isNull(ex) }
+ }
+ };
+};
+
+//
+// ### function shouldHaveNoErrors ()
+//
+// Returns a vows context that attempts to require
+// every relevant example file in `examples`.
+//
+exports.shouldHaveNoErrors = function () {
+ var context = {};
+
+ ['balancer', 'http', 'middleware', 'websocket'].forEach(function (dir) {
+ var name = 'examples/' + dir,
+ files = fs.readdirSync(path.join(rootDir, 'examples', dir));
+
+ files.forEach(function (file) {
+ context[name + '/' + file] = exports.shouldRequire(path.join(
+ examplesDir, dir, file
+ ));
+ });
+ });
+
+ return context;
+}; \ No newline at end of file
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/http.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/http.js
new file mode 100644
index 00000000..d3d83426
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/http.js
@@ -0,0 +1,531 @@
+/*
+ * http.js: Macros for proxying HTTP requests
+ *
+ * (C) 2010 Nodejitsu Inc.
+ * MIT LICENCE
+ *
+ */
+
+var assert = require('assert'),
+ fs = require('fs'),
+ async = require('async'),
+ net = require('net'),
+ request = require('request'),
+ helpers = require('../helpers/index');
+
+//
+// ### function assertRequest (options)
+// #### @options {Object} Options for this request assertion.
+// #### @request {Object} Options to use for `request`.
+// #### @assert {Object} Test assertions against the response.
+//
+// Makes a request using `options.request` and then asserts the response
+// and body against anything in `options.assert`.
+//
+exports.assertRequest = function (options) {
+ return {
+ topic: function () {
+ //
+ // Now make the HTTP request and assert.
+ //
+ options.request.rejectUnauthorized = false;
+ request(options.request, this.callback);
+ },
+ "should succeed": function (err, res, body) {
+ assert.isNull(err);
+ if (options.assert.headers) {
+ Object.keys(options.assert.headers).forEach(function(header){
+ assert.equal(res.headers[header], options.assert.headers[header]);
+ });
+ }
+
+ if (options.assert.body) {
+ assert.equal(body, options.assert.body);
+ }
+
+ if (options.assert.statusCode) {
+ assert.equal(res.statusCode, options.assert.statusCode);
+ }
+ }
+ };
+};
+
+//
+// ### function assertFailedRequest (options)
+// #### @options {Object} Options for this failed request assertion.
+// #### @request {Object} Options to use for `request`.
+// #### @assert {Object} Test assertions against the response.
+//
+// Makes a request using `options.request` and then asserts the response
+// and body against anything in `options.assert`.
+//
+exports.assertFailedRequest = function (options) {
+ return {
+ topic: function () {
+ //
+ // Now make the HTTP request and assert.
+ //
+ options.request.rejectUnauthorized = false;
+ request(options.request, this.callback);
+ },
+ "should not succeed": function (err, res, body) {
+ assert.notStrictEqual(err,null);
+ }
+ };
+};
+
+//
+// ### function assertProxied (options)
+// #### @options {Object} Options for this test
+// #### @latency {number} Latency in milliseconds for the proxy server.
+// #### @ports {Object} Ports for the request (target, proxy).
+// #### @output {string} Output to assert from.
+// #### @forward {Object} Options for forward proxying.
+//
+// Creates a complete end-to-end test for requesting against an
+// http proxy.
+//
+exports.assertProxied = function (options) {
+ options = options || {};
+
+ var ports = options.ports || helpers.nextPortPair,
+ output = options.output || 'hello world from ' + ports.target,
+ outputHeaders = options.outputHeaders,
+ targetHeaders = options.targetHeaders,
+ proxyHeaders = options.proxyHeaders,
+ protocol = helpers.protocols.proxy,
+ req = options.request || {},
+ timeout = options.timeout || null,
+ assertFn = options.shouldFail
+ ? exports.assertFailedRequest
+ : exports.assertRequest;
+
+ req.uri = req.uri || protocol + '://127.0.0.1:' + ports.proxy;
+
+ return {
+ topic: function () {
+ //
+ // Create a target server and a proxy server
+ // using the `options` supplied.
+ //
+ helpers.http.createServerPair({
+ target: {
+ output: output,
+ outputHeaders: targetHeaders,
+ port: ports.target,
+ headers: req.headers,
+ latency: options.requestLatency
+ },
+ proxy: {
+ latency: options.latency,
+ port: ports.proxy,
+ outputHeaders: proxyHeaders,
+ proxy: {
+ forward: options.forward,
+ target: {
+ https: helpers.protocols.target === 'https',
+ host: '127.0.0.1',
+ port: ports.target
+ },
+ timeout: timeout
+ }
+ }
+ }, this.callback);
+ },
+ "the proxy request": assertFn({
+ request: req,
+ assert: {
+ headers: outputHeaders,
+ body: output
+ }
+ })
+ };
+};
+
+//
+// ### function assertRawHttpProxied (options)
+// #### @options {Object} Options for this test
+// #### @rawRequest {string} Raw HTTP request to perform.
+// #### @match {RegExp} Output to match in the response.
+// #### @latency {number} Latency in milliseconds for the proxy server.
+// #### @ports {Object} Ports for the request (target, proxy).
+// #### @output {string} Output to assert from.
+// #### @forward {Object} Options for forward proxying.
+//
+// Creates a complete end-to-end test for requesting against an
+// http proxy.
+//
+exports.assertRawHttpProxied = function (options) {
+ // Don't test raw requests over HTTPS since options.rawRequest won't be
+ // encrypted.
+ if(helpers.protocols.proxy == 'https') {
+ return true;
+ }
+
+ options = options || {};
+
+ var ports = options.ports || helpers.nextPortPair,
+ output = options.output || 'hello world from ' + ports.target,
+ outputHeaders = options.outputHeaders,
+ targetHeaders = options.targetHeaders,
+ proxyHeaders = options.proxyHeaders,
+ protocol = helpers.protocols.proxy,
+ timeout = options.timeout || null,
+ assertFn = options.shouldFail
+ ? exports.assertFailedRequest
+ : exports.assertRequest;
+
+ return {
+ topic: function () {
+ var topicCallback = this.callback;
+
+ //
+ // Create a target server and a proxy server
+ // using the `options` supplied.
+ //
+ helpers.http.createServerPair({
+ target: {
+ output: output,
+ outputHeaders: targetHeaders,
+ port: ports.target,
+ latency: options.requestLatency
+ },
+ proxy: {
+ latency: options.latency,
+ port: ports.proxy,
+ outputHeaders: proxyHeaders,
+ proxy: {
+ forward: options.forward,
+ target: {
+ https: helpers.protocols.target === 'https',
+ host: '127.0.0.1',
+ port: ports.target
+ },
+ timeout: timeout
+ }
+ }
+ }, function() {
+ var response = '';
+ var client = net.connect(ports.proxy, '127.0.0.1', function() {
+ client.write(options.rawRequest);
+ });
+
+ client.on('data', function(data) {
+ response += data.toString();
+ });
+
+ client.on('end', function() {
+ topicCallback(null, options.match, response);
+ });
+ });
+ },
+ "should succeed": function(err, match, response) {
+ assert.match(response, match);
+ }
+ };
+};
+
+//
+// ### function assertInvalidProxy (options)
+// #### @options {Object} Options for this test
+// #### @latency {number} Latency in milliseconds for the proxy server
+// #### @ports {Object} Ports for the request (target, proxy)
+//
+// Creates a complete end-to-end test for requesting against an
+// http proxy with no target server.
+//
+exports.assertInvalidProxy = function (options) {
+ options = options || {};
+
+ var ports = options.ports || helpers.nextPortPair,
+ req = options.request || {},
+ protocol = helpers.protocols.proxy;
+
+
+ req.uri = req.uri || protocol + '://127.0.0.1:' + ports.proxy;
+
+ return {
+ topic: function () {
+ //
+ // Only create the proxy server, simulating a reverse-proxy
+ // to an invalid location.
+ //
+ helpers.http.createProxyServer({
+ latency: options.latency,
+ port: ports.proxy,
+ proxy: {
+ target: {
+ host: '127.0.0.1',
+ port: ports.target
+ }
+ }
+ }, this.callback);
+ },
+ "the proxy request": exports.assertRequest({
+ request: req,
+ assert: {
+ statusCode: 500
+ }
+ })
+ };
+};
+
+//
+// ### function assertForwardProxied (options)
+// #### @options {Object} Options for this test.
+//
+// Creates a complete end-to-end test for requesting against an
+// http proxy with both a valid and invalid forward target.
+//
+exports.assertForwardProxied = function (options) {
+ var forwardPort = helpers.nextPort;
+
+ return {
+ topic: function () {
+ helpers.http.createServer({
+ output: 'hello from forward',
+ port: forwardPort
+ }, this.callback);
+ },
+ "and a valid forward target": exports.assertProxied({
+ forward: {
+ port: forwardPort,
+ host: '127.0.0.1'
+ }
+ }),
+ "and an invalid forward target": exports.assertProxied({
+ forward: {
+ port: 9898,
+ host: '127.0.0.1'
+ }
+ })
+ };
+};
+
+//
+// ### function assertProxiedtoRoutes (options, nested)
+// #### @options {Object} Options for this ProxyTable-based test
+// #### @routes {Object|string} Routes to use for the proxy.
+// #### @hostnameOnly {boolean} Enables hostnameOnly routing.
+// #### @nested {Object} Nested vows to add to the returned context.
+//
+// Creates a complete end-to-end test for requesting against an
+// http proxy using `options.routes`:
+//
+// 1. Creates target servers for all routes in `options.routes.`
+// 2. Creates a proxy server.
+// 3. Ensure requests to the proxy server for all route targets
+// returns the unique expected output.
+//
+exports.assertProxiedToRoutes = function (options, nested) {
+ //
+ // Assign dynamic ports to the routes to use.
+ //
+ options.routes = helpers.http.assignPortsToRoutes(options.routes);
+
+ //
+ // Parse locations from routes for making assertion requests.
+ //
+ var locations = helpers.http.parseRoutes(options),
+ port = options.pport || helpers.nextPort,
+ protocol = helpers.protocols.proxy,
+ context,
+ proxy;
+
+ if (options.filename) {
+ //
+ // If we've been passed a filename write the routes to it
+ // and setup the proxy options to use that file.
+ //
+ fs.writeFileSync(options.filename, JSON.stringify({ router: options.routes }));
+ proxy = { router: options.filename };
+ }
+ else {
+ //
+ // Otherwise just use the routes themselves.
+ //
+ proxy = {
+ hostnameOnly: options.hostnameOnly,
+ pathnameOnly: options.pathnameOnly,
+ router: options.routes
+ };
+ }
+
+ //
+ // Set the https options if necessary
+ //
+ if (helpers.protocols.target === 'https') {
+ proxy.target = { https: true };
+ }
+
+ //
+ // Create the test context which creates all target
+ // servers for all routes and a proxy server.
+ //
+ context = {
+ topic: function () {
+ var that = this;
+
+ async.waterfall([
+ //
+ // 1. Create all the target servers
+ //
+ async.apply(
+ async.forEach,
+ locations,
+ function createRouteTarget(location, next) {
+ helpers.http.createServer({
+ port: location.target.port,
+ output: 'hello from ' + location.source.href
+ }, next);
+ }
+ ),
+ //
+ // 2. Create the proxy server
+ //
+ async.apply(
+ helpers.http.createProxyServer,
+ {
+ port: port,
+ latency: options.latency,
+ routing: true,
+ proxy: proxy
+ }
+ )
+ ], function (_, server) {
+ //
+ // 3. Set the proxy server for later use
+ //
+ that.proxyServer = server;
+ that.callback();
+ });
+
+ //
+ // 4. Assign the port to the context for later use
+ //
+ this.port = port;
+ },
+ //
+ // Add an extra assertion to a route which
+ // should respond with 404
+ //
+ "a request to unknown.com": exports.assertRequest({
+ assert: { statusCode: 404 },
+ request: {
+ uri: protocol + '://127.0.0.1:' + port,
+ headers: {
+ host: 'unknown.com'
+ }
+ }
+ })
+ };
+
+ //
+ // Add test assertions for each of the route locations.
+ //
+ locations.forEach(function (location) {
+ context[location.source.href] = exports.assertRequest({
+ request: {
+ uri: protocol + '://127.0.0.1:' + port + location.source.path,
+ headers: {
+ host: location.source.hostname
+ }
+ },
+ assert: {
+ body: 'hello from ' + location.source.href
+ }
+ });
+ });
+
+ //
+ // If there are any nested vows to add to the context
+ // add them before returning the full context.
+ //
+ if (nested) {
+ Object.keys(nested).forEach(function (key) {
+ context[key] = nested[key];
+ });
+ }
+
+ return context;
+};
+
+//
+// ### function assertDynamicProxy (static, dynamic)
+// Asserts that after the `static` routes have been tested
+// and the `dynamic` routes are added / removed the appropriate
+// proxy responses are received.
+//
+exports.assertDynamicProxy = function (static, dynamic) {
+ var proxyPort = helpers.nextPort,
+ protocol = helpers.protocols.proxy,
+ context;
+
+ if (dynamic.add) {
+ dynamic.add = dynamic.add.map(function (dyn) {
+ dyn.port = helpers.nextPort;
+ dyn.target = dyn.target + dyn.port;
+ return dyn;
+ });
+ }
+
+ context = {
+ topic: function () {
+ var that = this;
+
+ setTimeout(function () {
+ if (dynamic.drop) {
+ dynamic.drop.forEach(function (dropHost) {
+ that.proxyServer.proxy.removeHost(dropHost);
+ });
+ }
+
+ if (dynamic.add) {
+ async.forEachSeries(dynamic.add, function addOne (dyn, next) {
+ that.proxyServer.proxy.addHost(dyn.host, dyn.target);
+ helpers.http.createServer({
+ port: dyn.port,
+ output: 'hello ' + dyn.host
+ }, next);
+ }, that.callback);
+ }
+ else {
+ that.callback();
+ }
+ }, 200);
+ }
+ };
+
+ if (dynamic.drop) {
+ dynamic.drop.forEach(function (dropHost) {
+ context[dropHost] = exports.assertRequest({
+ assert: { statusCode: 404 },
+ request: {
+ uri: protocol + '://127.0.0.1:' + proxyPort,
+ headers: {
+ host: dropHost
+ }
+ }
+ });
+ });
+ }
+
+ if (dynamic.add) {
+ dynamic.add.forEach(function (dyn) {
+ context[dyn.host] = exports.assertRequest({
+ assert: { body: 'hello ' + dyn.host },
+ request: {
+ uri: protocol + '://127.0.0.1:' + proxyPort,
+ headers: {
+ host: dyn.host
+ }
+ }
+ });
+ });
+ }
+
+ static.pport = proxyPort;
+ return exports.assertProxiedToRoutes(static, {
+ "once the server has started": context
+ });
+};
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/index.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/index.js
new file mode 100644
index 00000000..c01f962b
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/index.js
@@ -0,0 +1,11 @@
+/*
+ * index.js: Top level include for node-http-proxy macros
+ *
+ * (C) 2010 Nodejitsu Inc.
+ * MIT LICENCE
+ *
+ */
+
+exports.examples = require('./examples');
+exports.http = require('./http');
+exports.ws = require('./ws'); \ No newline at end of file
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/ws.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/ws.js
new file mode 100644
index 00000000..508725a4
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/macros/ws.js
@@ -0,0 +1,232 @@
+/*
+ * ws.js: Macros for proxying Websocket requests
+ *
+ * (C) 2010 Nodejitsu Inc.
+ * MIT LICENCE
+ *
+ */
+
+var assert = require('assert'),
+ fs = require('fs'),
+ async = require('async'),
+ io = require('socket.io-client'),
+ WebSocket = require('ws'),
+ helpers = require('../helpers/index');
+
+//
+// ### function assertSendRecieve (options)
+// #### @options {Object} Options for creating this assertion.
+// #### @raw {boolean} Enables raw `ws.WebSocket`.
+// #### @uri {string} URI of the proxy server.
+// #### @input {string} Input to assert sent to the target ws server.
+// #### @output {string} Output to assert from the taget ws server.
+//
+// Creates a `socket.io` or raw `WebSocket` connection and asserts that
+// `options.input` is sent to and `options.output` is received from the
+// connection.
+//
+exports.assertSendReceive = function (options) {
+ if (!options.raw) {
+ return {
+ topic: function () {
+ var socket = io.connect(options.uri);
+ socket.on('outgoing', this.callback.bind(this, null));
+ socket.emit('incoming', options.input);
+ },
+ "should send input and receive output": function (_, data) {
+ assert.equal(data, options.output);
+ }
+ };
+ }
+
+ return {
+ topic: function () {
+ var socket = new WebSocket(options.uri);
+ socket.on('message', this.callback.bind(this, null));
+ socket.on('open', function () {
+ socket.send(options.input);
+ });
+ },
+ "should send input and recieve output": function (_, data, flags) {
+ assert.equal(data, options.output);
+ }
+ };
+};
+
+//
+// ### function assertProxied (options)
+// #### @options {Object} Options for this test
+// #### @latency {number} Latency in milliseconds for the proxy server.
+// #### @ports {Object} Ports for the request (target, proxy).
+// #### @input {string} Input to assert sent to the target ws server.
+// #### @output {string} Output to assert from the taget ws server.
+// #### @raw {boolean} Enables raw `ws.Server` usage.
+//
+// Creates a complete end-to-end test for requesting against an
+// http proxy.
+//
+exports.assertProxied = function (options) {
+ options = options || {};
+
+ var ports = options.ports || helpers.nextPortPair,
+ input = options.input || 'hello world to ' + ports.target,
+ output = options.output || 'hello world from ' + ports.target,
+ protocol = helpers.protocols.proxy;
+
+ if (options.raw) {
+ protocol = helpers.protocols.proxy === 'https'
+ ? 'wss'
+ : 'ws';
+ }
+
+ return {
+ topic: function () {
+ helpers.ws.createServerPair({
+ target: {
+ input: input,
+ output: output,
+ port: ports.target,
+ raw: options.raw
+ },
+ proxy: {
+ latency: options.latency,
+ port: ports.proxy,
+ proxy: {
+ target: {
+ https: helpers.protocols.target === 'https',
+ host: '127.0.0.1',
+ port: ports.target
+ }
+ }
+ }
+ }, this.callback);
+ },
+ "the proxy Websocket connection": exports.assertSendReceive({
+ uri: protocol + '://127.0.0.1:' + ports.proxy,
+ input: input,
+ output: output,
+ raw: options.raw
+ })
+ };
+};
+
+//
+// ### function assertProxiedtoRoutes (options, nested)
+// #### @options {Object} Options for this ProxyTable-based test
+// #### @raw {boolean} Enables ws.Server usage.
+// #### @routes {Object|string} Routes to use for the proxy.
+// #### @hostnameOnly {boolean} Enables hostnameOnly routing.
+// #### @nested {Object} Nested vows to add to the returned context.
+//
+// Creates a complete end-to-end test for requesting against an
+// http proxy using `options.routes`:
+//
+// 1. Creates target servers for all routes in `options.routes.`
+// 2. Creates a proxy server.
+// 3. Ensure Websocket connections to the proxy server for all route targets
+// can send input and recieve output.
+//
+exports.assertProxiedToRoutes = function (options, nested) {
+ //
+ // Assign dynamic ports to the routes to use.
+ //
+ options.routes = helpers.http.assignPortsToRoutes(options.routes);
+
+ //
+ // Parse locations from routes for making assertion requests.
+ //
+ var locations = helpers.http.parseRoutes(options),
+ protocol = helpers.protocols.proxy,
+ port = helpers.nextPort,
+ context,
+ proxy;
+
+ if (options.raw) {
+ protocol = helpers.protocols.proxy === 'https'
+ ? 'wss'
+ : 'ws';
+ }
+
+ if (options.filename) {
+ //
+ // If we've been passed a filename write the routes to it
+ // and setup the proxy options to use that file.
+ //
+ fs.writeFileSync(options.filename, JSON.stringify({ router: options.routes }));
+ proxy = { router: options.filename };
+ }
+ else {
+ //
+ // Otherwise just use the routes themselves.
+ //
+ proxy = {
+ hostnameOnly: options.hostnameOnly,
+ router: options.routes
+ };
+ }
+
+ //
+ // Create the test context which creates all target
+ // servers for all routes and a proxy server.
+ //
+ context = {
+ topic: function () {
+ var that = this;
+
+ async.waterfall([
+ //
+ // 1. Create all the target servers
+ //
+ async.apply(
+ async.forEach,
+ locations,
+ function createRouteTarget(location, next) {
+ helpers.ws.createServer({
+ raw: options.raw,
+ port: location.target.port,
+ output: 'hello from ' + location.source.href,
+ input: 'hello to ' + location.source.href
+ }, next);
+ }
+ ),
+ //
+ // 2. Create the proxy server
+ //
+ async.apply(
+ helpers.http.createProxyServer,
+ {
+ port: port,
+ latency: options.latency,
+ routing: true,
+ proxy: proxy
+ }
+ )
+ ], function (_, server) {
+ //
+ // 3. Set the proxy server for later use
+ //
+ that.proxyServer = server;
+ that.callback();
+ });
+
+ //
+ // 4. Assign the port to the context for later use
+ //
+ this.port = port;
+ }
+ };
+
+ //
+ // Add test assertions for each of the route locations.
+ //
+ locations.forEach(function (location) {
+ context[location.source.href] = exports.assertSendRecieve({
+ uri: protocol + '://127.0.0.1:' + port + location.source.path,
+ output: 'hello from ' + location.source.href,
+ input: 'hello to ' + location.source.href,
+ raw: options.raw
+ });
+ });
+
+ return context;
+}; \ No newline at end of file
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/routing-table-test.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/routing-table-test.js
new file mode 100644
index 00000000..e04d6475
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/routing-table-test.js
@@ -0,0 +1,25 @@
+/*
+ * routing-tabletest.js: Test for proxying `socket.io` and raw `WebSocket` requests using a ProxyTable.
+ *
+ * (C) 2010 Nodejitsu Inc.
+ * MIT LICENCE
+ *
+ */
+
+var vows = require('vows'),
+ macros = require('../macros'),
+ helpers = require('../helpers/index');
+
+vows.describe(helpers.describe('routing-proxy', 'ws')).addBatch({
+ "With a valid target server": {
+ "and no latency": {
+ "using ws": macros.ws.assertProxied(),
+ "using socket.io": macros.ws.assertProxied({
+ raw: true
+ }),
+ },
+ // "and latency": macros.websocket.assertProxied({
+ // latency: 2000
+ // })
+ }
+}).export(module); \ No newline at end of file
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/socket.io-test.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/socket.io-test.js
new file mode 100644
index 00000000..d833109e
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/socket.io-test.js
@@ -0,0 +1,20 @@
+/*
+ * socket.io-test.js: Test for proxying `socket.io` requests.
+ *
+ * (C) 2010 Nodejitsu Inc.
+ * MIT LICENCE
+ *
+ */
+
+var vows = require('vows'),
+ macros = require('../macros'),
+ helpers = require('../helpers/index');
+
+vows.describe(helpers.describe('socket.io', 'ws')).addBatch({
+ "With a valid target server": {
+ "and no latency": macros.ws.assertProxied(),
+ // "and latency": macros.ws.assertProxied({
+ // latency: 2000
+ // })
+ }
+}).export(module); \ No newline at end of file
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/ws-test.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/ws-test.js
new file mode 100644
index 00000000..f3549152
--- /dev/null
+++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/test/ws/ws-test.js
@@ -0,0 +1,23 @@
+/*
+ * ws-test.js: Tests for proxying raw Websocket requests.
+ *
+ * (C) 2010 Nodejitsu Inc.
+ * MIT LICENCE
+ *
+ */
+
+var vows = require('vows'),
+ macros = require('../macros'),
+ helpers = require('../helpers/index');
+
+vows.describe(helpers.describe('websocket', 'ws')).addBatch({
+ "With a valid target server": {
+ "and no latency": macros.ws.assertProxied({
+ raw: true
+ }),
+ // "and latency": macros.ws.assertProxied({
+ // raw: true,
+ // latency: 2000
+ // })
+ }
+}).export(module); \ No newline at end of file