2016-07-24 44 views
2

在用Netty编写的HTTP反向代理中,如何确定为单个HTTP请求(标头+任何主体内容)读取的字节数或为单个HTTP响应写入的字节数? Netty如何开箱即用HTTPRequestDecoderHTTPResponseEncoder(或超类)将此信息提供给其他ChannelHandlerNetty:单个HTTP请求或响应中的字节数?

我知道很容易在管道的开头添加一个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的处理程序写入,我将如何确定需要替代上述形式的计数在输出字符串中的标记?

+0

你可以计算它们。 Netty提供每次读取或写入的读取或写入次数。不清楚你在问什么。 – EJP

+0

@EJP我非常了解Netty内部。在使用Netty现有的HTTP编码器或解码器时,我问,读取或写入的字节数如何提供给我(因为我没有编码Netty的HTTP支持)? –

+0

@EJP你的downvote是不必要的 - 这个问题是可行的,值得回答。在问这个问题之前,我已经做了大量的研究。我会更新它,但要更清楚一点。 –

回答

1

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

+0

感谢您的回答!你愿意接受一个添加了这个功能的pull请求,并将它们表示为'HttpObject'接口的两个新增功能吗? (例如'readBytes()'和'byteCount()',前者表示读取所需的总数,后者表示实例中实际表示的字节数)?思考? –

+0

请打开一个问题来讨论......这就是说我们不能在不破坏界面的情况下做到这一点,因此可能需要一段时间 –

+0

@LesHazlewood我目前正在为Netty开发一个访问日志编写器,并面临相同的情况。不知道如何让我的手在响应的大小。你到底是怎么解决这个问题的? –