Simuler une requête HTTP non valide

Je dois simuler des requêtes HTTP mal formées sur mon serveur à des fins de test – j’ai un gestionnaire clientError sur mon serveur Node.js et je souhaite le créer.

Par exemple: curl "https://myhost/endpoint?term=one two" déclenchera ce gestionnaire (à cause de l’espace non codé entre les mots one et two )

J’ai du mal à trouver un moyen de faire une demande similaire dans Node. Autant que je sache, toutes les bibliothèques de requêtes de niveau supérieur effectuent automatiquement un encodage, donc je ne pouvais pas les utiliser.

En utilisant la bibliothèque de net intégrée, j’ai réussi à atteindre cette distance:

 const net = require('net'); const socket = new net.Socket(); const options = { port: 443, host: 'myhost' }; socket.connect(options, () => { console.log('connected to', socket.remoteAddress); socket.write('GET /endpoint?term=one two HTTP/1.1\r\n' + 'Host: myhost\r\n' + '\r\n'); socket.on('data', (data) => { console.log('SOCKET RESPONSE: ' + data); }).on('end', () => { console.log('SOCKET ENDED'); }); 

Le problème est que les appels à mon service Node.js sont transmis par proxy via Nginx, donc l’exécution du code ci-dessus entraîne une erreur 400 de la part de Nginx:

La requête HTTP simple a été envoyée au port HTTPS

Je vois en utilisant --verbose flag que Curl est assez intelligent pour faire des poignées de main TLS.

Des idées sur la façon de mettre à jour mon code pour y parvenir?

La solution était d’utiliser la bibliothèque tls :

 const tls = require('tls'); const options = { port: 443, host: 'myhost' }; const socket = tls.connect(options, () => { console.log('connected to', socket.remoteAddress); socket.write('GET /endpoint?term=one two HTTP/1.1\r\n' + 'Host: myhost\r\n' + '\r\n'); socket.setEncoding('utf8'); socket.on('data', data => { console.log('SOCKET RESPONSE:', data); }).on('end', () => { console.log('Connection end'); }).on('close', (had_error) => { console.log('Connection closed. Had error:', had_error); }).on('error', error => { console.log('ERROR:', error); }); });