Skip to content

Commit

Permalink
Добавление теста. Выделение в отдельную функцию
Browse files Browse the repository at this point in the history
  • Loading branch information
Stivo182 committed Jan 28, 2025
1 parent 12efbdd commit 0a89b1e
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 47 deletions.
103 changes: 63 additions & 40 deletions src/Классы/ВходящийЗапрос.os
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@

ЧастьРазделителя = ПолучитьДвоичныеДанныеИзСтроки("--");
ЧастьРазделителяСВКПС = ПолучитьДвоичныеДанныеИзСтроки("--" + Символы.ВК + Символы.ПС);
РазделительСтрок = ПолучитьДвоичныеДанныеИзСтроки(Символы.ВК + Символы.ПС);

Если СтрНайти(НРег(Заголовки["Content-Type"]), "multipart/form-data") > 0 Тогда
РазделительДанных = СокрЛП(СтрЗаменить(Заголовки["Content-Type"], "multipart/form-data; boundary=", ""));
Expand All @@ -92,49 +91,16 @@
ИЛИ ЧастьФормы = ЧастьРазделителя Тогда
Продолжить;
КонецЕсли;
Структура = Новый Структура("Метаданные, Значение", Новый Соответствие);

РазделеннаяЧастьФормы = Парсеры.РазделитьДвоичныеДанныеРазделителемВМассив(ЧастьФормы, РазделительСтрок);

Если РазделеннаяЧастьФормы[РазделеннаяЧастьФормы.ВГраница()] = ЧастьРазделителя Тогда
РазделеннаяЧастьФормы.Удалить(РазделеннаяЧастьФормы.ВГраница());
КонецЕсли;

Если РазделеннаяЧастьФормы.Количество() = 1 Тогда
Метаданные = РазделеннаяЧастьФормы[0];
ИначеЕсли РазделеннаяЧастьФормы.Количество() > 1 Тогда
МетаданныеДД = Новый Массив();
ЗначениеДД = Новый Массив();

ЭтоМетаданные = Истина;
Для Каждого РазделеннаяЧасть Из РазделеннаяЧастьФормы Цикл
Если РазделеннаяЧасть.Размер() = 0 Тогда
Если ЭтоМетаданные И МетаданныеДД.Количество() > 0 Тогда
ЭтоМетаданные = Ложь;
КонецЕсли;
Продолжить;
КонецЕсли;

Если ЭтоМетаданные Тогда
МассивДД = МетаданныеДД;
Иначе
МассивДД = ЗначениеДД;
КонецЕсли;

Если МассивДД.Количество() > 0 Тогда
МассивДД.Добавить(РазделительСтрок);
КонецЕсли;

МассивДД.Добавить(РазделеннаяЧасть);
КонецЦикла;

Метаданные = СоединитьДвоичныеДанные(МетаданныеДД);
Структура.Значение = СоединитьДвоичныеДанные(ЗначениеДД);
Иначе
РазделенныеДанные = РазделитьДвоичныеДанныеПоляДанныхФормы(ЧастьФормы);
Если РазделенныеДанные = Неопределено Тогда
Продолжить;
КонецЕсли;

Структура = Новый Структура("Метаданные, Значение", Новый Соответствие);
Структура.Значение = РазделенныеДанные.Значение;

СтрокиМетаданных = СтрРазделить(ПолучитьСтрокуИзДвоичныхДанных(Метаданные), Символы.ПС, Ложь);
СтрокиМетаданных = СтрРазделить(ПолучитьСтрокуИзДвоичныхДанных(РазделенныеДанные.Метаданные), Символы.ПС, Ложь);

ПлоскиеЗаголовки = Новый Соответствие();

Expand Down Expand Up @@ -190,6 +156,63 @@
Возврат Результат;
КонецФункции

Функция РазделитьДвоичныеДанныеПоляДанныхФормы(ЧастьФормы)

Структура = Новый Структура("Метаданные, Значение", Новый Соответствие);

ЧастьРазделителя = ПолучитьДвоичныеДанныеИзСтроки("--");
РазделительСтрок = ПолучитьДвоичныеДанныеИзСтроки(Символы.ВК + Символы.ПС);

РазделеннаяЧастьФормы = Парсеры.РазделитьДвоичныеДанныеРазделителемВМассив(ЧастьФормы, РазделительСтрок);

Если РазделеннаяЧастьФормы[РазделеннаяЧастьФормы.ВГраница()] = ЧастьРазделителя Тогда
РазделеннаяЧастьФормы.Удалить(РазделеннаяЧастьФормы.ВГраница());
КонецЕсли;

Если РазделеннаяЧастьФормы.Количество() = 1 Тогда
Структура.Метаданные = РазделеннаяЧастьФормы[0];
ИначеЕсли РазделеннаяЧастьФормы.Количество() > 1 Тогда
МетаданныеДД = Новый Массив();
ЗначениеДД = Новый Массив();

ЭтоМетаданные = Истина;
ПропущенПервыйРазделитель = Ложь;
Для Каждого РазделеннаяЧасть Из РазделеннаяЧастьФормы Цикл
ЭтоЗамененныйРазделитель = РазделеннаяЧасть.Размер() = 0;
МетаданныеЗаполнены = МетаданныеДД.Количество() > 0;

Если ЭтоМетаданные И ЭтоЗамененныйРазделитель И МетаданныеЗаполнены Тогда
ЭтоМетаданные = Ложь;
ПропущенПервыйРазделитель = Ложь;
КонецЕсли;

Если ЭтоЗамененныйРазделитель И Не ПропущенПервыйРазделитель Тогда
ПропущенПервыйРазделитель = Истина;
Продолжить;
КонецЕсли;

Если ЭтоМетаданные Тогда
МассивДД = МетаданныеДД;
Иначе
МассивДД = ЗначениеДД;
КонецЕсли;

Если МассивДД.Количество() > 0 Тогда
МассивДД.Добавить(РазделительСтрок);
КонецЕсли;

МассивДД.Добавить(РазделеннаяЧасть);
КонецЦикла;

Структура.Метаданные = СоединитьДвоичныеДанные(МетаданныеДД);
Структура.Значение = СоединитьДвоичныеДанные(ЗначениеДД);
Иначе
Возврат Неопределено;
КонецЕсли;

Возврат Структура;
КонецФункции

Функция ЭтоЗапросНаВебСокет() Экспорт
КлючРукопожатия = Заголовки["Sec-WebSocket-Key"];
Возврат НЕ КлючРукопожатия = Неопределено И НЕ ПустаяСтрока(КлючРукопожатия);
Expand Down
Binary file modified tests/features/multipart-form-data
Binary file not shown.
22 changes: 15 additions & 7 deletions tests/parser.os
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,12 @@

//Тогда
Ожидаем.Что(Результат).ИмеетТип("Массив");
Ожидаем.Что(Результат.Количество()).Равно(5);
Ожидаем.Что(Результат.Количество()).Равно(6);
Ожидаем.Что(Результат[1]).Равно(ПолучитьДвоичныеДанныеИзСтроки(Символы.ВК + Символы.ПС + "Content-Disposition: form-data; name=""name""" + Символы.ВК + Символы.ПС + Символы.ВК + Символы.ПС + "nonamed" + Символы.ВК + Символы.ПС + "--"));
Ожидаем.Что(ПолучитьСтрокуИзДвоичныхДанных(Результат[2])).Равно(Символы.ВК + Символы.ПС + "Content-Disposition: form-data; name=""age""" + Символы.ВК + Символы.ПС + Символы.ВК + Символы.ПС + "2023-09-13" + Символы.ВК + Символы.ПС + "--");
Ожидаем.Что(Результат[2]).Равно(ПолучитьДвоичныеДанныеИзСтроки(Символы.ВК + Символы.ПС + "Content-Disposition: form-data; name=""text""" + Символы.ВК + Символы.ПС + Символы.ВК + Символы.ПС + "text1" + Символы.ВК + Символы.ПС + Символы.ВК + Символы.ПС + "text2" + Символы.ВК + Символы.ПС + "--"));
Ожидаем.Что(ПолучитьСтрокуИзДвоичныхДанных(Результат[3])).Равно(Символы.ВК + Символы.ПС + "Content-Disposition: form-data; name=""age""" + Символы.ВК + Символы.ПС + Символы.ВК + Символы.ПС + "2023-09-13" + Символы.ВК + Символы.ПС + "--");
Ожидаем.Что((ПолучитьСтрокуИзДвоичныхДанных(Результат[0]))).Равно("--");
Ожидаем.Что((ПолучитьСтрокуИзДвоичныхДанных(Результат[4]))).Равно("--" + Символы.ВК + Символы.ПС);
Ожидаем.Что((ПолучитьСтрокуИзДвоичныхДанных(Результат[5]))).Равно("--" + Символы.ВК + Символы.ПС);

КонецПроцедуры

Expand Down Expand Up @@ -54,21 +55,28 @@

// Тогда
Ожидаем.Что(ДанныеФормы).ИмеетТип("ДанныеСоставнойФормы");
Ожидаем.Что(ДанныеФормы.Количество()).Равно(3);
Ожидаем.Что(ДанныеФормы.Количество()).Равно(4);

Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(0)).ИмеетТип("Структура");
Ожидаем.Что(ПолучитьСтрокуИзДвоичныхДанных(ДанныеФормы.ПолучитьПоИндексу(0).Значение)).Равно("nonamed");
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(0).Метаданные).ИмеетТип("Соответствие");
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(0).Метаданные["Content-Disposition"]).ИмеетТип("Соответствие");
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(0).Метаданные["Content-Disposition"].Количество()).Равно(2);
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(0).Метаданные["Content-Disposition"]["name"]).Равно("name");

Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(1)).ИмеетТип("Структура");
Ожидаем.Что(ПолучитьСтрокуИзДвоичныхДанных(ДанныеФормы.ПолучитьПоИндексу(1).Значение)).Равно("2023-09-13");
Ожидаем.Что(ПолучитьСтрокуИзДвоичныхДанных(ДанныеФормы.ПолучитьПоИндексу(1).Значение)).Равно("text1" + Символы.ВК + Символы.ПС + Символы.ВК + Символы.ПС + "text2");
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(1).Метаданные).ИмеетТип("Соответствие");
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(1).Метаданные["Content-Disposition"]).ИмеетТип("Соответствие");
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(1).Метаданные["Content-Disposition"].Количество()).Равно(2);
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(1).Метаданные["Content-Disposition"]["name"]).Равно("age");
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(1).Метаданные["Content-Disposition"]["name"]).Равно("text");

Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(2)).ИмеетТип("Структура");
Ожидаем.Что(ПолучитьСтрокуИзДвоичныхДанных(ДанныеФормы.ПолучитьПоИндексу(2).Значение)).Равно("2023-09-13");
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(2).Метаданные).ИмеетТип("Соответствие");
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(2).Метаданные["Content-Disposition"]).ИмеетТип("Соответствие");
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(2).Метаданные["Content-Disposition"].Количество()).Равно(2);
Ожидаем.Что(ДанныеФормы.ПолучитьПоИндексу(2).Метаданные["Content-Disposition"]["name"]).Равно("age");

Ожидаем.Что(ДанныеФормы.НайтиЗначениеСтрокойПоМетаданным(РабочийОтбор)).Равно("nonamed");
Ожидаем.Что(ДанныеФормы.НайтиЗначениеПоМетаданным(РабочийОтбор)).Равно(ПолучитьДвоичныеДанныеИзСтроки("nonamed"));
Expand Down

0 comments on commit 0a89b1e

Please sign in to comment.