Каков наилучший способ правильно прочитать запрос HTTP POST из потока байтов сокета? - PullRequest
0 голосов
/ 10 марта 2009

Я принимаю 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 ++++++++++++++++++++++++++++++++

Кажется, я как-то неправильно понимаю кодировку, однако я пробовал несколько кодировок, и они имеют одну и ту же странность. Каков наилучший способ правильно прочитать запрос HTTP POST из потока байтов сокета?

Ответы [ 3 ]

1 голос
/ 10 марта 2009

Вам нужно обрезать байтовый массив receive, который вы передаете методу GetString. Прямо сейчас вы передаете все 1024 байта, поэтому метод GetString пытается закодировать их как можно лучше.

Вам необходимо использовать переменную received для указания границ кодируемой строки.

0 голосов
/ 10 марта 2009

Вы должны использовать System.Web.HttpUtility.UrlDecode, а не Encoding.ASCII, чтобы выполнить декодирование.

Вероятно, вам не удастся передать Encoding.Default в качестве второго параметра этому статическому методу.

Вы видите результат HTML-формы POST, которая кодирует значения, как если бы они добавлялись к URL-адресу в виде строки поиска. Следовательно, это набор пар «имя = значение» с разделителями. Любые внеполосные символы кодируются в их шестнадцатеричное значение% xx.

Метод UrlDecode расшифрует все это для вас.

Как уже говорили другие, вам действительно нужно разделить поток на части, он может быть больше, чем 1K.

Строго говоря, вы должны проверить заголовок Content-Type для любого атрибута CharSet =. При наличии необходимо убедиться, что кодировка символа, передаваемая вами в UrlDecode, соответствует этому CharSet (например, если CharSet = UTF-8, тогда используйте Encoding.UTF8).

0 голосов
/ 10 марта 2009

Во-первых, вам не нужно декодировать входные данные, HTTP - это ASCII, и работать быстрее будет только с байтами. Теперь вам нужно определить максимальный размер заголовка HTTP-запроса, скажем, 4K? и тогда вы будете продолжать читать байты, пока не нажмете \ r \ n \ r \ n, что сигнализирует об окончании HTTP-запроса. Вам нужно будет применить это ограничение максимального размера заголовка, иначе один злонамеренный пользователь может отправить бесконечный HTTP-запрос, и вашему серверу не хватит памяти.

Вы должны прочитать спецификацию HTTP.

В зависимости от вашего HTTP-запроса, HTTP-контент может состоять из множества вещей, и вам нужно действовать соответственно. Сам протокол HTTP всегда является ASCII, поэтому вы можете рассматривать его как просто байты, но содержимое может быть закодировано совершенно по-разному. Обычно это объясняется заголовком Content-Type :. Но опять же, прочитайте спецификацию HTTP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...