これは非常に難解な問題であり、小さなテスト ケースを作成することはできません。あらかじめご了承ください。しかし、誰かが以前に似たようなことに遭遇したことがあるかもしれません。
次のようなコードがあります(restifyを使用):
server.put("/whatever", function (serverRequest, serverResponse, next) {
serverRequest.pause();
serverRequest.on("data", function (chunk) {
console.log("from outside", chunk);
});
doSomeAsyncStuff(function (err) {
serverRequest.on("data", function (chunk) {
console.log("from inside", chunk);
});
serverRequest.on("end", function () {
next();
});
serverRequest.resume();
});
});
CURL を使用してこのサーバーにアクセスすると、これはうまく機能します。しかし、XMLHttpRequest でヒットすると、"from inside"
ログ行よりもログ行が 1 行少なくなります"from outside"
。できるだけ早く一時停止するよう最善を尽くしていますが、データ イベントの 1 つが失われているようです。
私が使用しているCURLコマンドは次のとおりです。
curl -X PUT -T file.pdf http://localhost:7070/whatever -v
コードは次のXMLHttpRequest
とおりです (最近のバージョンの Chrome で動作します)。
var arrayBuffer = fromElsewhere();
var xhr = new XMLHttpRequest();
xhr.open("PUT", "http://localhost:7070/whatever");
xhr.setRequestHeader("Content-Length", arrayBuffer.byteLength);
xhr.setRequestHeader("Content-Type", "application/pdf");
xhr.send(arrayBuffer);
顕著な違いの 1 つは、CURL はExpect: 100-continue
アップロード前に送信するように見えますが、送信XMLHttpRequest
しないことです。そのヘッダーを手動で追加しようとしましたが、もちろん実際にはあまり効果がありませんでした (つまり、Chrome は応答を待たず、元の要求と共にすべての PDF データを送信しただけです)。それでも、なぜこれが影響を与えるのかわかりません。