Почему появляется это предупреждение о раннем ответе?

#akka-stream #akka-http

#akka-stream #akka-http

Вопрос:

Я использую прокси, созданный с помощью akka-http. Я выполняю некоторые проверки в прокси, но если все в порядке, я всего лишь изменяю URL в исходном запросе, добавляю несколько заголовков и передаю запрос в службу. Ничего особенного, код прост:

     val r = request
      .withUri(target)
      .withHeaders(
        // add a few
      )

    http.singleRequest(r)
 

В журналах я получаю такое предупреждение:

 2020-12-07 22:53:54,959 [WARN ] akka.actor.ActorSystemImpl [proxy-akka.actor.default-dispatcher-12] -  Sending an 2xx 'early' response before end of request for http://localhost:8080/blahblahblah received... Note that the connection will be closed after this response. Also, many clients will not read early responses! Consider only issuing this response after the request data has been completely read!
 

Я не могу отправить ответ раньше, потому что я жду ответа от службы и буквально создаю Future.successfull(value) как Future[HttpResponse] от прокси.

Это могло бы быть возможно, если бы ранний ответ был отправлен из службы, но это не так. Предупреждение относится только к прокси, а не к целевой службе.

Я покопался в источниках akka-http и заметил, что это предупреждение выводится при отправке ответа и MessageEnd еще не получено ControllerStage . ControllerStage получает элементы из HttpRequestParser . В debug я ясно вижу, что HttpRequestParser MessageEnd элемент emits , но он никогда не принимается ControllerStage . Он навсегда остается в HttpRequestParser буфере и никогда не извлекается, потому onPull что больше не вызывается.

Почему это так? Что может быть причиной такого поведения? Когда pull вызывается на этапе, который генерирует элементы?

Комментарии:

1. Если я правильно понял, ваш r вал — это а Future[HttpResponse] . Если да, то почему бы не завершить в этом разделе? t you use an Или, может pipe быть, шаблон, если он применим?

2. r есть HttpRequest . Проблема уже решена, и причиной была эта ошибка в akka-http: github.com/akka/akka-http/issues/2455