С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
2 / 2 / 0
Регистрация: 10.04.2013
Сообщений: 82

Парсинг HTTP запроса

28.02.2018, 11:57. Показов 6331. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Прошу помощи.
Отправляю себе на сервер http данный с multiform


на сервере их благополочно получаю в виде потока и пишу их в файл.

XML
1
2
3
4
5
6
7
8
9
10
11
12
OST / HTTP/1.1
Host: 127.0.0.1:3228
Connection: keep-alive
Accept-Encoding: gzip,deflate
Content-Type: multipart/form-data; boundary=----------------IU2Cm3GobVjsv7Du
Content-Length: 66572
 
------------------IU2Cm3GobVjsv7Du
Content-Disposition: form-data; name="file1"; filename="test.wav"
Content-Type: audio/wav
 
RIFFZ WAVEfmt      @  Ђ>    data6           и далее, далее ( это содержание файла)
К сожалению в потоке оказывается мусор который писать в файл не нужно.
А именно:
OST / HTTP/1.1
Host: 127.0.0.1:3228
Connection: keep-alive
Accept-Encoding: gzip,deflate
Content-Type: multipart/form-data; boundary=----------------IU2Cm3GobVjsv7Du
Content-Length: 66572

------------------IU2Cm3GobVjsv7Du
Content-Disposition: form-data; name="file1"; filename="test.wav"
Content-Type: audio/wav

Можно ли как то от него избавиться?!
Возможно парсировать.


Данные получаю и пишу в файл так:
C#
1
2
3
4
5
6
while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0)
             {
 
                byte[] FileArray = Buffer;
                save_array_to_file("test.wav", FileArray);
                var test2 = Client.GetStream().ToString();

Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.02.2018, 11:57
Ответы с готовыми решениями:

Async Task парсинг Http с использованием AngleSharp
Прошу совета, помощи. Запрос http: public static async Task<string> GetHttp(string requestUri) { using...

Обработка http запроса
Доброго времени суток! Требуется сделать следующее. По запросу к примеру "get_some_info" мое приложение (слушающее определенный порт...

Создание Http запроса к серверу
Вот нужный http запрос POST /2/files/get_preview Host: https://content.dropboxapi.com User-Agent: api-explorer-client ...

8
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
28.02.2018, 12:40
Цитата Сообщение от CROM Посмотреть сообщение
Можно ли как то от него избавиться?!
Избавиться от чего ? Если от заголовков - то их формировать можно вручную, только те, что необходимы.
0
2 / 2 / 0
Регистрация: 10.04.2013
Сообщений: 82
28.02.2018, 12:42  [ТС]
да, именно от него.
Мне нужно получить только Body (т.е сам переданный файл)

Предполагаю что должен быть парсер какой либо в базовой комплектации который из запроса вытягивает Body.
Но никак не могу нагуглить.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
28.02.2018, 12:44
Используйте WebRequest, WebClient
0
2 / 2 / 0
Регистрация: 10.04.2013
Сообщений: 82
28.02.2018, 12:48  [ТС]
Как я понял это для отправки запроса?!

На это ( пока что) я повлиять не могу. Нужен вариант с обработкой конечного результата на стороне сервера.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
28.02.2018, 12:49
Цитата Сообщение от CROM Посмотреть сообщение
Нужен вариант с обработкой конечного результата на стороне сервера.
Ну тогда вам нужно обрабатывать данные на серверной стороне. Вы IIS используете чтоль ?
0
2 / 2 / 0
Регистрация: 10.04.2013
Сообщений: 82
28.02.2018, 12:54  [ТС]
Пытаюсь запилить голосовое управление через сайт.

на сторону сервера приходит wav файл который должен анализироваться.
Застрял какраз на передаче файла.

код получения на стороне сервера

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 // Конструктор класса. Ему нужно передавать принятого клиента от TcpListener
         public Client(TcpClient Client)
         {
             // Объявим строку, в которой будет хранится запрос клиента
             string Request = "";
             // Буфер для хранения принятых от клиента данных
             byte[] Buffer = new byte[1048576];
             // Переменная для хранения количества байт, принятых от клиента
             int Count;
             string filedata = "";
             // Читаем из потока клиента до тех пор, пока от него поступают данные
 
             while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0)
             {
               //Запись данных в файл
 
                byte[] FileArray = Buffer;
                save_array_to_file("test.wav", FileArray);
                var test2 = Client.GetStream().ToString();
}
Как видно я не могу получить читсый body Запроса ( не знаю как точнее)
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
28.02.2018, 13:09
У вас сервер на C# написан ?

Добавлено через 48 секунд
Цитата Сообщение от CROM Посмотреть сообщение
на сторону сервера приходит wav файл который должен анализироваться
На чем написан сервер ?
0
2 / 2 / 0
Регистрация: 10.04.2013
Сообщений: 82
28.02.2018, 13:11  [ТС]
C#

Вот листинг

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
 
namespace ConsoleApplication4
{
 
    class Client
    {
 
        private void save_array_to_file(string filename, byte[] FileArray)
        {
 
            using (Stream file = File.OpenWrite(filename))
                {
                    file.Write(FileArray, 0, FileArray.Length);
                }
 
            clear_file(filename);
        }
 
 
        private void clear_file(string filename)
        { 
            
        
        }
 
 
 
         private void SendError(TcpClient Client, int Code)
            {
                // Получаем строку вида "200 OK"
                // HttpStatusCode хранит в себе все статус-коды HTTP/1.1
                string CodeStr = Code.ToString() + " " + ((HttpStatusCode)Code).ToString();
                // Код простой HTML-странички
                string Html = "<html><body><h1>" + CodeStr + "</h1></body></html>";
                // Необходимые заголовки: ответ сервера, тип и длина содержимого. После двух пустых строк - само содержимое
                string Str = "HTTP/1.1 " + CodeStr + "\nContent-type: text/html\nContent-Length:" + Html.Length.ToString() + "\n\n" + Html;
                // Приведем строку к виду массива байт
                byte[] Buffer = Encoding.ASCII.GetBytes(Str);
                // Отправим его клиенту
                Client.GetStream().Write(Buffer,  0, Buffer.Length);
                // Закроем соединение
                Client.Close();
            }
 
 
        // Конструктор класса. Ему нужно передавать принятого клиента от TcpListener
         public Client(TcpClient Client)
         {
             // Объявим строку, в которой будет хранится запрос клиента
             string Request = "";
             // Буфер для хранения принятых от клиента данных
             byte[] buffer = new byte[1048576];
             // Переменная для хранения количества байт, принятых от клиента
             int Count;
             string filedata = "";
             // Читаем из потока клиента до тех пор, пока от него поступают данные
 
             while ((Count = Client.GetStream().Read(buffer, 0, buffer.Length)) > 0)
             {
                int contentLength = 0;
                string headerString = "";
                headerString += Encoding.ASCII.GetString(buffer);
                Regex reg = new Regex("\\\r\nContent-Length: (.*?)\\\r\n");
                Match m = reg.Match(headerString);
                contentLength = int.Parse(m.Groups[1].ToString());
 
                byte[] file = new byte[contentLength];
                Buffer.BlockCopy(buffer, 0, file, 0, contentLength);
 
 
                byte[] FileArray = buffer;
                save_array_to_file("test.wav", FileArray);
                var test2 = Client.GetStream().ToString();
 
                 // Преобразуем эти данные в строку и добавим ее к переменной Request
                 Request += Encoding.ASCII.GetString(buffer, 0, Count);
                 // Запрос должен обрываться последовательностью \r\n\r\n
                 // Либо обрываем прием данных сами, если длина строки Request превышает 4 килобайта
                 // Нам не нужно получать данные из POST-запроса (и т. п.), а обычный запрос
                 // по идее не должен быть больше 1 мегабайт
                 if (Request.IndexOf("\r\n\r\n") >= 0 || Request.Length > 1048576)  //проверить
                 {
                     break;
                 }
             }
 
             if (Request.StartsWith("GET") == true)
             {
                 // Парсим строку запроса с использованием регулярных выражений
                 // При этом отсекаем все переменные GET-запроса
                 Match ReqMatch = Regex.Match(Request, @"^\w+\s+([^\s\?]+)[^\s]*\s+HTTP/.*|");
 
                 // Если запрос не удался
                 if (ReqMatch == Match.Empty)
                 {
                     // Передаем клиенту ошибку 400 - неверный запрос
                     SendError(Client, 400);
                     return;
                 }
 
                 // Получаем строку запроса
                 string RequestUri = ReqMatch.Groups[1].Value;
 
                 // Приводим ее к изначальному виду, преобразуя экранированные символы
                 // Например, "%20" -> " "
                 RequestUri = Uri.UnescapeDataString(RequestUri);
 
                 // Если в строке содержится двоеточие, передадим ошибку 400
                 // Это нужно для защиты от URL типа http://example.com/file.txt
                 if (RequestUri.IndexOf("..") >= 0)
                 {
                     SendError(Client, 400);
                     return;
                 }
 
                 // Если строка запроса оканчивается на "/", то добавим к ней index.html
                 if (RequestUri.EndsWith("/"))
                 {
                     RequestUri += "index.html";
                 }
 
 
                 string FilePath = "www" + RequestUri;
 
                 // Если в папке www не существует данного файла, посылаем ошибку 404
                 if (!File.Exists(FilePath))
                 {
                     SendError(Client, 404);
                     return;
                 }
 
                 // Получаем расширение файла из строки запроса
                 string Extension = RequestUri.Substring(RequestUri.LastIndexOf('.'));
 
                 // Тип содержимого
                 string ContentType = "";
 
                 // Пытаемся определить тип содержимого по расширению файла
                 switch (Extension)
                 {
                     case ".htm":
                     case ".html":
                         ContentType = "text/html";
                         break;
                     case ".css":
                         ContentType = "text/stylesheet";
                         break;
                     case ".js":
                         ContentType = "text/javascript";
                         break;
                     case ".jpg":
                         ContentType = "image/jpeg";
                         break;
                     case ".jpeg":
                     case ".png":
                     case ".gif":
                         ContentType = "image/" + Extension.Substring(1);
                         break;
                     default:
                         if (Extension.Length > 1)
                         {
                             ContentType = "application/" + Extension.Substring(1);
                         }
                         else
                         {
                             ContentType = "application/unknown";
                         }
                         break;
                 }
 
                 // Открываем файл, страхуясь на случай ошибки
                 FileStream FS;
                 try
                 {
                     FS = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
                 }
                 catch (Exception)
                 {
                     // Если случилась ошибка, посылаем клиенту ошибку 500
                     SendError(Client, 500);
                     return;
                 }
 
                 // Посылаем заголовки
                 string Headers = "HTTP/1.1 200 OK\nContent-Type: " + ContentType + "\nContent-Length: " + FS.Length + "\n\n";
                 byte[] HeadersBuffer = Encoding.ASCII.GetBytes(Headers);
                 Client.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length);
 
                 // Пока не достигнут конец файла
                 while (FS.Position < FS.Length)
                 {
                     // Читаем данные из файла
                     Count = FS.Read(buffer, 0, buffer.Length);
                     // И передаем их клиенту
                     Client.GetStream().Write(buffer, 0, Count);
                 }
 
                 // Закроем файл и соединение
                 FS.Close();
                 Client.Close();
             }
             else
             { //post request 
 
                 string last_string = "Content-Type: audio/wav";
 
                 int indexOfChar = filedata.IndexOf(last_string);
                 if (indexOfChar != -1)
                 {
                     string data = filedata.Substring(indexOfChar, filedata.Length - indexOfChar);
                     byte[] FileArray = Encoding.ASCII.GetBytes(data);
               
                    using (Stream file = File.OpenWrite("test.wav"))
                    {
                        file.Write(FileArray, 0, FileArray.Length);
                    }
 
                 }
 
             }
        }
        
    }
 
     
 
 
        class Server
        {
            TcpListener Listener; // Объект, принимающий TCP-клиентов
 
            // Запуск сервера
            public Server(int Port)
            {
                // Создаем "слушателя" для указанного порта
                Listener = new TcpListener(IPAddress.Any, Port);
                Listener.Start(); // Запускаем его
 
                // В бесконечном цикле
                while (true)
                {
                    // Принимаем нового клиента
                    TcpClient Client = Listener.AcceptTcpClient();
                    // Создаем поток
                    Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
                    // И запускаем этот поток, передавая ему принятого клиента
                    Thread.Start(Client);
                }
            }
 
            // Остановка сервера
            ~Server()
            {
                // Если "слушатель" был создан
                if (Listener != null)
                {
                    // Остановим его
                    Listener.Stop();
                }
            }
 
        static void ClientThread(Object StateInfo)
        {
            new Client((TcpClient)StateInfo);
        }
 
        
        static void Main(string[] args)
        {
 
            // Определим нужное максимальное количество потоков
            // Пусть будет по 16 на каждый процессор
            int MaxThreadsCount = Environment.ProcessorCount * 16;
            // Установим максимальное количество рабочих потоков
            ThreadPool.SetMaxThreads(MaxThreadsCount, MaxThreadsCount);
            // Установим минимальное количество рабочих потоков
            ThreadPool.SetMinThreads(2, 2);
 
             new Server(3228);
 
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.02.2018, 13:11
Помогаю со студенческими работами здесь

Измерить время http запроса/ответа
Здравствуйте. Если рассматривать http head запрос, то можно ли средствами .net узнать время ответа dns, время установки связи, время...

Обработка исключения путём взятия ошибки из полученного http запроса
using (HttpRequest httpRequest = new HttpRequest()) { try { ...

Http POST отправка файла в теле запроса
Всем привет! Пытаюсь отправить файл на сервер, но со стороны сервера мне говорят, что нужно отправлять файл в теле запроса, не пойму как...

Расшифровка/декодирование/парсинг данных из "ответа" POST-запроса
Здравствуйте. Пишу софт под фейсбук, и чтобы отправить один POST-запрос, нужно сначала спарсить данные из ответа другого POST-запроса....

Парсинг http
Пришлось написать парсер, вроде как-то парсит, но всёрогно не уследить за всем, где-то та касяки будут. Может есть ли готовые либы для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru