• 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');
24
25// The test works by making a total of 8 requests to the server.  The first
26// two are made with the server off - they should come back as ECONNREFUSED.
27// The next two are made with server on - they should come back successful.
28// The next two are made with the server off - and so on.  Without the fix
29// we were experiencing parse errors instead of ECONNREFUSED.
30// https://github.com/nodejs/node-v0.x-archive/issues/784
31
32const http = require('http');
33const assert = require('assert');
34
35
36const server = http.createServer(function(req, res) {
37  let body = '';
38
39  req.setEncoding('utf8');
40  req.on('data', function(chunk) {
41    body += chunk;
42  });
43
44  req.on('end', function() {
45    assert.strictEqual(body, 'PING');
46    res.writeHead(200);
47    res.end('PONG');
48  });
49});
50
51
52server.on('listening', pingping);
53
54
55function serverOn() {
56  console.error('Server ON');
57  server.listen(common.PORT);
58}
59
60
61function serverOff() {
62  console.error('Server OFF');
63  server.close();
64  pingping();
65}
66
67const responses = [];
68
69
70function afterPing(result) {
71  responses.push(result);
72  console.error(`afterPing. responses.length = ${responses.length}`);
73  const ECONNREFUSED_RE = /ECONNREFUSED/;
74  const successRE = /success/;
75  switch (responses.length) {
76    case 2:
77      assert.ok(ECONNREFUSED_RE.test(responses[0]));
78      assert.ok(ECONNREFUSED_RE.test(responses[1]));
79      serverOn();
80      break;
81
82    case 4:
83      assert.ok(successRE.test(responses[2]));
84      assert.ok(successRE.test(responses[3]));
85      serverOff();
86      break;
87
88    case 6:
89      assert.ok(ECONNREFUSED_RE.test(responses[4]));
90      assert.ok(ECONNREFUSED_RE.test(responses[5]));
91      serverOn();
92      break;
93
94    case 8:
95      assert.ok(successRE.test(responses[6]));
96      assert.ok(successRE.test(responses[7]));
97      server.close();
98      // We should go to process.on('exit') from here.
99      break;
100  }
101}
102
103
104function ping() {
105  console.error('making req');
106
107  const opt = {
108    port: common.PORT,
109    path: '/ping',
110    method: 'POST'
111  };
112
113  const req = http.request(opt, function(res) {
114    let body = '';
115
116    res.setEncoding('utf8');
117    res.on('data', function(chunk) {
118      body += chunk;
119    });
120
121    res.on('end', function() {
122      assert.strictEqual(body, 'PONG');
123      assert.ok(!hadError);
124      gotEnd = true;
125      afterPing('success');
126    });
127  });
128
129  req.end('PING');
130
131  let gotEnd = false;
132  let hadError = false;
133
134  req.on('error', function(error) {
135    console.log(`Error making ping req: ${error}`);
136    hadError = true;
137    assert.ok(!gotEnd);
138    afterPing(error.message);
139  });
140}
141
142
143function pingping() {
144  ping();
145  ping();
146}
147
148pingping();
149
150process.on('exit', function() {
151  console.error("process.on('exit')");
152  console.error(responses);
153
154  assert.strictEqual(responses.length, 8);
155});
156