可以使用spray-can / http写入碎片化的HTTP消息

时间:2014-01-19 08:56:21

标签: node.js scala spray

我正在尝试使用简单的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"
}