Просмотр в веб-браузере фрагментированного потока данных http-сущности

Основываясь на методе, описанном в этом вопросе, я написал базовый микросервис для обеспечения непрерывной потоковой передачи ByteString с использованием akka-http. Соответствующий код scala:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Source, Flow}
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.HttpEntity
import akka.http.scaladsl.model.HttpMethods._
import akka.http.scaladsl.model._
import scala.concurrent.Future
import scala.concurrent.duration._

object Server extends App {

  implicit val system = ActorSystem("testServer")
  implicit val materializer = ActorMaterializer()

  val strToChunk = 
    Flow[String].map(ByteString(_))
                .via(Flow[ByteString].map(HttpEntity.ChunkStreamPart(_)))      

  def sourceFactory = 
    Source(0 seconds, 1 seconds,"test").via(strToChunk)

  val requestHandler: HttpRequest => HttpResponse = {
    case HttpRequest(GET, Uri.Path("/stream"), _, _, _) =>
      HttpResponse(entity = HttpEntity.Chunked(ContentTypes.`text/plain`,
                                               sourceFactory))                 
  }

  val bindingFuture = 
    Http().bind(interface = "localhost", port = 8200).runForeach { conn =>
      conn handleWithSyncHandler requestHandler
  }
}

Клиент делает один HTTP-запрос, а сущность одного ответа представляет собой фрагментированный поток ByteStrings, а именно «тест» каждую 1 секунду.

Я проверил, что поток создает «тестовые» значения с помощью клиента scala. Однако очень удобным методом отладки было бы указать веб-браузеру на микросервис для просмотра потока фрагментов по мере поступления данных. Я попытался указать браузеру Chrome порт, но браузер просто завис в состоянии загрузки/занятости.

Итак, мой вопрос: как изменить HttpResponse, чтобы браузер мог отображать поток в режиме реального времени?

Решение, которое требует другого объекта HttpResponse для просмотра в браузере, отличного от использования программным клиентом (например, если адрес «/stream» предоставляет HttpResponse для клиентов, а «/browserView» предоставляет другой HttpResponse, то это приемлемый ответ).


person Ramón J Romero y Vigil    schedule 26.10.2015    source источник
comment
Почему вы не используете curl для отладки? Если вы действительно хотите знать, что происходит, это отличный инструмент. Если вы измените test на test\n и используете curl -v http://127.0.0.1:8200/stream, все будет работать как положено. Поэтому я подозреваю, что кеширование является виновником.   -  person Rüdiger Klaehn    schedule 26.10.2015
comment
В дополнение к тому, что сказал @RüdigerKlaehn, отвечает ли это? stackoverflow.com/questions/13557900/   -  person Viktor Klang    schedule 26.10.2015
comment
Виктор. Этот ответ выглядит многообещающе, но в нем отсутствует ключевая спецификация, а именно: все заголовки установлены правильно. Как установить заголовок?   -  person Ramón J Romero y Vigil    schedule 26.10.2015


Ответы (1)


В итоге я последовал предложению Рудигера Клаена использовать curl вместо визуального браузера. Curl смог сразу отобразить данные объекта в виде фрагментов.

Перед вызовом рендеринга в браузере должно происходить какое-то кеширование, а мои фрагменты данных были довольно маленькими.

person Ramón J Romero y Vigil    schedule 17.11.2015