1'use strict';
2require('../common');
3const assert = require('assert');
4
5const http = require('http');
6const OutgoingMessage = http.OutgoingMessage;
7const ClientRequest = http.ClientRequest;
8const ServerResponse = http.ServerResponse;
9
10assert.strictEqual(
11  typeof ClientRequest.prototype._implicitHeader, 'function');
12assert.strictEqual(
13  typeof ServerResponse.prototype._implicitHeader, 'function');
14
15// validateHeader
16assert.throws(() => {
17  const outgoingMessage = new OutgoingMessage();
18  outgoingMessage.setHeader();
19}, {
20  code: 'ERR_INVALID_HTTP_TOKEN',
21  name: 'TypeError',
22  message: 'Header name must be a valid HTTP token ["undefined"]'
23});
24
25assert.throws(() => {
26  const outgoingMessage = new OutgoingMessage();
27  outgoingMessage.setHeader('test');
28}, {
29  code: 'ERR_HTTP_INVALID_HEADER_VALUE',
30  name: 'TypeError',
31  message: 'Invalid value "undefined" for header "test"'
32});
33
34assert.throws(() => {
35  const outgoingMessage = new OutgoingMessage();
36  outgoingMessage.setHeader(404);
37}, {
38  code: 'ERR_INVALID_HTTP_TOKEN',
39  name: 'TypeError',
40  message: 'Header name must be a valid HTTP token ["404"]'
41});
42
43assert.throws(() => {
44  const outgoingMessage = new OutgoingMessage();
45  outgoingMessage.setHeader.call({ _header: 'test' }, 'test', 'value');
46}, {
47  code: 'ERR_HTTP_HEADERS_SENT',
48  name: 'Error',
49  message: 'Cannot set headers after they are sent to the client'
50});
51
52assert.throws(() => {
53  const outgoingMessage = new OutgoingMessage();
54  outgoingMessage.setHeader('200', 'あ');
55}, {
56  code: 'ERR_INVALID_CHAR',
57  name: 'TypeError',
58  message: 'Invalid character in header content ["200"]'
59});
60
61// write
62{
63  const outgoingMessage = new OutgoingMessage();
64
65  assert.throws(
66    () => {
67      outgoingMessage.write('');
68    },
69    {
70      code: 'ERR_METHOD_NOT_IMPLEMENTED',
71      name: 'Error',
72      message: 'The _implicitHeader() method is not implemented'
73    }
74  );
75}
76
77assert.throws(() => {
78  const outgoingMessage = new OutgoingMessage();
79  outgoingMessage.write.call({ _header: 'test', _hasBody: 'test' });
80}, {
81  code: 'ERR_INVALID_ARG_TYPE',
82  name: 'TypeError',
83  message: 'The "chunk" argument must be of type string or an instance of ' +
84           'Buffer or Uint8Array. Received undefined'
85});
86
87assert.throws(() => {
88  const outgoingMessage = new OutgoingMessage();
89  outgoingMessage.write.call({ _header: 'test', _hasBody: 'test' }, 1);
90}, {
91  code: 'ERR_INVALID_ARG_TYPE',
92  name: 'TypeError',
93  message: 'The "chunk" argument must be of type string or an instance of ' +
94           'Buffer or Uint8Array. Received type number (1)'
95});
96
97assert.throws(() => {
98  const outgoingMessage = new OutgoingMessage();
99  outgoingMessage.write.call({ _header: 'test', _hasBody: 'test' }, null);
100}, {
101  code: 'ERR_STREAM_NULL_VALUES',
102  name: 'TypeError'
103});
104
105// addTrailers()
106// The `Error` comes from the JavaScript engine so confirm that it is a
107// `TypeError` but do not check the message. It will be different in different
108// JavaScript engines.
109assert.throws(() => {
110  const outgoingMessage = new OutgoingMessage();
111  outgoingMessage.addTrailers();
112}, TypeError);
113
114assert.throws(() => {
115  const outgoingMessage = new OutgoingMessage();
116  outgoingMessage.addTrailers({ 'あ': 'value' });
117}, {
118  code: 'ERR_INVALID_HTTP_TOKEN',
119  name: 'TypeError',
120  message: 'Trailer name must be a valid HTTP token ["あ"]'
121});
122
123assert.throws(() => {
124  const outgoingMessage = new OutgoingMessage();
125  outgoingMessage.addTrailers({ 404: 'あ' });
126}, {
127  code: 'ERR_INVALID_CHAR',
128  name: 'TypeError',
129  message: 'Invalid character in trailer content ["404"]'
130});
131
132{
133  const outgoingMessage = new OutgoingMessage();
134  assert.strictEqual(outgoingMessage.destroyed, false);
135  outgoingMessage.destroy();
136  assert.strictEqual(outgoingMessage.destroyed, true);
137}
138