1'use strict';
2
3const common = require('../common');
4const assert = require('assert');
5const http = require('http');
6
7function shouldThrowOnMoreBytes() {
8  const server = http.createServer(common.mustCall((req, res) => {
9    res.strictContentLength = true;
10    res.setHeader('Content-Length', 5);
11    res.write('hello');
12    assert.throws(() => {
13      res.write('a');
14    }, {
15      code: 'ERR_HTTP_CONTENT_LENGTH_MISMATCH'
16    });
17    res.statusCode = 200;
18    res.end();
19  }));
20
21  server.listen(0, () => {
22    const req = http.get({
23      port: server.address().port,
24    }, common.mustCall((res) => {
25      res.resume();
26      assert.strictEqual(res.statusCode, 200);
27      server.close();
28    }));
29    req.end();
30  });
31}
32
33function shouldNotThrow() {
34  const server = http.createServer(common.mustCall((req, res) => {
35    res.strictContentLength = true;
36    res.write('helloaa');
37    res.statusCode = 200;
38    res.end('ending');
39  }));
40
41  server.listen(0, () => {
42    http.get({
43      port: server.address().port,
44    }, common.mustCall((res) => {
45      res.resume();
46      assert.strictEqual(res.statusCode, 200);
47      server.close();
48    }));
49  });
50}
51
52
53function shouldThrowOnFewerBytes() {
54  const server = http.createServer(common.mustCall((req, res) => {
55    res.strictContentLength = true;
56    res.setHeader('Content-Length', 5);
57    res.write('a');
58    res.statusCode = 200;
59    assert.throws(() => {
60      res.end('aaa');
61    }, {
62      code: 'ERR_HTTP_CONTENT_LENGTH_MISMATCH'
63    });
64    res.end('aaaa');
65  }));
66
67  server.listen(0, () => {
68    http.get({
69      port: server.address().port,
70    }, common.mustCall((res) => {
71      res.resume();
72      assert.strictEqual(res.statusCode, 200);
73      server.close();
74    }));
75  });
76}
77
78shouldThrowOnMoreBytes();
79shouldNotThrow();
80shouldThrowOnFewerBytes();
81