HTTPヘッダフィールド値のすべての部分を解析
質問
私は、パケット(どちらかのTCPが再構築されたり、あなたはそれがあると仮定することができない)から直接解析HTTPデータをしています。
私は正確にできるだけ解析HTTPへの最善の方法を探しています。
ここでの主な問題はあるHTTPヘッダーます。
基本的な RFC HTTP / 1.1 ののを見ると、そのHTTPヘッダと思われます解析は複雑になります。 RFCは、ヘッダの異なる部分のための非常に複雑な正規表現を記述します。
万一私がHTTPヘッダー?
のさまざまな部分を解析するためにこれらの正規表現を書きます私はHTTPヘッダーのために、これまで書いてきた基本的な解析は、一般的なHTTPヘッダーのためです。
message-header = field-name ":" [ field-value ]
セクション4.2で説明したように、は私は値をカンマ区切りと同じLWS
とヘッダをSP
とインナーfield-name
を交換し、繰り返し含まれました。
しかし、例えばセクション14.9を見ていることfield-value
の異なる部分を解析するために、私ははるかに複雑な解析手法が必要であることを示すだろう。
どのように私は、パーサーユーザーにHTTPのすべての機能を与え、HTTP?
のすべての部分を解析したいと仮定すると、私はHTTP構文解析の複雑な部品(特にfield-value
)を処理する必要があります示唆します
このため、デザインの提案もいただければ幸いです。
感謝します。
解決
私はシングル責任の校長をたどります。むしろ人に知られているすべてのHTTPヘッダーのすべての詳細を知っている単一のモノリシックパーサを作成しようとするよりも、単純に行きます。それ自体はだけで、フィールド名を解析し、生の値でその名前を関連付けるに対処するための責任があるという単純な拡張可能なパーサを書きます。そして、ヘッダのみの一種類を解析するための責任があるプラグ可能な拡張機能を使用しています。あなたはパーサのインスタンスを作成すると、拡張子のコレクションを注入し、それを解析する方法を知っているかどうか、フィールド名のセットに、各拡張子をマップします。
あなたは、このアプローチには一石二鳥。あなたのコアパーサは簡単で、目標のまま。あなたはまた、より堅牢なコードになり、その根性と周り混乱することなく、あなたのパーサを拡張する機能を、得ることができます。
他のヒント
System.Net.Http.Headers
名前空間内のパーサの束があります。それの一見の価値を持っています。