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