Привет! У меня есть требование использовать Play Framework 2.5 (scala) для получения большого тела запроса, затем преобразовать его и затем передать обратно прямо.
До сих пор я не смог получить поток запросов для правильной отправки с использованием фрагментированного ответа (даже без преобразования).
Пример кода:
def endpointA = EssentialAction { requestHeader =>
Accumulator.source.map { source: Source[ByteString, _] =>
Ok.chunked(source)
}
}
Отправка данных в конечную точку с помощью curl не выводит опубликованные данные как ожидается и просто приводит к ошибке ниже. Я подтвердил с помощью wireshark, что тело ответа не отправляется.
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
Кроме того, если я изменяю код для возврата созданного мной потока, он работает нормально:
val testStream: Source[ByteString, NotUsed] = Source(List("hello")).map(ByteString.apply)
Есть ли что-то в корне не так с тем, что я пытаюсь сделать здесь? Я видел другие примеры переполнения стека, когда люди предполагали, что это возможно, например:
Play Framework Scala: Как транслировать тело запроса
Я также пытался использовать verbatimBodyParser
метод описан в ссылке, но получил те же результаты.
Спасибо! NFV