【问题标题】:Netty: number of bytes in a single HTTP request or response?Netty:单个 HTTP 请求或响应中的字节数?
【发布时间】:2016-11-27 14:58:28
【问题描述】:

在使用 Netty 编写的 HTTP 反向代理中,如何确定为单个 HTTP 请求(标头 + 任何正文内容)读取的字节数或为单个 HTTP 响应写入的字节数? Netty 的开箱即用 HTTPRequestDecoderHTTPResponseEncoder(或超类)如何让其他 ChannelHandlers 可以使用此信息?

我知道在管道的开头粘贴ChannelHandler 来记录为通道写入和读取的字节总数很容易,但我不希望这样 - 我想知道读取的字节数或根据请求和响应编写。由于 Netty 开箱即用的 HTTP 编码器和解码器是进行读取和写入的,我希望我可以子类化一些东西并“挂钩”到读/写逻辑,以获得每条消息编码或解码的计数。这可能吗?

在表示请求/响应大小直方图以及支持 HTTP 扩展访问日志格式时,此数据很重要:

http://httpd.apache.org/docs/current/mod/mod_log_config.html

从该页面,访问记录单个请求/响应对时使用的日志格式字符串标记:

%I  Bytes received, including request and headers. Cannot be zero. You need to enable mod_logio to use this.
%O  Bytes sent, including headers. May be zero in rare cases such as when a request is aborted before a response is sent. You need to enable mod_logio to use this.
%S  Bytes transferred (received and sent), including request and headers, cannot be zero. This is the combination of %I and %O. You need to enable mod_logio to use this.

一旦请求被完全读取或响应被 Netty 处理程序完全写入,我将如何确定在输出字符串中替换上述格式标记所需的计数?

【问题讨论】:

  • 你数一数。 Netty 提供每次读取或写入的读取或写入计数。不清楚你在问什么。
  • @EJP 我非常了解 Netty 的内部结构。我在问,在使用 Netty 现有的 HTTP 编码器或解码器时,我如何才能获得读取或写入的字节数(因为我没有编写 Netty 的 HTTP 支持代码)?
  • @EJP 你的反对票是不必要的——这个问题是可行的,值得回答。在问这个问题之前,我已经做了很多研究。不过我会更新它以使其更清晰。
  • @EJB 编辑的问题是否足够清楚?如果是这样,我会很感激你回复你的反对票。

标签: java http logging netty


【解决方案1】:

目前无法获取这些信息,因为 Netty 仅将 HttpRequest/HttpResponse/HttpContent 的“解析”表示传递给管道中的下一个处理程序。您需要自己进行数学计算,例如计算标题中的每个字符等。

【讨论】:

  • 感谢您的回答!您是否愿意接受添加此功能并将它们表示为HttpObject 接口的两个新增功能的拉取请求? (例如readBytes()byteCount(),前者表示需要读取的总数,后者表示实例中实际表示的字节数)?想法?
  • 请打开一个问题来讨论...也就是说我们不能在不破坏界面的情况下执行此操作,因此可能需要一段时间
  • @LesHazlewood 我目前正在为 Netty 编写访问日志编写器并面临同样的情况。不知道如何掌握响应的大小。你最后是怎么解决的?
  • @IkerJimenez 我没有 - 我必须把它放在积压中:/
猜你喜欢
  • 2013-02-11
  • 2015-02-18
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多