簡體   English   中英

從套接字字節 stream 正確讀取 HTTP POST 請求的最佳方法是什么?

[英]What is the best way to correctly read a HTTP POST request from a socket byte stream?

我正在接受這樣的 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\John Doe\wwwroot,它最終會是:C%3A%5CUsers%5John+Doe%5Cwwwroot

index.html 變為 index.html++++++++++++++++++++++++++++++++

似乎我以某種方式弄錯了編碼,但是我嘗試了多種編碼,並且它們具有相同的怪異之處。 從套接字字節 stream 正確讀取 HTTP POST 請求的最佳方法是什么?

您需要修剪要傳遞給 GetString 方法的字節數組receive 現在,您正在傳遞所有 1024 個字節,因此 GetString 方法正在嘗試盡可能地對它們進行編碼。

您需要使用received的變量來指示您正在編碼的字符串的范圍。

首先,您不需要對輸入進行解碼,HTTP 是 ASCII,僅使用字節會更快。 現在,您要做的是定義最大 HTTP 請求 header 大小,比如 4K? 然后您將繼續讀取字節,直到您點擊 \r\n\r\n 這表示 HTTP 請求的結束。 您需要強制執行此最大 header 大小限制,否則單個惡意用戶可能會發送無限的 HTTP 請求,您的服務器將用完 memory。

您應該閱讀 HTTP 規范。

根據您的 HTTP 請求,HTTP 的內容可能很多,您需要采取相應的行動。 HTTP 協議本身始終是 ASCII,因此您可以將其視為字節,但內容的編碼方式可能非常不同。 這通常由 Content-Type 解釋:header。 但同樣,請閱讀 HTTP 規范。

您應該使用 System.Web.HttpUtility.UrlDecode 而不是 Encoding.ASCII 來執行解碼。

您可能會通過將 Encoding.Default 作為第二個參數傳遞給此 static 方法而僥幸成功。

您正在看到 HTML 表單 POST 的結果,該表單對值進行編碼,就好像它們作為搜索字符串附加到 URL 一樣。 因此,它是一組以 & 分隔的名稱=值對。 任何帶外字符都被編碼為其十六進制值 %xx。

UrlDecode 方法將為您解碼所有這些。

正如其他人所說,您確實需要將 stream 分塊,它可能大於 1K。

嚴格來說,您應該檢查 Content-Type header 的任何;CharSet= 屬性。 如果存在,您需要確保傳遞給 UrlDecode 的字符編碼適合該 CharSet(例如,如果 CharSet=UTF-8 則使用 Encoding.UTF8)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM