Netty を使用してプロキシ サーバーを実装し、HTTP リクエストをデコードし、パスに基づいてこれらのリクエストを発信チャネルに書き込みます。今後の処理のために、HTTP リクエストのコンテンツから情報を抽出する必要があります (基本的には、「request-id:」という形式の部分文字列を見つけて、後で使用するために記録します。これを行う最善の方法は何ですか?明らかに、私はチャネル バッファの内容を文字列にダンプし、標準の Java 文字列検索手法を使用できますが、新しい文字列を作成せずに netty でこれを行う簡単でオーバーヘッドの少ない方法はありますか?たとえば、asCharSequence(CharSet)
ChannelBuffer のメソッド、Java パターン/マッチャーを使用できます。
3 に答える
少し前に、ChannelBuffer に含まれるバイトのコンテンツ タイプを盗聴しようとしていたときに、この問題に遭遇しました。
あなたが使うかもしれないことが私に起こりました:
channelBuffer.toByteBuffer().asCharBuffer()
これは、正規表現の Pattern.Matcher に渡すことができます。これは、バッファーを再割り当てするのではなく、ラップして再表現するだけだからです。しかし、これは機能しません。これは、CharBuffer を Charset.decoded にする必要があるためです。これは、おそらく ChannelBuffer を文字列に変換するのと同じくらい悪いことです。
ChannelBufferIndexFinderの問題の 1 つは、特定の 1 バイトを検索する場合に最適に機能する傾向があることです。これは、文字列 (または、より基本的には長さ > 1 のバイト配列) を検索する場合と同様に、私はそれを機能させることができませんでした。私が望んでいた方法。
ChannelBuffer 内の実際のバイト シーケンスを見つけるのに役立つByteSequenceIndexFinderと呼ばれるこの ChannelBufferIndexFinder 実装の作業を開始しましたが、いくつかの問題があります。
- ChannelBuffer.bytesBefore(...)の動作方法により、見つかった配列の直接のオフセットを返すのではなく、その末尾を返すため、返されたインデックスからバイト配列の長さ +1を減算して、バイト バッファ内のバイト シーケンスの先頭のオフセット。
- ファインダーは状態 (これまでに一致したバイト数) を保持する必要があるため、スレッドセーフではありません。(1 つの int の) 単純な状態を ThreadLocal に置き換えようとしましたが、パフォーマンスは大幅に低下しましたが、オプションのままです。
実際には、問題#1に対処する非標準の代替呼び出し方法があり、次のように機能します。
ChannelBuffer bufferToSearch = ...;
String searchStr = "....";
ByteSequenceIndexFinder finder = new ByteSequenceIndexFinder(searchStr.getBytes());
int startingOffset = finder.findIn(bufferToSearch);
その startingOffset は、チャネル バッファー内の一致したバイト シーケンスの最初のバイトのオフセットです。
このようなものが必要な場合は、お役に立てば幸いです。これは、そのためのテスト ケースの始まりです。
ChannelBuffer.indexOf(...) を使用して ChannelBufferIndexFinder をメソッドに渡すことはできませんか?