�PNG  IHDR��;���IDATx��ܻn�0���K�� �)(�pA��� ���7�LeG{�� �§㻢|��ذaÆ 6lذaÆ 6lذaÆ 6lom��$^�y���ذag�5bÆ 6lذaÆ 6lذa{���� 6lذaÆ �`����}H�Fkm�,�m����Ӫ���ô�ô!� �x�|'ܢ˟;�E:���9�&ᶒ�}�{�v]�n&�6� �h��_��t�ڠ͵-ҫ���Z;��Z$�.�P���k�ž)�!��o���>}l�eQfJ�T��u і���چ��\��X=8��Rن4`Vw�l�>����n�G�^��i�s��"ms�$�u��i��?w�bs[m�6�K4���O���.�4��%����/����b�C%��t ��M�ז� �-l�G6�mrz2���s�%�9��s@���-�k�9�=���)������k�B5����\��+͂�Zsٲ ��Rn��~G���R���C����� �wIcI��n7jJ���hۛNCS|���j0��8y�iHKֶۛ�k�Ɉ+;Sz������L/��F�*\��Ԕ�#"5��m�2��[S��������=�g��n�a�P�e�ғ�L�� lذaÆ 6l�^k��̱aÆ 6lذaÆ 6lذa;���� �_��ذaÆ 6lذaÆ 6lذaÆ ���R���IEND�B` var assert = require('assert'); var hpack = require('../'); var fixtures = require('./fixtures'); describe('hpack/compressor', function() { var comp; beforeEach(function() { comp = hpack.compressor.create({ table: { maxSize: 1024 } }); }); function expect(arr, enc) { function isNumber(num) { return typeof num === 'number'; } var out = comp.read().toString('hex'); if (Array.isArray(arr) && !arr.every(isNumber)) { arr = arr.map(function(item) { return new Buffer(item, enc); }); arr = Buffer.concat(arr); } else { arr = new Buffer(arr, enc); } var actual = arr.toString('hex'); assert.equal(out, actual); } describe('indexed field', function() { it('should lookup entry from static table', function() { comp.write([{ name: ':method', value: 'GET' }]); expect([ 0b10000000 | 2 ]); }); it('should fetch entry from the end of the static table', function() { comp.write([{ name: 'www-authenticate', value: '' }]); expect([ 0b10000000 | 61 ]); }); }); describe('literal field', function() { it('should lookup name in the table (incremental)', function() { comp.write([{ name: 'host', value: 'localhost' }]); expect('6686a0e41d139d09', 'hex'); comp.write([{ name: 'host', value: 'localhost' }]); expect([ 0b10000000 | 62 ]); }); it('should lookup name in the table (not-incremental)', function() { comp.write([{ name: 'host', value: 'localhost', incremental: false }]); expect('0f1786a0e41d139d09', 'hex'); // Should not use the table comp.write([{ name: 'host', value: 'localhost' }]); expect('6686a0e41d139d09', 'hex'); }); it('should evict header field from the table', function() { for (var i = 0; i < 1000; i++) { comp.write([{ name: 'host', value: 'localhost' + i }]); comp.read(); } assert(comp._table.size < comp._table.maxSize); assert.equal(comp._table.dynamic.length, 21); }); }); describe('update size', function() { it('should evict header field from the table', function() { comp.write([{ name: 'host', value: 'localhost' }]); expect('6686a0e41d139d09', 'hex'); comp.reset(); // update=0, update=maxSize expect('203fe107', 'hex'); comp.write([{ name: 'host', value: 'localhost' }]); expect('6686a0e41d139d09', 'hex'); }); it('should send dynamic update if size >= protocolMaxSize', function() { comp.updateTableSize(Infinity); // update=maxSize expect('3fe107', 'hex'); }); }); describe('spec examples', function() { beforeEach(function() { comp = hpack.compressor.create({ table: { maxSize: 256 } }); }); var tests = fixtures.specExamples; tests.forEach(function(test, i) { var prev = tests[i - 1]; it('should give expected output on ' + test.id, function() { var startFrom = test.continuation ? prev.comp : comp; if (!startFrom) throw new Error('Previous test failed'); comp = startFrom; comp.write(test.output.map(function(pair) { return { name: pair[0], value: pair[1], huffman: test.huffman }; })); expect(test.input.replace(/ /g, ''), 'hex'); // Verify table contents assert.deepEqual(comp._table.dynamic.map(function(header) { return [ header.name, header.value, header.totalSize ]; }).reverse(), test.table); // Verify table size var expectedSize = test.table.reduce(function(acc, item) { return acc + item[2]; }, 0); assert.equal(comp._table.size, expectedSize); test.comp = comp; }); }); }); });