2010-10-11 6 views
6

J'essaie de traiter certains fichiers JavaScript avec Node.js et, pour une raison quelconque, les fichiers sont coupés au milieu de la transmission. Le code:Node.js supprime les fichiers lors de la diffusion via HTTPS

httpsServer = http.createServer(function(req, res) { 
    var path = url.parse(req.url).pathname; 

    if (path[path.length - 1] == '/') { 
      path += 'index.html'; 
    } 

    fs.readFile(root + path, function(err, data){ 
      if (err) return send404(res); 

      res.writeHead(200, { 
       'Content-Type': getMimeType(getExtension(path)), 
       'Content-Length': data.length}); 
      res.end(data); 

    }); 
}), 

var privateKey = fs.readFileSync(settings.PRIVATE_KEY).toString(); 
var certificate = fs.readFileSync(settings.CERTIFICATE).toString(); 

var credentials = crypto.createCredentials({key: privateKey, cert: certificate}); 
httpsServer.setSecure(credentials); 
httpsServer.listen(settings.HTTPS_PORT); 

Les fichiers http://github.com/LearnBoost/Socket.IO/raw/master/socket.io.js et http://code.jquery.com/jquery-1.4.2.min.js. Le premier est coupé exactement à 32KB et le second à exactement 16KB. Cela ne se produit pas via HTTP, uniquement via HTTPS et uniquement sur un réseau (par exemple: pas localhost).

Toute aide serait vraiment appréciée.

Répondre

12

Au lieu de Content-Length: data.length vous devez utiliser Content-Length: Buffer.byteLength(data, 'utf8')Buffer est un objet global (noeud 0.3.x) ou var Buffer = require('buffer') dans le nœud 0.2.x qui vous permettra d'économiser beaucoup de tracas et pourrait résoudre votre problème aussi avec des réponses tronquées.

+0

Ceci devrait être marqué comme la bonne réponse. Eh bien, ceci, en fait: Buffer.byteLength (data, 'utf8'). Notez que "語 語 語" .length == 3 tandis que Buffer.byteLength ("語 語 語", "utf8") == 9, la bonne réponse dans ce cas. –

+0

Merci Phil, surveillé celui-là! – tedeh

0

Il peut s'agir d'une déconnexion entre le codage par défaut pour readFile et res.end(). readFile ne charge que les données brutes si vous ne spécifiez pas d'encodage, alors que end() utilise par défaut utf8. Je ne suis pas sûr à 100%, mais les données brutes du fichier pourraient renvoyer une longueur plus courte que la chaîne encodée par utf8 qui émet.

J'ai essayé de recréer votre erreur et j'ai échoué. Il se peut donc que vous deviez mettre à niveau votre version du noeud. J'utilise le dernier code de github.

1

Je viens de le voir aussi. Même configuration - HTTPS, dernier nœud du repo git.

Un fichier volumineux (170 Ko) n'a jamais correctement terminé l'envoi. J'ai essayé de passer de l'asynchrone à la synchronisation mais cela n'a fait aucune différence. La seule chose qui l'a fixé jusqu'ici était de réduire le fichier. C'était un gros fichier jpg floppy donc c'était facile à faire. Le problème a disparu.

0

Ce problème devrait être résolu dans la dernière version de Node.js. Pouvez-vous le tester sur v0.4.2?

Questions connexes