Http2 – serveur push avec la méthode nodejs pushStream ne fonctionne pas

http2 sur nodejs , mais je découvre qu’un problème avec la méthode pushStream ne fonctionne pas (le côté client ne montre pas “Pushed / [nomfichier]” sur l’outil de développement). Je me demande si la raison est la version de nodejs (j’ai installé la dernière version v9.8.0 )

Mes codes sont les suivants:

server.js

 'use ssortingct' const fs = require('fs'); const path = require('path'); const http2 = require('http2'); const utils = require('./utils'); const { HTTP2_HEADER_PATH } = http2.constants; const PORT = process.env.PORT || 3000; // The files are pushed to stream here function push(stream, path) { const file = utils.getFile(path); if (!file) { return; } stream.pushStream({ [HTTP2_HEADER_PATH]: path}, (err, pushStream, headers) => { if (err) throw err; pushStream.respondWithFD(file.content, file.headers) }); } // Request handler function onRequest(req, res) { const reqPath = req.headers[':path'] === '/' ? '/index.html' : req.headers[':path'] const file = utils.getFile(reqPath); // 404 - File not found if (!file) { res.statusCode = 404; res.end(); return; } // Push with index.html if (reqPath === '/index.html') { push(res.stream, '/assets/main.js'); push(res.stream, '/assets/style.css'); } else { console.log("requiring non index.html") } // Serve file res.stream.respondWithFD(file.content, file.headers); } // creating an http2 server const server = http2.createSecureServer({ cert: fs.readFileSync(path.join(__dirname, '/certificatee.crt')), key: fs.readFileSync(path.join(__dirname, '/privateKey.key')) }, onRequest); // start listening server.listen(PORT, (err) => { if (err) { console.error(err); return -1; } console.log(`Server listening to port ${PORT}`); }); 

utils.js

 'use ssortingct'; const fs = require('fs'); const mime = require('mime'); module.exports = { getFile: function (path) { const filePath = `${__dirname}/public${path}`; try { const content = fs.openSync(filePath, 'r'); const contentType = mime.getType(filePath); return { content, headers: { 'content-type': contentType } }; } catch (e) { return null; } } } 

    Je n’ai pas essayé d’exécuter votre code, mais j’ai constaté que Chrome n’autorisait pas le transfert HTTP / 2 avec un certificate HTTPS non approuvé (par exemple, un certificate auto-signé non encore ajouté au magasin de données de confiance). Soulevé un bug avec l’équipe de Chrome .

    Si vous avez le cadenas rouge non sécurisé, vous risquez également de vous heurter à ce problème. Ajoutez le certificate dans votre magasin de données de confiance, redémarrez Chrome et rechargez le site sur lequel vous devriez obtenir un cadenas vert.

    Remarque Chrome a besoin d’un certificate avec un champ Nom de substitution du sujet (SAN) correspondant au domaine. Par conséquent, si vous disposez de l’ancien champ Objet, il ne sera pas vert même après l’avoir ajouté à votre magasin de données de confiance.

    Une autre option consiste à consulter les frameworks Chrome HTTP2 en les tapant dans votre URL:

     chrome://net- internals/#http2 

    Si vous voyez les frameworks de promesses push (avec une promised_stream_id ), suivis des en-têtes et des données sur cette promised_stream_id vous savez que le côté serveur fonctionne.