2009-03-10 9 views
0

は、私はそうのようなPOSTリクエストを受け付けています:私は、テキストは、彼らが+の背後の多くで終わる多くの時間を値投稿する場合ソケットバイトストリームからHTTP POST要求を正しく読み取る最良の方法は何ですか?

Socket connection = m_connection; 
Byte[] receive = new Byte[1024]; 

int received = connection.Receive(receive); 
Console.WriteLine(received.ToString()); 

string request = Encoding.ASCII.GetString(receive); 
Console.WriteLine(request); 

ポストの値は、奇妙になってしまいます。私はC投稿する場合:\ Users \ユーザージョン・ドウ\ wwwrootにし、それが終わるビーイング:C%3A%の5CUsers%5John +ドウ%5Cwwwroot

のindex.htmlはindex.htmlに私が取得しています思える

を++++++++++++++++++++++++++++++++なり、何とかエンコーディングが間違っていますが、私は複数のエンコーディングを試みましたが、それらは同じ不思議さを持っています。ソケットバイトストリームからHTTP POST要求を正しく読み取る最良の方法は何ですか?

答えて

1

デコードを実行するには、Encoding.ASCIIではなくSystem.Web.HttpUtility.UrlDecodeを使用する必要があります。

この静的メソッドの2番目のパラメータとして、Encoding.Defaultを渡すことになります。

URLに検索文字列として追加されているかのように値をエンコードするHTMLフォームPOSTの結果が表示されます。従って、名前=値の組の区切られたセットは&である。帯域外文字は、その16進値%xxにエンコードされます。

UrlDecodeメソッドは、これをすべてデコードします。

もう1つは、実際にストリームをチャンクする必要があると述べたように、それは1Kよりも大きくなる可能性があります。

厳密に言えば、Content-TypeヘッダーのCharSet =属性を確認する必要があります。存在する場合、UrlDecodeに渡す文字エンコードがそのCharSetに適していることを確認する必要があります(たとえば、CharSet = UTF-8の場合はEncoding.UTF8を使用します)。

2

GetStringメソッドに渡すバイト配列receiveをトリムする必要があります。現在、1024バイトすべてを渡しているので、GetStringメソッドは可能な限りエンコードしようとしています。

エンコードする文字列の境界を示すには、received変数を使用する必要があります。

1

まず、入力をデコードする必要はありません.HTTPはASCIIで、バイトだけで処理する方が高速です。さて、あなたがしたいことは、HTTPリクエストヘッダの最大サイズ、たとえば4Kを定義することです。 \ r \ n \ r \ nに達するまでバイトを読み込み続けます。これは、HTTPリクエストの終了を知らせます。この最大ヘッダーサイズの制限を実施する必要があります。そうしないと、1人の悪意のあるユーザーが無限のHTTP要求を送信し、サーバーのメモリが不足します。

HTTP仕様を読む必要があります。

HTTPリクエストに応じて、HTTPコンテンツは多くのことになります。それに応じて行動する必要があります。 HTTPプロトコル自体は常にASCIIなので、それを単なるバイトとして扱うことができますが、コンテンツは非常に異なった方法でエンコードできます。これは一般的にContent-Type:ヘッダーで説明されています。しかし、HTTP仕様を読んでください。

関連する問題