0

J'ai certains fichiers stockés sur un serveur CDN qui ne doit pas être directement accessible depuis le client. Donc, je proxy les demandes via le serveur accessible au public exécutant ExpressJS et utiliser le module request pour récupérer le côté serveur de données et le renvoyer en réponse.Comment ajouter/supprimer des en-têtes de réponse dans ExpressJS lors de la demande de proxy

Il travaille et dans le code ressemble à ceci:

var request = require('request'); 
var app = express(); 
var internalUrl = 'https://my.storage-cdn.com/private/info/file.xml'; 

app.get('/somefile.xml', function (req, res) { 
    request(internalUrl).pipe(res); 
}); 

Les questions que je face à la méthode ci-dessus sont:

  • le serveur de stockage/cdn ajoute des en-têtes de réponse de son propre qui incluent des informations privées et, en tant que telles, peuvent constituer un problème de sécurité lorsqu'elles sont exposées en réponse. Et au-dessus de la méthode de tuyauterie l'objet res à request ne supprime pas ces en-têtes. Il passe ces en-têtes comme c'est à la réponse. Je veux supprimer ces en-têtes.
  • Je souhaite ajouter des en-têtes eTag et de contrôle de cache afin que le fichier puisse être correctement mis en cache .

J'ai essayé de changer à quelque chose comme ceci:

app.get('/somefile.xml', function (req, res) { 
    request(internalUrl, function (err, response, body) { 
     if (!err && response.statusCode == 200) { 
      res.writeHead(200, {...}); // write custom headers I need 
      res.end(body); 
     } 
    }); 
}); 

Cela me permet d'écraser les en-têtes à mon goût, mais dans cette méthode que je dois attendre pour le fichier entier pour obtenir téléchargé sur le côté serveur avant que je commence à envoyer les octets dans ma réponse et avec certains fichiers pouvant atteindre 1 Mo, cela affecte le temps de réponse. Donc, ma question est - est-il un moyen de ne pas avoir à attendre le téléchargement de tout le fichier du côté serveur avant de commencer à envoyer une réponse tout en étant capable de manipuler les en-têtes de réponse?

Répondre

2

Vous pouvez accrocher à l'événement 'réponse':

const SECRET_HEADERS = ['Set-Cookie', 'X-Special-Token'] 

app.get('/somefile.xml', function (req, res) { 
    request(internalUrl).on('response', function (response) { 
    SECRET_HEADERS.forEach(function (header) { 
     response.removeHeader(header) 
    }) 
    }).pipe(res) 
}) 
+0

Merci. Cela a fait l'affaire pour moi. Savez-vous si l'événement 'response' est déclenché lorsque les données sont disponibles ou lorsque toutes les données http sont chargées depuis le serveur de suppression. J'essaie de comprendre comment fonctionnent les flux et comment cela diffère d'un événement 'data'. – codneto

+0

@codneto L'événement 'response' se déclenche après que les en-têtes et l'état HTTP ont été reçus et avant que les événements 'data' ne se déclenchent. – idbehold