From ecf9a414dc3e17dc0a24696c7c5f464126827a27 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sun, 26 Jan 2025 21:41:40 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9F=D0=BE=D0=B4=D0=B4=D1=80=D0=B5?= =?UTF-8?q?=D1=80=D0=B6=D0=BA=D0=B0=20=D0=BE=D0=BF=D1=86=D0=B8=D0=B8=20--c?= =?UTF-8?q?reate-dirs=20(#45)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\232\320\276\320\264\320\2601\320\241.os" | 26 ++++++ ...74\320\260\320\275\320\264\321\213CURL.os" | 11 ++- ...20\277\321\200\320\276\321\201\320\260.os" | 2 + ...21\207\320\265\320\275\320\270\321\217.os" | 29 +++++-- ...\320\276\320\264\320\2601\320\241_test.os" | 80 ++++++++++++++++--- 5 files changed, 131 insertions(+), 17 deletions(-) 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 875baf9..17e4f06 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" @@ -92,6 +92,7 @@ |o |output |output-dir + |create-dirs |O |remote-name |remote-name-all @@ -483,6 +484,8 @@ Процедура ДобавитьВызовHTTPМетода(ОписаниеРесурса) + ДобавитьСозданиеКаталога(ОписаниеРесурса); + ПараметрыФункции = Новый Массив; ПараметрыФункции.Добавить(Конструктор.ПараметрВСтроку(ОписаниеРесурса.Метод)); ПараметрыФункции.Добавить(ИмяПараметраHTTPЗапрос); @@ -499,6 +502,29 @@ КонецПроцедуры +Процедура ДобавитьСозданиеКаталога(ОписаниеРесурса) + + Если Не ЗначениеЗаполнено(ОписаниеРесурса.ИмяВыходногоФайла) + Или Не ОписаниеЗапроса.СоздатьКаталогСохраненияФайлов Тогда + Возврат; + КонецЕсли; + + Каталог = ОбщегоНазначения.КаталогФайла(ОписаниеРесурса.ИмяВыходногоФайла); + + Если Не ПустаяСтрока(Каталог) Тогда + ШаблонСозданияКаталога = "// Создание каталога по необходимости + |Каталог = Новый Файл(""%1""); + |Если Не Каталог.Существует() Тогда + | СоздатьКаталог(Каталог.ПолноеИмя); + |КонецЕсли;"; + + Конструктор + .ДобавитьПустуюСтроку() + .ДобавитьСтроку(ШаблонСозданияКаталога, Каталог); + КонецЕсли; + +КонецПроцедуры + Процедура ДобавитьУстановкуТелаЗапроса(ОписаниеРесурса) ДобавитьУстановкуТелаЗапросаТекстовымиДанными(); 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 5f5191d..2d468eb 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" @@ -865,11 +865,15 @@ КонецПроцедуры Процедура ПрочитатьКаталогСохраненияФайлов() - КаталогСохраненияФайлов = ""; + + КаталогСохраненияФайлов = ""; Каталог = ПоследнееЗначениеОпции("output-dir"); Если Не Каталог = Неопределено Тогда КаталогСохраненияФайлов = Каталог; КонецЕсли; + + ОписаниеЗапроса.СоздатьКаталогСохраненияФайлов = УстановленФлагОпции("create-dirs"); + КонецПроцедуры Процедура ПрочитатьАдресПрокси() @@ -1068,6 +1072,10 @@ "output-dir", "Каталог сохранения файлов").ТМассивСтрок(); + ДобавитьПоддерживаемуюОпцию( + "create-dirs", + "Создает каталог сохранения файла при необходимости").ТМассивБулево(); + ДобавитьПоддерживаемуюОпцию( "O remote-name", "Извлечение имени выходного файла из URL").ТМассивБулево(); @@ -1184,7 +1192,6 @@ ДобавитьНеподдерживаемуюОпцию("C continue-at").ТМассивСтрок(); ДобавитьНеподдерживаемуюОпцию("b cookie").ТМассивСтрок(); ДобавитьНеподдерживаемуюОпцию("c cookie-jar").ТМассивСтрок(); - ДобавитьНеподдерживаемуюОпцию("create-dirs").ТМассивБулево(); ДобавитьНеподдерживаемуюОпцию("create-file-mode").ТМассивСтрок(); ДобавитьНеподдерживаемуюОпцию("crlf").ТМассивБулево(); ДобавитьНеподдерживаемуюОпцию("crlfile").ТМассивСтрок(); diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\227\320\260\320\277\321\200\320\276\321\201\320\260.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\227\320\260\320\277\321\200\320\276\321\201\320\260.os" index 5a3d382..d3b20cb 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\227\320\260\320\277\321\200\320\276\321\201\320\260.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\227\320\260\320\277\321\200\320\276\321\201\320\260.os" @@ -30,6 +30,7 @@ Перем ОтправлятьКакMultipartFormData Экспорт; // Булево Перем AWS4 Экспорт; // Структура Перем ТокенBearer Экспорт; // Строка +Перем СоздатьКаталогСохраненияФайлов Экспорт; // Булево // Максимальное время ожидания на выполнение запроса Перем Таймаут Экспорт; // Число @@ -110,6 +111,7 @@ ОтправлятьКакMultipartFormData = Ложь; AWS4 = НовыйAWS4(); ТокенBearer = ""; + СоздатьКаталогСохраненияФайлов = Ложь; КонецПроцедуры Функция ЕстьДанныеПоНазначению(Назначение) Экспорт diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217.os" index 0bece85..b239d21 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217.os" @@ -7,17 +7,36 @@ КонецПроцедуры Функция ДобавитьКонечныйРазделительПути(Знач ПутьКаталога) Экспорт + Если ПустаяСтрока(ПутьКаталога) Тогда Возврат ПутьКаталога; КонецЕсли; + + ПоследнийСимвол = Прав(ПутьКаталога, 1); + + Если ПоследнийСимвол = "/" Или ПоследнийСимвол = "\" Тогда + Возврат ПутьКаталога; + КонецЕсли; + + Разделитель = ?(СтрНайти(ПутьКаталога, "\"), "\", "/"); - ДобавляемыйСимвол = ПолучитьРазделительПути(); + Возврат ПутьКаталога + Разделитель; + +КонецФункции + +Функция КаталогФайла(ПутьКФайлу) Экспорт + + ИндексРазделителя1 = СтрНайти(ПутьКФайлу, "\", НаправлениеПоиска.СКонца); + ИндексРазделителя2 = СтрНайти(ПутьКФайлу, "/", НаправлениеПоиска.СКонца); + + ИндексРазделителя = Макс(ИндексРазделителя1, ИндексРазделителя2); - Если СтрЗаканчиваетсяНа(ПутьКаталога, ДобавляемыйСимвол) Тогда - Возврат ПутьКаталога; - Иначе - Возврат ПутьКаталога + ДобавляемыйСимвол; + Если ИндексРазделителя Тогда + Возврат Сред(ПутьКФайлу, 1, ИндексРазделителя - 1); КонецЕсли; + + Возврат ""; + КонецФункции Функция ДополнитьИменемФайлаПутьURL(ПолноеИмяФайла, ПутьURL) Экспорт 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 db5da52..644476e 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" @@ -917,16 +917,12 @@ &Тест Процедура ТестДолжен_ПроверитьКаталогСохраненияФайловИПереданноеИмяФайла() Экспорт - КаталогСохраненияОС = СтрЗаменить("/some/path", "/", ПолучитьРазделительПути()); - - КонсольнаяКоманда = "curl http://example.com/about.html -o file.html --output-dir '/some/path'"; - КонсольнаяКоманда = СтрЗаменить(КонсольнаяКоманда, "/some/path", КаталогСохраненияОС); + КонсольнаяКоманда = "curl http://example.com/about.html -o file.html --output-dir '/some/path/'"; ПрограммныйКод = "Соединение = Новый HTTPСоединение(""example.com"", 80); |HTTPЗапрос = Новый HTTPЗапрос(""/about.html""); | |HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос, ""/some/path/file.html"");"; - ПрограммныйКод = СтрЗаменить(ПрограммныйКод, "/some/path/", КаталогСохраненияОС + ПолучитьРазделительПути()); ПроверитьКонвертациюБезОшибок(КонсольнаяКоманда, ПрограммныйКод); @@ -935,21 +931,85 @@ &Тест Процедура ТестДолжен_ПроверитьКаталогСохраненияФайловИИзвлеченноеИмяФайлаИзURL() Экспорт - КаталогСохраненияОС = СтрЗаменить("/some/path", "/", ПолучитьРазделительПути()); - - КонсольнаяКоманда = "curl http://example.com/about.html -O --output-dir '/some/path'"; - КонсольнаяКоманда = СтрЗаменить(КонсольнаяКоманда, "/some/path", КаталогСохраненияОС); + КонсольнаяКоманда = "curl http://example.com/about.html -O --output-dir '/some/path/'"; ПрограммныйКод = "Соединение = Новый HTTPСоединение(""example.com"", 80); |HTTPЗапрос = Новый HTTPЗапрос(""/about.html""); | |HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос, ""/some/path/about.html"");"; - ПрограммныйКод = СтрЗаменить(ПрограммныйКод, "/some/path/", КаталогСохраненияОС + ПолучитьРазделительПути()); ПроверитьКонвертациюБезОшибок(КонсольнаяКоманда, ПрограммныйКод); КонецПроцедуры +&Тест +Процедура ТестДолжен_ПроверитьСозданиеКаталогСохраненияФайлов() Экспорт + + КонсольнаяКоманда = "curl http://example.com/about.html -o file.html --output-dir '/some/path/' --create-dirs + |curl http://example.com/about.html -O --output-dir '/some/path/' --create-dirs + |curl http://example.com/about.html -o '/some/path/file.html' --create-dirs + |curl http://example.com/about.html -o '/some/path\file.html' --create-dirs"; + + ПрограммныйКод = "////////////////////////////////////////////// + |// Команда #1. + | + |Соединение = Новый HTTPСоединение(""example.com"", 80); + |HTTPЗапрос = Новый HTTPЗапрос(""/about.html""); + | + |// Создание каталога по необходимости + |Каталог = Новый Файл(""/some/path""); + |Если Не Каталог.Существует() Тогда + | СоздатьКаталог(Каталог.ПолноеИмя); + |КонецЕсли; + | + |HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос, ""/some/path/file.html""); + | + |////////////////////////////////////////////// + |// Команда #2. + | + |Соединение = Новый HTTPСоединение(""example.com"", 80); + |HTTPЗапрос = Новый HTTPЗапрос(""/about.html""); + | + |// Создание каталога по необходимости + |Каталог = Новый Файл(""/some/path""); + |Если Не Каталог.Существует() Тогда + | СоздатьКаталог(Каталог.ПолноеИмя); + |КонецЕсли; + | + |HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос, ""/some/path/about.html""); + | + |////////////////////////////////////////////// + |// Команда #3. + | + |Соединение = Новый HTTPСоединение(""example.com"", 80); + |HTTPЗапрос = Новый HTTPЗапрос(""/about.html""); + | + |// Создание каталога по необходимости + |Каталог = Новый Файл(""/some/path""); + |Если Не Каталог.Существует() Тогда + | СоздатьКаталог(Каталог.ПолноеИмя); + |КонецЕсли; + | + |HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос, ""/some/path/file.html""); + | + |////////////////////////////////////////////// + |// Команда #4. + | + |Соединение = Новый HTTPСоединение(""example.com"", 80); + |HTTPЗапрос = Новый HTTPЗапрос(""/about.html""); + | + |// Создание каталога по необходимости + |Каталог = Новый Файл(""/some/path""); + |Если Не Каталог.Существует() Тогда + | СоздатьКаталог(Каталог.ПолноеИмя); + |КонецЕсли; + | + |HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос, ""/some/path\file.html"");"; + + ПроверитьКонвертациюБезОшибок(КонсольнаяКоманда, ПрограммныйКод); + +КонецПроцедуры + &Тест Процедура ТестДолжен_ПроверитьПрокси() Экспорт