0

Hi I have a requirement to use play framework 2.5 (scala) to receive a large request body, then transform it and then stream it straight back out.

So far I've been unable to get the request stream to be sent out correctly using a chunked response (even untransformed).

Code example:

def endpointA = EssentialAction { requestHeader =>

  Accumulator.source.map { source: Source[ByteString, _] =>
    Ok.chunked(source)
  }
}

POSTing data to the endpoint with curl does not output the posted data as expected and just results in the error below. I confirmed with wireshark that no response body is sent.

curl -v --data 'hello' -H "Connection: Keep-Alive" -H "Keep-Alive: 300" -H "Content-type: text/plain" http://localhost:9584/binding-tariff-admin/upload-csv
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 9584 (#0)
> POST /binding-tariff-admin/endpoint-a HTTP/1.1
> Host: localhost:9584
> User-Agent: curl/7.64.1
> Accept: */*
> Connection: Keep-Alive
> Keep-Alive: 300
> Content-type: text/plain
> Content-Length: 5
>
* upload completely sent off: 5 out of 5 bytes
< HTTP/1.1 200 OK
< Transfer-Encoding: chunked
< Cache-Control: no-cache,no-store,max-age=0
< Content-Security-Policy: default-src 'self' 'unsafe-inline' *.s3.amazonaws.com www.google-analytics.com data:
< X-Permitted-Cross-Domain-Policies: master-only
< Content-Type: application/octet-stream
< Date: Wed, 19 Feb 2020 10:15:36 GMT
<
* transfer closed with outstanding read data remaining
* Closing connection 0
curl: (18) transfer closed with outstanding read data remaining

Also, if I change the code to return a stream I create myself, it works fine:

val testStream: Source[ByteString, NotUsed] = Source(List("hello")).map(ByteString.apply)

Is there something fundamentally wrong with what I'm trying to do here? I have seen other stack overflow examples with people suggesting this should be possible, e.g.

Play Framework Scala: How to Stream Request Body

I also tried using the verbatimBodyParser method described in the link but got the same results.

Thanks! NFV

nfvindaloo
  • 948
  • 2
  • 11
  • 24
  • 1
    I figured out that this was caused by a problematic play filter, the code above works fine without this filter! – nfvindaloo Feb 19 '20 at 16:10
  • Can you check with some other client apart from curl? https://stackoverflow.com/questions/1759956/curl-error-18-transfer-closed-with-outstanding-read-data-remaining – Shankar Shastri Feb 19 '20 at 16:20

0 Answers0