'use strict'; const common = require('../common'); // This test ensures that the http-parser strips leading and trailing OWS from // header values. It sends the header values in chunks to force the parser to // build the string up through multiple calls to on_header_value(). const assert = require('assert'); const http = require('http'); const net = require('net'); function check(hdr, snd, rcv) { const server = http.createServer(common.mustCall((req, res) => { assert.strictEqual(req.headers[hdr], rcv); req.pipe(res); })); server.listen(0, common.mustCall(function() { const client = net.connect(this.address().port, start); function start() { client.write('GET / HTTP/1.1\r\n' + hdr + ':', drain); } function drain() { if (snd.length === 0) { return client.write('\r\nConnection: close\r\n\r\n'); } client.write(snd.shift(), drain); } const bufs = []; client.on('data', function(chunk) { bufs.push(chunk); }); client.on('end', common.mustCall(function() { const head = Buffer.concat(bufs) .toString('latin1') .split('\r\n')[0]; assert.strictEqual(head, 'HTTP/1.1 200 OK'); server.close(); })); })); } check('host', [' \t foo.com\t'], 'foo.com'); check('host', [' \t foo\tcom\t'], 'foo\tcom'); check('host', [' \t', ' ', ' foo.com\t', '\t '], 'foo.com'); check('host', [' \t', ' \t'.repeat(100), '\t '], ''); check('host', [' \t', ' - - - - ', '\t '], '- - - -');