'use strict'; const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); const assert = require('assert'); const net = require('net'); const http = require('http'); const http2 = require('http2'); // Example test for HTTP/1 vs HTTP/2 protocol autoselection. // Refs: https://github.com/nodejs/node/issues/34532 const h1Server = http.createServer(common.mustCall((req, res) => { res.end('HTTP/1 Response'); })); const h2Server = http2.createServer(common.mustCall((req, res) => { res.end('HTTP/2 Response'); })); const rawServer = net.createServer(common.mustCall(function listener(socket) { const data = socket.read(3); if (!data) { // Repeat until data is available socket.once('readable', () => listener(socket)); return; } // Put the data back, so the real server can handle it: socket.unshift(data); if (data.toString('ascii') === 'PRI') { // Very dumb preface check h2Server.emit('connection', socket); } else { h1Server.emit('connection', socket); } }, 2)); rawServer.listen(common.mustCall(() => { const { port } = rawServer.address(); let done = 0; { // HTTP/2 Request const client = http2.connect(`http://localhost:${port}`); const req = client.request({ ':path': '/' }); req.end(); let content = ''; req.setEncoding('utf8'); req.on('data', (chunk) => content += chunk); req.on('end', common.mustCall(() => { assert.strictEqual(content, 'HTTP/2 Response'); if (++done === 2) rawServer.close(); client.close(); })); } { // HTTP/1 Request http.get(`http://localhost:${port}`, common.mustCall((res) => { let content = ''; res.setEncoding('utf8'); res.on('data', (chunk) => content += chunk); res.on('end', common.mustCall(() => { assert.strictEqual(content, 'HTTP/1 Response'); if (++done === 2) rawServer.close(); })); })); } }));