11cb0ef41Sopenharmony_ci'use strict';
21cb0ef41Sopenharmony_ci
31cb0ef41Sopenharmony_ciconst common = require('../common');
41cb0ef41Sopenharmony_ciif (!common.hasCrypto)
51cb0ef41Sopenharmony_ci  common.skip('missing crypto');
61cb0ef41Sopenharmony_ciconst assert = require('assert');
71cb0ef41Sopenharmony_ciconst h2 = require('http2');
81cb0ef41Sopenharmony_ci
91cb0ef41Sopenharmony_ci// Tests behavior of the proxied socket in Http2ServerRequest
101cb0ef41Sopenharmony_ci// & Http2ServerResponse - specifically property setters
111cb0ef41Sopenharmony_ci
121cb0ef41Sopenharmony_ciconst errMsg = {
131cb0ef41Sopenharmony_ci  code: 'ERR_HTTP2_NO_SOCKET_MANIPULATION',
141cb0ef41Sopenharmony_ci  name: 'Error',
151cb0ef41Sopenharmony_ci  message: 'HTTP/2 sockets should not be directly manipulated ' +
161cb0ef41Sopenharmony_ci           '(e.g. read and written)'
171cb0ef41Sopenharmony_ci};
181cb0ef41Sopenharmony_ci
191cb0ef41Sopenharmony_ciconst server = h2.createServer();
201cb0ef41Sopenharmony_ci
211cb0ef41Sopenharmony_ciserver.on('request', common.mustCall(function(request, response) {
221cb0ef41Sopenharmony_ci  const noop = () => {};
231cb0ef41Sopenharmony_ci
241cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.destroyed, false);
251cb0ef41Sopenharmony_ci  request.socket.destroyed = true;
261cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.destroyed, true);
271cb0ef41Sopenharmony_ci  request.socket.destroyed = false;
281cb0ef41Sopenharmony_ci
291cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.readable, true);
301cb0ef41Sopenharmony_ci  request.socket.readable = false;
311cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.readable, false);
321cb0ef41Sopenharmony_ci
331cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.writable, true);
341cb0ef41Sopenharmony_ci  request.socket.writable = false;
351cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.writable, false);
361cb0ef41Sopenharmony_ci
371cb0ef41Sopenharmony_ci  const realOn = request.stream.on;
381cb0ef41Sopenharmony_ci  request.socket.on = noop;
391cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.on, noop);
401cb0ef41Sopenharmony_ci  request.stream.on = realOn;
411cb0ef41Sopenharmony_ci
421cb0ef41Sopenharmony_ci  const realOnce = request.stream.once;
431cb0ef41Sopenharmony_ci  request.socket.once = noop;
441cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.once, noop);
451cb0ef41Sopenharmony_ci  request.stream.once = realOnce;
461cb0ef41Sopenharmony_ci
471cb0ef41Sopenharmony_ci  const realEnd = request.stream.end;
481cb0ef41Sopenharmony_ci  request.socket.end = noop;
491cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.end, noop);
501cb0ef41Sopenharmony_ci  request.socket.end = common.mustCall();
511cb0ef41Sopenharmony_ci  request.socket.end();
521cb0ef41Sopenharmony_ci  request.stream.end = realEnd;
531cb0ef41Sopenharmony_ci
541cb0ef41Sopenharmony_ci  const realEmit = request.stream.emit;
551cb0ef41Sopenharmony_ci  request.socket.emit = noop;
561cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.emit, noop);
571cb0ef41Sopenharmony_ci  request.stream.emit = realEmit;
581cb0ef41Sopenharmony_ci
591cb0ef41Sopenharmony_ci  const realDestroy = request.stream.destroy;
601cb0ef41Sopenharmony_ci  request.socket.destroy = noop;
611cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.destroy, noop);
621cb0ef41Sopenharmony_ci  request.stream.destroy = realDestroy;
631cb0ef41Sopenharmony_ci
641cb0ef41Sopenharmony_ci  request.socket.setTimeout = noop;
651cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.session.setTimeout, noop);
661cb0ef41Sopenharmony_ci
671cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.session.socket._isProcessing, undefined);
681cb0ef41Sopenharmony_ci  request.socket._isProcessing = true;
691cb0ef41Sopenharmony_ci  assert.strictEqual(request.stream.session.socket._isProcessing, true);
701cb0ef41Sopenharmony_ci
711cb0ef41Sopenharmony_ci  assert.throws(() => request.socket.read = noop, errMsg);
721cb0ef41Sopenharmony_ci  assert.throws(() => request.socket.write = noop, errMsg);
731cb0ef41Sopenharmony_ci  assert.throws(() => request.socket.pause = noop, errMsg);
741cb0ef41Sopenharmony_ci  assert.throws(() => request.socket.resume = noop, errMsg);
751cb0ef41Sopenharmony_ci
761cb0ef41Sopenharmony_ci  response.stream.destroy();
771cb0ef41Sopenharmony_ci}));
781cb0ef41Sopenharmony_ci
791cb0ef41Sopenharmony_ciserver.listen(0, common.mustCall(function() {
801cb0ef41Sopenharmony_ci  const port = server.address().port;
811cb0ef41Sopenharmony_ci  const url = `http://localhost:${port}`;
821cb0ef41Sopenharmony_ci  const client = h2.connect(url, common.mustCall(function() {
831cb0ef41Sopenharmony_ci    const headers = {
841cb0ef41Sopenharmony_ci      ':path': '/',
851cb0ef41Sopenharmony_ci      ':method': 'GET',
861cb0ef41Sopenharmony_ci      ':scheme': 'http',
871cb0ef41Sopenharmony_ci      ':authority': `localhost:${port}`
881cb0ef41Sopenharmony_ci    };
891cb0ef41Sopenharmony_ci    const request = client.request(headers);
901cb0ef41Sopenharmony_ci    request.on('end', common.mustCall(() => {
911cb0ef41Sopenharmony_ci      client.close();
921cb0ef41Sopenharmony_ci      server.close();
931cb0ef41Sopenharmony_ci    }));
941cb0ef41Sopenharmony_ci    request.end();
951cb0ef41Sopenharmony_ci    request.resume();
961cb0ef41Sopenharmony_ci  }));
971cb0ef41Sopenharmony_ci}));
98