Skip to content

Commit

Permalink
feat: Поддержка в опции -F, --form перечисления файлов (#184)
Browse files Browse the repository at this point in the history
  • Loading branch information
Stivo182 authored Feb 23, 2025
1 parent 53d0fbb commit 90f2018
Show file tree
Hide file tree
Showing 7 changed files with 239 additions and 99 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -613,22 +613,49 @@
КонецЕсли;

КонструкторЗаписиДанных = Новый КонструкторПрограммногоКода();
ИмяПараметраРазделитель = ИмяПараметраРазделительДанныхMultipart;

// Данные формы
ДобавитьДанныеФормыВЗаписьДанныхMultipart(КонструкторЗаписиДанных);
ДобавитьДанныеФормыИзФайловВЗаписьДанныхMultipart(КонструкторЗаписиДанных);
ДобавитьФайлыВЗаписьДанныхMultipart(КонструкторЗаписиДанных);

Если КонструкторЗаписиДанных.Пустой() Тогда
Возврат;
КонецЕсли;

Конструктор
.ДобавитьСтроку("Поток = %1.ПолучитьТелоКакПоток();", ИмяПараметраHTTPЗапрос)
.ДобавитьПустуюСтроку()
.ДобавитьСтроку("РазделительСтрок = Символы.ВК + Символы.ПС;")
.ДобавитьСтроку("ЗаписьДанных = Новый ЗаписьДанных(Поток, , , """", """");")
.ДобавитьСтроку(КонструкторЗаписиДанных.ПолучитьРезультат())
.ДобавитьСтроку("ЗаписьДанных.ЗаписатьСтроку(""--"" + %1 + ""--"" + РазделительСтрок);", ИмяПараметраРазделительДанныхMultipart)
.ДобавитьСтроку("ЗаписьДанных.Закрыть();");

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

Процедура ДобавитьДанныеФормыВЗаписьДанныхMultipart(КонструкторЗаписиДанных)

ИмяПараметраРазделитель = ИмяПараметраРазделительДанныхMultipart;

Для Каждого ПередаваемыйТекст Из ОписаниеЗапроса.ОтправляемыеТекстовыеДанные Цикл

Если Не ПередаваемыйТекст.Назначение = НазначенияПередаваемыхДанных.ТелоЗапроса Тогда
Продолжить;
КонецЕсли;

ContentDisposition = ОбщегоНазначения.НайтиВСоответствииПоКлючуБезУчетаРегистра(
ПередаваемыйТекст.Заголовки,
"Content-Disposition");
ContentDisposition = ?(ContentDisposition = Неопределено, "form-data", ContentDisposition);

КонструкторЗаписиДанных
.ДобавитьКомментарий(
"Начало %1", ПередаваемыйТекст.ИмяПоля)
.ДобавитьСтроку(
"ЗаписьДанных.ЗаписатьСтроку(""--"" + %1 + РазделительСтрок);", ИмяПараметраРазделитель)
.ДобавитьСтроку(
"ЗаписьДанных.ЗаписатьСтроку(""Content-Disposition: form-data; name=""""%1"""""" + РазделительСтрок);",
"ЗаписьДанных.ЗаписатьСтроку(""Content-Disposition: %1; name=""""%2"""""" + РазделительСтрок);",
ContentDisposition,
ПередаваемыйТекст.ИмяПоля);

Если ЗначениеЗаполнено(ПередаваемыйТекст.ТипMIME) Тогда
Expand All @@ -649,7 +676,12 @@

КонецЦикла;

// Данные формы, прочитанные из файлов
КонецПроцедуры

Процедура ДобавитьДанныеФормыИзФайловВЗаписьДанныхMultipart(КонструкторЗаписиДанных)

ИмяПараметраРазделитель = ИмяПараметраРазделительДанныхMultipart;

Для Каждого ПрочитанныйФайл Из ПрочитанныеФайлы Цикл

ПередаваемыйФайл = ПрочитанныйФайл.ПередаваемыйФайл;
Expand All @@ -658,13 +690,19 @@
Продолжить;
КонецЕсли;

ContentDisposition = ОбщегоНазначения.НайтиВСоответствииПоКлючуБезУчетаРегистра(
ПередаваемыйФайл.Заголовки,
"Content-Disposition");
ContentDisposition = ?(ContentDisposition = Неопределено, "form-data", ContentDisposition);

КонструкторЗаписиДанных
.ДобавитьКомментарий(
"Начало %1", ПередаваемыйФайл.ИмяПоля)
.ДобавитьСтроку(
"ЗаписьДанных.ЗаписатьСтроку(""--"" + %1 + РазделительСтрок);", ИмяПараметраРазделитель)
.ДобавитьСтроку(
"ЗаписьДанных.ЗаписатьСтроку(""Content-Disposition: form-data; name=""""%1"""""" + РазделительСтрок);",
"ЗаписьДанных.ЗаписатьСтроку(""Content-Disposition: %1; name=""""%2"""""" + РазделительСтрок);",
ContentDisposition,
ПередаваемыйФайл.ИмяПоля);

Если ЗначениеЗаполнено(ПередаваемыйФайл.ТипMIME) Тогда
Expand All @@ -685,22 +723,33 @@

КонецЦикла;

// Файлы
КонецПроцедуры

Процедура ДобавитьФайлыВЗаписьДанныхMultipart(КонструкторЗаписиДанных)

ИмяПараметраРазделитель = ИмяПараметраРазделительДанныхMultipart;

Для Каждого ПередаваемыйФайл Из ОписаниеЗапроса.Файлы Цикл

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

ContentDisposition = ОбщегоНазначения.НайтиВСоответствииПоКлючуБезУчетаРегистра(
ПередаваемыйФайл.Заголовки,
"Content-Disposition");
ContentDisposition = ?(ContentDisposition = Неопределено, "form-data", ContentDisposition);

КонструкторЗаписиДанных
.ДобавитьКомментарий(
"Начало %1", ПередаваемыйФайл.ИмяПоля)
.ДобавитьСтроку(
"ЗаписьДанных.ЗаписатьСтроку(""--"" + %1 + РазделительСтрок);", ИмяПараметраРазделитель)
.ДобавитьСтроку(
"ЗаписьДанных.ЗаписатьСтроку(""Content-Disposition: form-data; name=""""%1""""; filename=""""%2"""""" + РазделительСтрок);",
ПередаваемыйФайл.ИмяПоля,
"ЗаписьДанных.ЗаписатьСтроку(""Content-Disposition: %1; name=""""%2""""; filename=""""%3"""""" + РазделительСтрок);",
ContentDisposition,
ПередаваемыйФайл.ИмяПоля,
ПередаваемыйФайл.ИмяФайла)
.ДобавитьСтроку(
"ЗаписьДанных.ЗаписатьСтроку(""Content-Type: %1"" + РазделительСтрок);",
Expand All @@ -718,31 +767,22 @@
"ЗаписьДанных.ЗаписатьСтроку(РазделительСтрок);")
.ДобавитьКомментарий(
"Конец %1", ПередаваемыйФайл.ИмяПоля);

КонецЦикла;

Если КонструкторЗаписиДанных.Пустой() Тогда
Возврат;
КонецЕсли;

Конструктор
.ДобавитьСтроку("Поток = %1.ПолучитьТелоКакПоток();", ИмяПараметраHTTPЗапрос)
.ДобавитьПустуюСтроку()
.ДобавитьСтроку("РазделительСтрок = Символы.ВК + Символы.ПС;")
.ДобавитьСтроку("ЗаписьДанных = Новый ЗаписьДанных(Поток, , , """", """");")
.ДобавитьСтроку(КонструкторЗаписиДанных.ПолучитьРезультат())
.ДобавитьСтроку("ЗаписьДанных.ЗаписатьСтроку(""--"" + %1 + ""--"" + РазделительСтрок);", ИмяПараметраРазделитель)
.ДобавитьСтроку("ЗаписьДанных.Закрыть();");

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

Процедура ДобавитьЗаголовкиВЗаписьДанныхMultipart(КонструкторЗаписиДанных, Заголовки)

Для Каждого Строка Из Заголовки Цикл
Для Каждого Заголовок Из Заголовки Цикл
Если НРег(Заголовок.Ключ) = "content-disposition" Тогда
Продолжить;
КонецЕсли;

КонструкторЗаписиДанных.ДобавитьСтроку(
"ЗаписьДанных.ЗаписатьСтроку(""%1: %2"" + РазделительСтрок);",
Строка.Ключ,
Строка.Значение)
Заголовок.Ключ,
Заголовок.Значение);
КонецЦикла;

КонецПроцедуры
Expand Down
59 changes: 38 additions & 21 deletions src/core/Классы/КонвертерКомандыCURL.os
Original file line number Diff line number Diff line change
Expand Up @@ -696,41 +696,60 @@
Процедура ПрочитатьForm()

МассивДанных = ЗначениеОпции("form"); // -f, --Form
Назначение = НазначенияПередаваемыхДанных.ТелоЗапроса;


Если МассивДанных.Количество() > 0 Тогда
ОписаниеЗапроса.ОтправлятьКакMultipartFormData = Истина;
КонецЕсли;

Для Каждого Данные Из МассивДанных Цикл
ОбработатьДанныеПоляФормы(Данные);
КонецЦикла;

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

Парсер = Новый ПарсерЗначенияОпцииForm();
ДанныеПоляФормы = Парсер.Распарсить(Данные);
Процедура ОбработатьДанныеПоляФормы(Данные)

Если ДанныеПоляФормы.Значение = Неопределено Тогда
ТекстОшибки = СтрШаблон("В опции -F (--form) некорректно указано значение: '%1'", Данные);
ИсходящиеОшибки.Добавить(ОбщегоНазначения.НоваяКритичнаяОшибка(ТекстОшибки));
Возврат;
КонецЕсли;
Назначение = НазначенияПередаваемыхДанных.ТелоЗапроса;
Парсер = Новый ПарсерЗначенияОпцииForm();
ДанныеПоляФормы = Парсер.Распарсить(Данные);

Если ДанныеПоляФормы.Значения.Количество() = 0 Тогда
ТекстОшибки = СтрШаблон("В опции -F (--form) некорректно указано значение: '%1'", Данные);
ИсходящиеОшибки.Добавить(ОбщегоНазначения.НоваяКритичнаяОшибка(ТекстОшибки));
Возврат;
КонецЕсли;

ЭтоФайл = Ложь;

ТипMIME = ДанныеПоляФормы.Параметры["type"];
ПервыйСимвол = Лев(ДанныеПоляФормы.Значение, 1);
ЭтоФайл = ПервыйСимвол = "@" Или ПервыйСимвол = "<";
Для Каждого ОписаниеЗначения Из ДанныеПоляФормы.Значения Цикл
ТипMIME = ОписаниеЗначения.Параметры["type"];
ПервыйСимвол = Лев(ОписаниеЗначения.Значение, 1);
ЕстьСимволОпределенияФайла = ПервыйСимвол = "@" Или ПервыйСимвол = "<";
ЭтоФайл = ЭтоФайл Или ЕстьСимволОпределенияФайла;

Если ЭтоФайл Тогда
ПолноеИмяФайла = Сред(ДанныеПоляФормы.Значение, 2);
Если ЕстьСимволОпределенияФайла Тогда
ПолноеИмяФайла = Сред(ОписаниеЗначения.Значение, 2);
Иначе
ПолноеИмяФайла = ОписаниеЗначения.Значение;
КонецЕсли;

ПередаваемыйЭлемент = Новый ПередаваемыйФайл(ПолноеИмяФайла, Назначение);
ПередаваемыйЭлемент.ПрочитатьСодержимое = ПервыйСимвол = "<";
ПередаваемыйЭлемент.ИмяПоля = ДанныеПоляФормы.ИмяПоля;
ПередаваемыйЭлемент.Заголовки = ОписаниеЗначения.Параметры["headers"];

ОписаниеЗапроса.Файлы.Добавить(ПередаваемыйЭлемент);

ИмяФайла = ДанныеПоляФормы.Параметры["filename"];
// ИмяФайла
ИмяФайла = ОписаниеЗначения.Параметры["filename"];
Если Не ИмяФайла = Неопределено Тогда
ПередаваемыйЭлемент.ИмяФайла = ИмяФайла;
Иначе
ПередаваемыйЭлемент.ИмяФайла = Новый Файл(ПолноеИмяФайла).Имя;
КонецЕсли;

// ТипMIME
Если Не ТипMIME = Неопределено Тогда
ПередаваемыйЭлемент.ТипMIME = ТипMIME;
ИначеЕсли Не ПередаваемыйЭлемент.ПрочитатьСодержимое Тогда
Expand All @@ -740,18 +759,16 @@
КонецЕсли;
КонецЕсли;
Иначе
ПередаваемыйЭлемент = Новый ПередаваемыйТекст(ДанныеПоляФормы.Значение, Назначение);

ПередаваемыйЭлемент = Новый ПередаваемыйТекст(ОписаниеЗначения.Значение, Назначение);
ПередаваемыйЭлемент.ИмяПоля = ДанныеПоляФормы.ИмяПоля;
ПередаваемыйЭлемент.Заголовки = ОписаниеЗначения.Параметры["headers"];

Если Не ТипMIME = Неопределено Тогда
ПередаваемыйЭлемент.ТипMIME = ТипMIME;
КонецЕсли;

ОписаниеЗапроса.ОтправляемыеТекстовыеДанные.Добавить(ПередаваемыйЭлемент);
ОписаниеЗапроса.ОтправляемыеТекстовыеДанные.Добавить(ПередаваемыйЭлемент);
КонецЕсли;

ПередаваемыйЭлемент.ИмяПоля = ДанныеПоляФормы.ИмяПоля;
ПередаваемыйЭлемент.Заголовки = ДанныеПоляФормы.Параметры["headers"];

КонецЦикла;

КонецПроцедуры
Expand Down
6 changes: 1 addition & 5 deletions src/internal/Классы/ОписаниеЗапроса.os
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,7 @@
Возврат Значение;
КонецЕсли;

Для Каждого КлючИЗначение Из Заголовки Цикл
Если НРег(КлючИЗначение.Ключ) = НРег(Имя) Тогда
Возврат КлючИЗначение.Значение;
КонецЕсли;
КонецЦикла;
Возврат ОбщегоНазначения.НайтиВСоответствииПоКлючуБезУчетаРегистра(Заголовки, Имя);

КонецФункции

Expand Down
Loading

0 comments on commit 90f2018

Please sign in to comment.