• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright Joyent, Inc. and other Node contributors.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and associated documentation files (the
5// "Software"), to deal in the Software without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Software, and to permit
8// persons to whom the Software is furnished to do so, subject to the
9// following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Software.
13//
14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20// USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22'use strict';
23const common = require('../common');
24if (!common.hasCrypto)
25  common.skip('missing crypto');
26
27if (!common.opensslCli)
28  common.skip('node compiled without OpenSSL CLI.');
29
30const assert = require('assert');
31const fixtures = require('../common/fixtures');
32const https = require('https');
33const spawn = require('child_process').spawn;
34
35const options = {
36  key: fixtures.readKey('rsa_private.pem'),
37  cert: fixtures.readKey('rsa_cert.crt'),
38  requestCert: true,
39  rejectUnauthorized: false
40};
41
42const webIdUrl = 'URI:http://example.com/#me';
43const modulus = fixtures.readKey('rsa_cert_foafssl_b.modulus', 'ascii').replace(/\n/g, '');
44const exponent = fixtures.readKey('rsa_cert_foafssl_b.exponent', 'ascii').replace(/\n/g, '');
45
46const CRLF = '\r\n';
47const body = 'hello world\n';
48let cert;
49
50const server = https.createServer(options, common.mustCall(function(req, res) {
51  console.log('got request');
52
53  cert = req.connection.getPeerCertificate();
54
55  assert.strictEqual(cert.subjectaltname, webIdUrl);
56  assert.strictEqual(cert.exponent, exponent);
57  assert.strictEqual(cert.modulus, modulus);
58  res.writeHead(200, { 'content-type': 'text/plain' });
59  res.end(body, () => { console.log('stream finished'); });
60  console.log('sent response');
61}));
62
63server.listen(0, function() {
64  const args = ['s_client',
65                '-quiet',
66                '-connect', `127.0.0.1:${this.address().port}`,
67                '-cert', fixtures.path('keys/rsa_cert_foafssl_b.crt'),
68                '-key', fixtures.path('keys/rsa_private_b.pem')];
69
70  const client = spawn(common.opensslCli, args);
71
72  client.stdout.on('data', function(data) {
73    console.log('response received');
74    const message = data.toString();
75    const contents = message.split(CRLF + CRLF).pop();
76    assert.strictEqual(body, contents);
77    server.close((e) => {
78      assert.ifError(e);
79      console.log('server closed');
80    });
81    console.log('server.close() called');
82  });
83
84  client.stdin.write('GET /\n\n');
85
86  client.on('error', function(error) {
87    throw error;
88  });
89});
90