aboutsummaryrefslogtreecommitdiff
path: root/test/parallel/test-http2-compat-socket-set.js
diff options
context:
space:
mode:
authorAnatoli Papirovski <apapirovski@mac.com>2017-10-02 21:56:53 -0400
committerMatteo Collina <hello@matteocollina.com>2017-10-06 14:04:22 -0700
commit2da7d9b8207d9c35d199734da75fa2bb15f326b6 (patch)
tree9aa1ed51d29bc3d9241539e9ded4d0e4da951970 /test/parallel/test-http2-compat-socket-set.js
parent4f339b54e9cd8a2cb69b41d87832ad8ca3a6b5e2 (diff)
downloadandroid-node-v8-2da7d9b8207d9c35d199734da75fa2bb15f326b6.tar.gz
android-node-v8-2da7d9b8207d9c35d199734da75fa2bb15f326b6.tar.bz2
android-node-v8-2da7d9b8207d9c35d199734da75fa2bb15f326b6.zip
http2: near full http1 compatibility, add tests
Extensive re-work of http1 compatibility layer based on tests in express, on-finished and finalhandler. Fix handling of HEAD method to match http1. Adjust write, end, etc. to call writeHead as in http1 and as expected by user-land modules. Add socket proxy that instead uses the Http2Stream for the vast majority of socket interactions. Add and change tests to closer represent http1 behaviour. Refs: https://github.com/nodejs/node/pull/15633 Refs: https://github.com/expressjs/express/tree/master/test Refs: https://github.com/jshttp/on-finished/blob/master/test/test.js Refs: https://github.com/pillarjs/finalhandler/blob/master/test/test.js PR-URL: https://github.com/nodejs/node/pull/15702 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Diffstat (limited to 'test/parallel/test-http2-compat-socket-set.js')
-rw-r--r--test/parallel/test-http2-compat-socket-set.js107
1 files changed, 107 insertions, 0 deletions
diff --git a/test/parallel/test-http2-compat-socket-set.js b/test/parallel/test-http2-compat-socket-set.js
new file mode 100644
index 0000000000..7411fef602
--- /dev/null
+++ b/test/parallel/test-http2-compat-socket-set.js
@@ -0,0 +1,107 @@
+'use strict';
+
+const common = require('../common');
+if (!common.hasCrypto)
+ common.skip('missing crypto');
+const assert = require('assert');
+const h2 = require('http2');
+
+// Tests behaviour of the proxied socket in Http2ServerRequest
+// & Http2ServerResponse - specifically property setters
+
+const errMsg = {
+ code: 'ERR_HTTP2_NO_SOCKET_MANIPULATION',
+ type: Error,
+ message: 'HTTP/2 sockets should not be directly read from, written to, ' +
+ 'paused and/or resumed.'
+};
+
+const server = h2.createServer();
+
+server.on('request', common.mustCall(function(request, response) {
+ const noop = () => {};
+
+ assert.strictEqual(request.stream.destroyed, false);
+ request.socket.destroyed = true;
+ assert.strictEqual(request.stream.destroyed, true);
+ request.socket.destroyed = false;
+
+ assert.strictEqual(request.stream.readable, false);
+ request.socket.readable = true;
+ assert.strictEqual(request.stream.readable, true);
+
+ assert.strictEqual(request.stream.writable, true);
+ request.socket.writable = false;
+ assert.strictEqual(request.stream.writable, false);
+
+ const realOn = request.stream.on;
+ request.socket.on = noop;
+ assert.strictEqual(request.stream.on, noop);
+ request.stream.on = realOn;
+
+ const realOnce = request.stream.once;
+ request.socket.once = noop;
+ assert.strictEqual(request.stream.once, noop);
+ request.stream.once = realOnce;
+
+ const realEnd = request.stream.end;
+ request.socket.end = noop;
+ assert.strictEqual(request.stream.end, noop);
+ request.socket.end = common.mustCall();
+ request.socket.end();
+ request.stream.end = realEnd;
+
+ const realEmit = request.stream.emit;
+ request.socket.emit = noop;
+ assert.strictEqual(request.stream.emit, noop);
+ request.stream.emit = realEmit;
+
+ const realDestroy = request.stream.destroy;
+ request.socket.destroy = noop;
+ assert.strictEqual(request.stream.destroy, noop);
+ request.stream.destroy = realDestroy;
+
+ request.socket.setTimeout = noop;
+ assert.strictEqual(request.stream.session.setTimeout, noop);
+
+ assert.strictEqual(request.stream.session.socket._isProcessing, undefined);
+ request.socket._isProcessing = true;
+ assert.strictEqual(request.stream.session.socket._isProcessing, true);
+
+ common.expectsError(() => request.socket.read = noop, errMsg);
+ common.expectsError(() => request.socket.write = noop, errMsg);
+ common.expectsError(() => request.socket.pause = noop, errMsg);
+ common.expectsError(() => request.socket.resume = noop, errMsg);
+
+ request.stream.on('finish', common.mustCall(() => {
+ setImmediate(() => {
+ request.socket.setTimeout = noop;
+ assert.strictEqual(request.stream.setTimeout, noop);
+
+ assert.strictEqual(request.stream._isProcessing, undefined);
+ request.socket._isProcessing = true;
+ assert.strictEqual(request.stream._isProcessing, true);
+ });
+ }));
+ response.stream.destroy();
+}));
+
+server.listen(0, common.mustCall(function() {
+ const port = server.address().port;
+ const url = `http://localhost:${port}`;
+ const client = h2.connect(url, common.mustCall(function() {
+ const headers = {
+ ':path': '/',
+ ':method': 'GET',
+ ':scheme': 'http',
+ ':authority': `localhost:${port}`
+ };
+ const request = client.request(headers);
+ request.on('end', common.mustCall(() => {
+ client.destroy();
+ server.close();
+ }));
+ request.end();
+ request.resume();
+ }));
+}));