diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\263\320\276\320\232\320\276\320\264\320\2601\320\241.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\263\320\276\320\232\320\276\320\264\320\2601\320\241.os" index 4c2d076..7be1a9d 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\263\320\276\320\232\320\276\320\264\320\2601\320\241.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\263\320\276\320\232\320\276\320\264\320\2601\320\241.os" @@ -323,14 +323,21 @@ ПрочитанныеФайлы.Очистить(); + ТребуетсяПрочитатьФайлыТелаЗапроса = ТребуетсяПрочитатьФайлыТелаЗапроса(); + НомерФайла = 1; Для Каждого ПередаваемыйФайл Из ОписаниеЗапроса.Файлы Цикл Если Не (ПередаваемыйФайл.ПрочитатьСодержимое - Или ПередаваемыйФайл.Назначение = НазначенияПередаваемыхДанных.СтрокаЗапроса) Тогда + Или ПередаваемыйФайл.Назначение = НазначенияПередаваемыхДанных.СтрокаЗапроса) Тогда Продолжить; КонецЕсли; + Если ПередаваемыйФайл.Назначение = НазначенияПередаваемыхДанных.ТелоЗапроса + И Не ТребуетсяПрочитатьФайлыТелаЗапроса Тогда + Продолжить; + КонецЕсли; + ИмяПеременной = "ТекстовыеДанныеИзФайла_" + Формат(НомерФайла, "ЧГ="); Конструктор.ДобавитьПустуюСтроку(); @@ -589,9 +596,9 @@ ЭтоПервыйФайл = Истина; Для Каждого ПередаваемыйФайл Из Файлы Цикл - Если ПередаваемыйФайл.ПрочитатьСодержимое - Или ПередаваемыйФайл.ОтправлятьОтдельно - Или Не ПередаваемыйФайл.Назначение = НазначенияПередаваемыхДанных.ТелоЗапроса Тогда + Если ПередаваемыйФайл.ОтправлятьОтдельно + Или Не ПередаваемыйФайл.Назначение = НазначенияПередаваемыхДанных.ТелоЗапроса + Или ПередаваемыйФайлПрочитан(ПередаваемыйФайл) Тогда Продолжить; КонецЕсли; @@ -740,4 +747,40 @@ Возврат URL; КонецФункции +Функция ПередаваемыйФайлПрочитан(ПередаваемыйФайл) + + Если Не ПередаваемыйФайл.ПрочитатьСодержимое Тогда + Возврат Ложь; + КонецЕсли; + + Для Каждого ПрочитанныйФайл Из ПрочитанныеФайлы Цикл + Если ПрочитанныйФайл.ПередаваемыйФайл = ПередаваемыйФайл Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция ТребуетсяПрочитатьФайлыТелаЗапроса() + + КоличествоФайлов = 0; + Для Каждого ПередаваемыйФайл Из ОписаниеЗапроса.Файлы Цикл + Если ПередаваемыйФайл.ПрочитатьСодержимое + И ПередаваемыйФайл.Назначение = НазначенияПередаваемыхДанных.ТелоЗапроса Тогда + КоличествоФайлов = КоличествоФайлов + 1; + КонецЕсли; + КонецЦикла; + + ЕстьОтправляемыеТекстовыеДанные = ОписаниеЗапроса.ОтправляемыеТекстовыеДанные.Количество() > 0; + Если КоличествоФайлов <= 1 + И Не ЕстьОтправляемыеТекстовыеДанные Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL.os" index ff5b0ff..35cc8e3 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213CURL.os" @@ -459,13 +459,16 @@ МассивДанных = ЗначениеОпции(Команда, "data-binary"); Назначение = НазначениеПередаваемыхДанныхPOST(Команда); - Для Каждого ИмяФайла Из МассивДанных Цикл - Если Лев(ИмяФайла, 1) = "@" Тогда - ИмяФайла = Сред(ИмяФайла, 2); + Для Каждого Данные Из МассивДанных Цикл + Если Лев(Данные, 1) = "@" Тогда + ИмяФайла = Сред(Данные, 2); + ПередаваемыйФайл = Новый ПередаваемыйФайл(ИмяФайла, Назначение); + ПередаваемыйФайл.ПрочитатьСодержимое = Истина; + ОписаниеЗапроса.Файлы.Добавить(ПередаваемыйФайл); + Иначе + ПередаваемыйТекст = Новый ПередаваемыйТекст(Данные, Назначение); + ОписаниеЗапроса.ОтправляемыеТекстовыеДанные.Добавить(ПередаваемыйТекст); КонецЕсли; - - ПередаваемыйФайл = Новый ПередаваемыйФайл(ИмяФайла, Назначение); - ОписаниеЗапроса.Файлы.Добавить(ПередаваемыйФайл); КонецЦикла; КонецПроцедуры diff --git "a/tests/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\263\320\276\320\232\320\276\320\264\320\2601\320\241_test.os" "b/tests/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\263\320\276\320\232\320\276\320\264\320\2601\320\241_test.os" index 03b58fd..ae7802d 100644 --- "a/tests/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\263\320\276\320\232\320\276\320\264\320\2601\320\241_test.os" +++ "b/tests/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\263\320\276\320\232\320\276\320\264\320\2601\320\241_test.os" @@ -97,7 +97,9 @@ | --data 'param3=value3' \ | --data @path-to-file1 \ | --data @path-to-file2 \ - | --data-raw '@at@at@'"; + | --data-raw '@at@at@' \ + | --data-binary @path-to-file3 \ + | --data-binary 'param4=value4'"; ПрограммныйКод = "Заголовки = Новый Соответствие(); |Заголовки.Вставить(""Content-Type"", ""application/x-www-form-urlencoded""); @@ -114,9 +116,14 @@ |ТекстовыеДанныеИзФайла_2 = СтрЗаменить(ТекстовыеДанныеИзФайла_2, Символы.ПС, """"); |ТекстовыеДанныеИзФайла_2 = СтрЗаменить(ТекстовыеДанныеИзФайла_2, Символы.ВК, """"); | - |ТелоЗапроса = ""param1=value1&парам2=значение2¶m3=value3&@at@at@"" + |ТекстовыйДокумент = Новый ТекстовыйДокумент(); + |ТекстовыйДокумент.Прочитать(""path-to-file3""); + |ТекстовыеДанныеИзФайла_3 = ТекстовыйДокумент.ПолучитьТекст(); + | + |ТелоЗапроса = ""param1=value1&парам2=значение2¶m3=value3&@at@at@¶m4=value4"" | + ""&"" + ТекстовыеДанныеИзФайла_1 - | + ""&"" + ТекстовыеДанныеИзФайла_2; + | + ""&"" + ТекстовыеДанныеИзФайла_2 + | + ""&"" + ТекстовыеДанныеИзФайла_3; | |Соединение = Новый HTTPСоединение(""example.com"", 80); |HTTPЗапрос = Новый HTTPЗапрос(""/"", Заголовки); @@ -172,7 +179,28 @@ КонецПроцедуры &Тест -Процедура ТестДолжен_ПроверитьПередачуДвоичныхДанныхDataBinary() Экспорт +Процедура ТестДолжен_ПроверитьПередачуОдногоФайлаИзDataBinary() Экспорт + + КонсольнаяКоманда = "curl http://example.com --data-binary @path-to-file1"; + + ПрограммныйКод = "Заголовки = Новый Соответствие(); + |Заголовки.Вставить(""Content-Type"", ""application/x-www-form-urlencoded""); + | + |Соединение = Новый HTTPСоединение(""example.com"", 80); + |HTTPЗапрос = Новый HTTPЗапрос(""/"", Заголовки); + |HTTPЗапрос.УстановитьИмяФайлаТела(""path-to-file1""); + | + |HTTPОтвет = Соединение.ВызватьHTTPМетод(""POST"", HTTPЗапрос);"; + + КонвертерКомандыCURL = Новый КонвертерКомандыCURL(); + Результат = КонвертерКомандыCURL.Конвертировать(КонсольнаяКоманда, Новый ГенераторПрограммногоКода1С()); + + Ожидаем.Что(Результат).Равно(ПрограммныйКод); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПроверитьПередачуДвухФайловИзDataBinary() Экспорт КонсольнаяКоманда = "curl http://example.com \ | --data-binary @path-to-file1 \ @@ -181,10 +209,20 @@ ПрограммныйКод = "Заголовки = Новый Соответствие(); |Заголовки.Вставить(""Content-Type"", ""application/x-www-form-urlencoded""); | + |ТекстовыйДокумент = Новый ТекстовыйДокумент(); + |ТекстовыйДокумент.Прочитать(""path-to-file1""); + |ТекстовыеДанныеИзФайла_1 = ТекстовыйДокумент.ПолучитьТекст(); + | + |ТекстовыйДокумент = Новый ТекстовыйДокумент(); + |ТекстовыйДокумент.Прочитать(""path-to-file2""); + |ТекстовыеДанныеИзФайла_2 = ТекстовыйДокумент.ПолучитьТекст(); + | + |ТелоЗапроса = ТекстовыеДанныеИзФайла_1 + | + ""&"" + ТекстовыеДанныеИзФайла_2; + | |Соединение = Новый HTTPСоединение(""example.com"", 80); |HTTPЗапрос = Новый HTTPЗапрос(""/"", Заголовки); - |HTTPЗапрос.УстановитьИмяФайлаТела(""path-to-file1""); - |// HTTPЗапрос.УстановитьИмяФайлаТела(""path-to-file2""); + |HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); | |HTTPОтвет = Соединение.ВызватьHTTPМетод(""POST"", HTTPЗапрос);";