gpt4 book ai didi

scala - 如何用akka-http将字节流解析为 `HttpRequest`对象?

转载 作者:行者123 更新时间:2023-12-05 06:43:00 26 4
gpt4 key购买 nike

来自documentation :“目前没有提供用于解析(或呈现)字符串或字节数组的公共(public) API”。如何使用私有(private) API 将网络流解析为 HttpRequest 对象?

此外,输入字节流应该是什么?

  1. 无序数据包(以太网及以上)
  2. 无序的 TCP 数据包
  3. 有序的 tcp 有效负载(http 原始请求,按顺序)(这是​​我的猜测)

注意:

  1. 我的字节流将只包含 http 请求,不包含响应
  2. 我从一个 pcap 文件中获取这个字节流,而不是从实时的 http 客户端中获取。 (这也是为什么我问在将它发送到 akka-http 之前我需要解析多少)
  3. 如果您认为这是个坏主意,请解释一下,这也会有很大帮助。
  4. 我怀疑这涉及使用 http().serverLayer。我不确定。

link : Akka Google Group中的一个相关问题

谢谢!

最佳答案

这是可能的,但很繁琐。我已经这样做了,但我不能在这里发布完整的代码,因为它是私有(private)的。

执行此操作的相关 AKKA 代码在 HttpRequestParser

大部分代码都是包私有(private)的,因此您需要在 akka.http 包中编写自己的帮助程序类才能访问它。

代码看起来像这样:

package akka.http

/**
* This class gives us access to Akka's [[akka.http.impl.engine.parsing.HttpRequestParser]].
*
* It is in the akka package, as most of Akka's parsing code is package-private.
*
* @see [[akka.http.impl.engine.server.HttpServerBluePrint]]
*/
class HttpRequestParserHelper()(
implicit system: ActorSystem,
materializer: Materializer) {

def unmarshalRequest(wireFormat: Array[Byte]): HttpRequest = {

val input = ByteString(wireFormat)

val requestFuture = Source.single(input)
.via(requestParsingFlow())
.runWith(Streams.getSingleElement)
.transform(identity, e =>
new IOException("Error unmarshalling request", e))

Await.result(requestFuture, 10.seconds)
}

/**
* An Akka Flow which parses incoming ByteStrings and emits HttpRequests.
*
* This code was copied from [[akka.http.impl.engine.server.HttpServerBluePrint]]
*/
private def requestParsingFlow(): Flow[ByteString, HttpRequest, Any] = {
...
}
}

填写 AKKA 源代码中的 requestParsingFlow,删除编译前不适用的位。

输入数据需要是 TCP 流数据,即您问题中的选项 (3)。

祝你好运!

关于scala - 如何用akka-http将字节流解析为 `HttpRequest`对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35035056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com