The below code does streaming back to client, in, what I gather is a more idiomatic way than using Java’s IO Streams. It, however, has an issue: connection is kept open after stream is done.
def getImage() = Action { request =>
val imageUrl = "http://hereandthere.com/someimageurl.png"
Ok.stream({ content: Iteratee[Array[Byte], Unit] =>
WS.url(imageUrl).withHeaders("Accept"->"image/png").get { response => content }
return
}).withHeaders("Content-Type"->"image/png")
}
this is intended for streaming large (>1 mb) files from internal API to requester.
The question is, why does it keep the connection open? Is there something it expects from upstream server? I tested the upstream server using curl, and the connection does close – it just doesn’t close when passed through this proxy.
The reason that the stream doesn’t finish is because an EOF isn’t sent to the iteratee that comes back from WS.get() call. Without this explicit EOF, the connection stays open – as it’s in chunked mode, and potentially a long-running, comet-like connection.
Here’s the fixed code: