2010-10-11 11 views
6

Próbuję obsłużyć niektóre pliki JavaScript za pomocą Node.js iz dowolnego powodu pliki są obcięte w środku transmisji. Kod:Node.js obcina pliki podczas wyświetlania za pomocą 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); 

Pliki http://github.com/LearnBoost/Socket.IO/raw/master/socket.io.js i http://code.jquery.com/jquery-1.4.2.min.js. Pierwszy z nich jest odcinany dokładnie na 32 KB, a drugi dokładnie na 16 KB. Nie dzieje się to przez HTTP, tylko HTTPS i tylko przez sieć (np .: nie z localhost).

Każda pomoc będzie naprawdę doceniana.

Odpowiedz

12

Zamiast Content-Length: data.length należy użyć Content-Length: Buffer.byteLength(data, 'utf8') gdzie Buffer to globalny obiekt (węzeł 0.3.x) lub var Buffer = require('buffer') w węźle 0.2.x, która pozwoli Ci zaoszczędzić wiele kłopotów i może rozwiązać problem ze skróconymi odpowiedzi też.

+0

To powinno być oznaczone jako poprawna odpowiedź. Cóż, właściwie: Buffer.byteLength (data, "utf8"). Zauważ, że "語 語 語" .length == 3 podczas gdy Buffer.byteLength ("語 語 語", "utf8") == 9, poprawna odpowiedź w tym przypadku. –

+0

Dzięki Phil, nadzór ten! – tedeh

0

Może to być rozłączenie domyślnego kodowania dla readFile i res.end(). readFile po prostu ładuje surowe dane, jeśli nie określisz kodowania, a end() domyślnie utf8. Nie jestem w 100% pewny, ale surowe dane z pliku mogą zwrócić mniejszą długość niż zakodowany ciąg znaków utf8.

Próbowałem odtworzyć błąd i się nie udało, więc może być konieczna aktualizacja wersji węzła. Używam najnowszego kodu z github.

1

Właśnie to widziałem. Ta sama konfiguracja - HTTPS, najnowszy węzeł z repozytorium git.

Jeden duży plik (170k) nigdy nie kończy poprawnie wysyłania. Próbowałem przejść z asynchronizacji, aby zsynchronizować, ale nie miało to żadnego znaczenia. Jedyną rzeczą, która naprawiła go do tej pory, było zmniejszenie pliku. To był duży jpg z dyskietek, więc było to łatwe. Problem zniknął.

0

Ten problem powinien zostać rozwiązany w najnowszej wersji Node.js. Czy możesz przetestować to na v0.4.2?

Powiązane problemy