| 'use strict'; |
| |
| const common = require('../common'); |
| const fixtures = require('../common/fixtures'); |
| |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| |
| const assert = require('assert'); |
| const url = require('url'); |
| const tls = require('tls'); |
| const http2 = require('http2'); |
| const https = require('https'); |
| const http = require('http'); |
| |
| const key = fixtures.readKey('agent8-key.pem'); |
| const cert = fixtures.readKey('agent8-cert.pem'); |
| const ca = fixtures.readKey('fake-startcom-root-cert.pem'); |
| |
| function onRequest(request, response) { |
| const { socket: { alpnProtocol } } = request.httpVersion === '2.0' ? |
| request.stream.session : request; |
| response.status(200); |
| response.end(JSON.stringify({ |
| alpnProtocol, |
| httpVersion: request.httpVersion, |
| userAgent: request.getUserAgent() |
| })); |
| } |
| |
| class MyIncomingMessage extends http.IncomingMessage { |
| getUserAgent() { |
| return this.headers['user-agent'] || 'unknown'; |
| } |
| } |
| |
| class MyServerResponse extends http.ServerResponse { |
| status(code) { |
| return this.writeHead(code, { 'Content-Type': 'application/json' }); |
| } |
| } |
| |
| // HTTP/2 & HTTP/1.1 server |
| { |
| const server = http2.createSecureServer( |
| { |
| cert, |
| key, allowHTTP1: true, |
| Http1IncomingMessage: MyIncomingMessage, |
| Http1ServerResponse: MyServerResponse |
| }, |
| common.mustCall(onRequest, 1) |
| ); |
| |
| server.listen(0); |
| |
| server.on('listening', common.mustCall(() => { |
| const { port } = server.address(); |
| const origin = `https://localhost:${port}`; |
| |
| // HTTP/1.1 client |
| https.get( |
| Object.assign(url.parse(origin), { |
| secureContext: tls.createSecureContext({ ca }), |
| headers: { 'User-Agent': 'node-test' } |
| }), |
| common.mustCall((response) => { |
| assert.strictEqual(response.statusCode, 200); |
| assert.strictEqual(response.statusMessage, 'OK'); |
| assert.strictEqual( |
| response.headers['content-type'], |
| 'application/json' |
| ); |
| |
| response.setEncoding('utf8'); |
| let raw = ''; |
| response.on('data', (chunk) => { raw += chunk; }); |
| response.on('end', common.mustCall(() => { |
| const { alpnProtocol, httpVersion, userAgent } = JSON.parse(raw); |
| assert.strictEqual(alpnProtocol, false); |
| assert.strictEqual(httpVersion, '1.1'); |
| assert.strictEqual(userAgent, 'node-test'); |
| |
| server.close(); |
| })); |
| }) |
| ); |
| })); |
| } |