Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Поддержка в опции -F, --form перечисления файлов #184

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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