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
27const fixtures = require('../common/fixtures');
28const assert = require('assert');
29const https = require('https');
30
31const options = {
32  key: fixtures.readKey('rsa_private.pem'),
33  cert: fixtures.readKey('rsa_cert.crt')
34};
35
36const bufSize = 1024 * 1024;
37let sent = 0;
38let received = 0;
39
40const server = https.createServer(options, function(req, res) {
41  res.writeHead(200);
42  req.pipe(res);
43});
44
45server.listen(0, function() {
46  let resumed = false;
47  const req = https.request({
48    method: 'POST',
49    port: this.address().port,
50    rejectUnauthorized: false
51  }, function(res) {
52    let timer;
53    res.pause();
54    console.error('paused');
55    send();
56    function send() {
57      if (req.write(Buffer.allocUnsafe(bufSize))) {
58        sent += bufSize;
59        assert.ok(sent < 100 * 1024 * 1024); // max 100MB
60        return process.nextTick(send);
61      }
62      sent += bufSize;
63      console.error(`sent: ${sent}`);
64      resumed = true;
65      res.resume();
66      console.error('resumed');
67      timer = setTimeout(function() {
68        process.exit(1);
69      }, 1000);
70    }
71
72    res.on('data', function(data) {
73      assert.ok(resumed);
74      if (timer) {
75        clearTimeout(timer);
76        timer = null;
77      }
78      received += data.length;
79      if (received >= sent) {
80        console.error(`received: ${received}`);
81        req.end();
82        server.close();
83      }
84    });
85  });
86  req.write('a');
87  ++sent;
88});
89
90process.on('exit', function() {
91  assert.strictEqual(sent, received);
92});
93