@@ -57,7 +57,7 @@ namespace HttpServer
5757 (
5858 const Socket &sock,
5959 const std::chrono::milliseconds &timeout,
60- const std::string &str,
60+ std::string &str,
6161 const size_t leftBytes,
6262 const std::unordered_map<std::string, std::string> ¶ms,
6363 std::unordered_multimap<std::string, std::string> &data,
@@ -82,26 +82,25 @@ namespace HttpServer
8282
8383 // Создание буферов
8484 std::vector<std::string::value_type> buf (buf_len);
85- std::string str_buf = str;
8685
8786 size_t str_cur; // Текущая позиция в буфере
8887
8988 size_t recv_len; // Прочитано байт при последнем извлечении данных из сокета
9089 size_t read_len = 0 ; // Прочитано байт из сокета всего
9190
9291 // Поиск разделителя блока данных
93- str_cur = str_buf .find (block_delimiter);
92+ str_cur = str .find (block_delimiter);
9493
9594 if (std::string::npos == str_cur)
9695 {
9796 // Получить следующий кусок данных
98- if (false == append (sock, timeout, buf, str_buf , data_end, leftBytes, recv_len, read_len) )
97+ if (false == append (sock, timeout, buf, str , data_end, leftBytes, recv_len, read_len) )
9998 {
10099 return false ;
101100 }
102101
103102 // Поиск разделителя блока данных
104- str_cur = str_buf .find (block_delimiter);
103+ str_cur = str .find (block_delimiter);
105104
106105 if (std::string::npos == str_cur)
107106 {
@@ -122,19 +121,19 @@ namespace HttpServer
122121 bool is_block_valid = true ;
123122
124123 // Поиск конца заголовков блока данных
125- size_t headers_end = str_buf .find (" \r\n\r\n " , str_cur);
124+ size_t headers_end = str .find (" \r\n\r\n " , str_cur);
126125
127126 // Если конец не был найден, то
128127 if (std::string::npos == headers_end)
129128 {
130129 // Получить следующий кусок данных
131- if (false == append (sock, timeout, buf, str_buf , data_end, leftBytes, recv_len, read_len) )
130+ if (false == append (sock, timeout, buf, str , data_end, leftBytes, recv_len, read_len) )
132131 {
133132 return false ;
134133 }
135134
136135 // Провести повторный поиск
137- headers_end = str_buf .find (" \r\n\r\n " , str_cur);
136+ headers_end = str .find (" \r\n\r\n " , str_cur);
138137
139138 // Если снова не найдено, то данные некорректны
140139 if (std::string::npos == headers_end)
@@ -148,24 +147,24 @@ namespace HttpServer
148147 // Разобрать заголовки блока данных
149148 std::unordered_map<std::string, std::string> headers;
150149
151- for (size_t line_end = str_buf .find (" \r\n " , str_cur); str_cur < headers_end; line_end = str_buf .find (" \r\n " , str_cur) )
150+ for (size_t line_end = str .find (" \r\n " , str_cur); str_cur < headers_end; line_end = str .find (" \r\n " , str_cur) )
152151 {
153- size_t delimiter = str_buf .find (' :' , str_cur);
152+ size_t delimiter = str .find (' :' , str_cur);
154153
155154 if (std::string::npos == delimiter || delimiter > line_end)
156155 {
157- std::string header_name = str_buf .substr (str_cur, line_end - str_cur);
156+ std::string header_name = str .substr (str_cur, line_end - str_cur);
158157 Utils::trim (header_name);
159158 headers.emplace (std::move (header_name), " " );
160159 }
161160 else
162161 {
163- std::string header_name = str_buf .substr (str_cur, delimiter - str_cur);
162+ std::string header_name = str .substr (str_cur, delimiter - str_cur);
164163 Utils::trim (header_name);
165164
166165 ++delimiter;
167166
168- std::string header_value = str_buf .substr (delimiter, line_end - delimiter);
167+ std::string header_value = str .substr (delimiter, line_end - delimiter);
169168 Utils::trim (header_value);
170169
171170 headers.emplace (std::move (header_name), std::move (header_value) );
@@ -271,39 +270,41 @@ namespace HttpServer
271270 if (file.is_open () )
272271 {
273272 // Смещение данных в буфере в начало
274- str_buf.assign (str_buf.cbegin () + str_cur, str_buf.cend () );
273+ // str.assign(str.cbegin() + str_cur, str.cend() );
274+ str.erase (str.begin (), str.begin () + str_cur);
275275
276276 // Поиск конца блока данных
277- size_t delimiter = str_buf .find (block_delimiter);
277+ size_t delimiter = str .find (block_delimiter);
278278
279279 // Пока конец блока данных не найден
280280 while (std::string::npos == delimiter)
281281 {
282282 // Добавить данные к значению
283- file.write (str_buf .data (), str_buf .length () - data_end.length () );
283+ file.write (str .data (), str .length () - data_end.length () );
284284
285- str_buf.assign (str_buf.cend () - data_end.length (), str_buf.cend () );
285+ // str.assign(str.cend() - data_end.length(), str.cend() );
286+ str.erase (str.begin (), str.end () - data_end.length () );
286287
287288 // Получить следующий кусок данных
288- if (false == append (sock, timeout, buf, str_buf , data_end, leftBytes, recv_len, read_len) )
289+ if (false == append (sock, timeout, buf, str , data_end, leftBytes, recv_len, read_len) )
289290 {
290291 return false ;
291292 }
292293
293294 // Поиск конца блока данных
294- delimiter = str_buf .find (block_delimiter);
295+ delimiter = str .find (block_delimiter);
295296 }
296297
297298 // Добавить последнюю часть данных к значению
298- file.write (str_buf .data (), delimiter);
299+ file.write (str .data (), delimiter);
299300
300301 // Добавить данные в список
301302 files.emplace (it_name->second , FileIncoming (std::move (tmp_name), it_filetype->second , file.tellp () ) );
302303
303304 file.close ();
304305
305306 // Если найден конец данных
306- if (str_buf .find (data_end, delimiter) == delimiter)
307+ if (str .find (data_end, delimiter) == delimiter)
307308 {
308309 is_find_data_end = true ;
309310 }
@@ -325,37 +326,39 @@ namespace HttpServer
325326 std::string value;
326327
327328 // Смещение данных в буфере в начало
328- str_buf.assign (str_buf.cbegin () + str_cur, str_buf.cend () );
329+ // str.assign(str.cbegin() + str_cur, str.cend() );
330+ str.erase (str.begin (), str.begin () + str_cur);
329331
330332 // Поиск конца блока данных
331- size_t delimiter = str_buf .find (block_delimiter);
333+ size_t delimiter = str .find (block_delimiter);
332334
333335 // Пока конец блока данных не найден
334336 while (std::string::npos == delimiter)
335337 {
336338 // Добавить данные к значению
337- value.append (str_buf .cbegin (), str_buf .cend () - data_end.length () );
339+ value.append (str .cbegin (), str .cend () - data_end.length () );
338340
339- str_buf.assign (str_buf.cend () - data_end.length (), str_buf.cend () );
341+ // str.assign(str.cend() - data_end.length(), str.cend() );
342+ str.erase (str.begin (), str.end () - data_end.length () );
340343
341344 // Получить следующий кусок данных
342- if (false == append (sock, timeout, buf, str_buf , data_end, leftBytes, recv_len, read_len) )
345+ if (false == append (sock, timeout, buf, str , data_end, leftBytes, recv_len, read_len) )
343346 {
344347 return false ;
345348 }
346349
347350 // Поиск конца блока данных
348- delimiter = str_buf .find (block_delimiter);
351+ delimiter = str .find (block_delimiter);
349352 }
350353
351354 // Добавить последнюю часть данных к значению
352- value.append (str_buf .cbegin (), str_buf .cbegin () + delimiter);
355+ value.append (str .cbegin (), str .cbegin () + delimiter);
353356
354357 // Добавить данные в список
355358 data.emplace (it_name->second , std::move (value) );
356359
357360 // Если найден конец данных
358- if (str_buf .find (data_end, delimiter) == delimiter)
361+ if (str .find (data_end, delimiter) == delimiter)
359362 {
360363 is_find_data_end = true ;
361364 }
@@ -383,29 +386,34 @@ namespace HttpServer
383386 if (false == is_block_valid)
384387 {
385388 // то блок данных пропускаем (ищем следующий блок)
386- str_cur = str_buf .find (block_delimiter, str_cur);
389+ str_cur = str .find (block_delimiter, str_cur);
387390
388391 while (std::string::npos == str_cur)
389392 {
390- str_buf.assign (str_buf.cend () - data_end.length (), str_buf.cend () );
393+ // str.assign(str.cend() - data_end.length(), str.cend() );
394+ str.erase (str.begin (), str.end () - data_end.length () );
391395
392396 // Получить следующий кусок данных
393- if (false == append (sock, timeout, buf, str_buf , data_end, leftBytes, recv_len, read_len) )
397+ if (false == append (sock, timeout, buf, str , data_end, leftBytes, recv_len, read_len) )
394398 {
395399 return false ;
396400 }
397401
398- str_cur = str_buf .find (block_delimiter);
402+ str_cur = str .find (block_delimiter);
399403 }
400404
401405 // Если найден конец данных
402- if (str_buf .find (data_end, str_cur) == str_cur)
406+ if (str .find (data_end, str_cur) == str_cur)
403407 {
404408 is_find_data_end = true ;
405409 }
406410
407411 str_cur += block_delimiter.length () + 2 ;
408412 }
413+
414+ str.erase (str.begin (), str.begin () + str_cur);
415+
416+ str_cur = 0 ;
409417 }
410418 while (false == is_find_data_end);
411419
0 commit comments