2016-07-24 204 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開發一個訪問日誌編寫器,並面臨相同的情況。不知道如何讓我的手在響應的大小。你到底是怎麼解決這個問題的? –