невозможно с akka-http
Представление HttpResponse
обрабатывает заголовки как Seq[HttpHeader]
вместо Iterator
или akka-stream
Source
. Следовательно, как объясняется в этом вопросе, невозможно создать экземпляр объекта HttpResponse, не имея вначале всех доступных значений заголовка.
Я не знаю точную причину этого проектного решения, но я подозреваю, что это потому, что было бы трудно поддерживать источник для заголовков и источник для тела. Тело Source не сможет быть использовано без предварительного использования заголовка Source, поэтому должен быть строгий порядок доступа к переменным-членам ответа. Это может привести к путанице и неожиданным ошибкам.
Обработка нижнего уровня с akka-stream
протокол передачи гипертекста - это просто протокол прикладного уровня, обычно поверх TCP. И это довольно простой формат сообщения :
Ответное сообщение состоит из следующего:
- Строка состояния, которая включает код состояния и сообщение о причине (например,
HTTP / 1.1 200 OK, что указывает на успешное выполнение запроса клиента).
- Поля заголовка ответа (например, Content-Type: text / html).
- Пустая строка.
- Необязательное тело сообщения.
Таким образом, вы можете использовать привязку Tcp
, чтобы установить соединение и проанализировать сообщение ByteString
Найдите источник, чтобы попасть в заголовки:
val maximumFrameLength = 1024 * 1024
val endOfMessageLine : () => Byte => Boolean = () => {
var previousWasCarriage = false
(byte) =>
if(byte == '\r') {
previousWasCarriage = true
false
}
else if(byte == '\n' && previousWasCarriage) {
previousWasCarriage = false
true
}
else {
previousWasCarriage = false
false
}
}
def subFlow =
Flow[ByteString].flatMapConcat(str => Source.fromIterable(str))
.splitAfter(endOfMessageLine())
К сожалению, для этого, вероятно, требуется, чтобы ваш запрос был отправлен как необработанная строка ByteString через привязку Tcp.