#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