summaryrefslogtreecommitdiff
path: root/test/parallel/test-http-dump-req-when-res-ends.js
blob: 718797fae1fe688bdc4fbb9dba91880b059d7004 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
'use strict';

const { mustCall } = require('../common');

const fs = require('fs');
const http = require('http');
const { strictEqual } = require('assert');

const server = http.createServer(mustCall(function(req, res) {
  strictEqual(req.socket.listenerCount('data'), 1);
  req.socket.once('data', mustCall(function() {
    // Ensure that a chunk of data is received before calling `res.end()`.
    res.end('hello world');
  }));
  // This checks if the request gets dumped
  // resume will be triggered by res.end().
  req.on('resume', mustCall(function() {
    // There is no 'data' event handler anymore
    // it gets automatically removed when dumping the request.
    strictEqual(req.listenerCount('data'), 0);
    req.on('data', mustCall());
  }));

  // We explicitly pause the stream
  // so that the following on('data') does not cause
  // a resume.
  req.pause();
  req.on('data', function() {});

  // Start sending the response.
  res.flushHeaders();
}));

server.listen(0, mustCall(function() {
  const req = http.request({
    method: 'POST',
    port: server.address().port
  });

  // Send the http request without waiting
  // for the body.
  req.flushHeaders();

  req.on('response', mustCall(function(res) {
    // Pipe the body as soon as we get the headers of the
    // response back.
    fs.createReadStream(__filename).pipe(req);

    res.resume();

    // Wait for the response.
    res.on('end', function() {
      server.close();
    });
  }));

  req.on('error', function() {
    // An error can happen if there is some data still
    // being sent, as the other side is calling .destroy()
    // this is safe to ignore.
  });
}));