我正在尝试使用简单的node.js / http API改进spray-can。
节点允许在单独的TCP数据包中发送固定长度的响应(即未分块)。在下面的示例中,消息以八个数据包发送。第一个包含HTTP头和第一个“x”块,以下数据包各包含1024个x(在OS X上使用Wireshark验证)。
是否可以使用spray-can / http实现相同的效果?
var http = require('http'),
server = http.createServer(function (request, response) {
var count = 8, size = 1024;
response.writeHead(200, 'honky-dory', {
'Content-Type': 'text/plain',
'Content-Length': count * size
});
(function send () {
setTimeout(function () {
response.write(Array(size + 1).join('x'));
count -= 1;
if(count > 0) send();
else response.end();
}, 10);
}());
});
server.listen(8080);
从我到目前为止看到的,HttpResponse相当'原子'。
更新
基于jrudolph和Yuli Matsai的答案,我想出了一个与上述节点服务器大致相同的监听器。实际上它做了一点,因为它不允许充斥网络,因为所涉及的确认。
class Listener extends Actor {
def receive = {
case Connected (_, _) => sender ! Register (self)
case _: HttpRequest =>
val hs = HttpHeaders.`Content-Length` (8192) :: Nil
sender ! ChunkedResponseStart (HttpResponse (headers = hs)).withAck (8)
case 0 =>
sender ! ChunkedMessageEnd
case remaining: Int =>
sender ! MessageChunk (body = "x" * 1024).withAck (remaining - 1)
}
}
为了明确提供Content-Length
,必须在application.conf
中启用以下条目:
spray.can.server {
chunkless-streaming = "on"
}
答案 0 :(得分:2)