1'use strict'; 2 3const common = require('../common'); 4if (!common.hasCrypto) 5 common.skip('missing crypto'); 6 7const fixtures = require('../common/fixtures'); 8 9const http2 = require('http2'); 10const assert = require('assert'); 11const fs = require('fs'); 12 13const { 14 HTTP2_HEADER_CONTENT_TYPE, 15 HTTP2_HEADER_CONTENT_LENGTH, 16 HTTP2_HEADER_LAST_MODIFIED 17} = http2.constants; 18 19const fname = fixtures.path('elipses.txt'); 20const data = fs.readFileSync(fname); 21const stat = fs.statSync(fname); 22const fd = fs.openSync(fname, 'r'); 23 24const server = http2.createServer(); 25server.on('stream', (stream) => { 26 stream.respond({}); 27 stream.end(); 28 29 stream.pushStream({ 30 ':path': '/file.txt', 31 ':method': 'GET' 32 }, (err, stream) => { 33 assert.ifError(err); 34 stream.respondWithFD(fd, { 35 [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain', 36 [HTTP2_HEADER_CONTENT_LENGTH]: stat.size, 37 [HTTP2_HEADER_LAST_MODIFIED]: stat.mtime.toUTCString() 38 }); 39 }); 40 41 stream.end(); 42}); 43 44server.on('close', common.mustCall(() => fs.closeSync(fd))); 45 46server.listen(0, () => { 47 48 const client = http2.connect(`http://localhost:${server.address().port}`); 49 50 let expected = 2; 51 function maybeClose() { 52 if (--expected === 0) { 53 server.close(); 54 client.close(); 55 } 56 } 57 58 const req = client.request({}); 59 60 req.on('response', common.mustCall()); 61 62 client.on('stream', common.mustCall((stream, headers) => { 63 64 stream.on('push', common.mustCall((headers) => { 65 assert.strictEqual(headers[HTTP2_HEADER_CONTENT_TYPE], 'text/plain'); 66 assert.strictEqual(+headers[HTTP2_HEADER_CONTENT_LENGTH], data.length); 67 assert.strictEqual(headers[HTTP2_HEADER_LAST_MODIFIED], 68 stat.mtime.toUTCString()); 69 })); 70 71 stream.setEncoding('utf8'); 72 let check = ''; 73 stream.on('data', (chunk) => check += chunk); 74 stream.on('end', common.mustCall(() => { 75 assert.strictEqual(check, data.toString('utf8')); 76 maybeClose(); 77 })); 78 79 })); 80 81 req.resume(); 82 req.on('end', maybeClose); 83 84 req.end(); 85}); 86