1 'use strict'; 2 const common = require('../common'); 3 4 // This test ensures that the http-parser strips leading and trailing OWS from 5 // header values. It sends the header values in chunks to force the parser to 6 // build the string up through multiple calls to on_header_value(). 7 8 const assert = require('assert'); 9 const http = require('http'); 10 const net = require('net'); 11 12 function check(hdr, snd, rcv) { 13 const server = http.createServer(common.mustCall((req, res) => { 14 assert.strictEqual(req.headers[hdr], rcv); 15 req.pipe(res); 16 })); 17 18 server.listen(0, common.mustCall(function() { 19 const client = net.connect(this.address().port, start); 20 function start() { 21 client.write('GET / HTTP/1.1\r\n' + hdr + ':', drain); 22 } 23 24 function drain() { 25 if (snd.length === 0) { 26 return client.write('\r\nConnection: close\r\n\r\n'); 27 } 28 client.write(snd.shift(), drain); 29 } 30 31 const bufs = []; 32 client.on('data', function(chunk) { 33 bufs.push(chunk); 34 }); 35 client.on('end', common.mustCall(function() { 36 const head = Buffer.concat(bufs) 37 .toString('latin1') 38 .split('\r\n')[0]; 39 assert.strictEqual(head, 'HTTP/1.1 200 OK'); 40 server.close(); 41 })); 42 })); 43 } 44 45 check('host', [' \t foo.com\t'], 'foo.com'); 46 check('host', [' \t foo\tcom\t'], 'foo\tcom'); 47 check('host', [' \t', ' ', ' foo.com\t', '\t '], 'foo.com'); 48 check('host', [' \t', ' \t'.repeat(100), '\t '], ''); 49 check('host', [' \t', ' - - - - ', '\t '], '- - - -'); 50