1
0
mirror of https://github.com/alei1180/curlone.git synced 2025-11-24 22:53:34 +02:00

feat: Поддрержка опции --create-dirs (#45)

This commit is contained in:
Dmitry Ivanov
2025-01-26 21:41:40 +03:00
parent d658cab774
commit ecf9a414dc
5 changed files with 132 additions and 18 deletions

View File

@@ -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"");
|Если Не Каталог.Существует() Тогда
| СоздатьКаталог(Каталог.ПолноеИмя);
|КонецЕсли;";
Конструктор
.ДобавитьПустуюСтроку()
.ДобавитьСтроку(ШаблонСозданияКаталога, Каталог);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьУстановкуТелаЗапроса(ОписаниеРесурса)
ДобавитьУстановкуТелаЗапросаТекстовымиДанными();

View File

@@ -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").ТМассивСтрок();

View File

@@ -30,6 +30,7 @@
Перем ОтправлятьКакMultipartFormData Экспорт; // Булево
Перем AWS4 Экспорт; // Структура
Перем ТокенBearer Экспорт; // Строка
Перем СоздатьКаталогСохраненияФайлов Экспорт; // Булево
// Максимальное время ожидания на выполнение запроса
Перем Таймаут Экспорт; // Число
@@ -110,6 +111,7 @@
ОтправлятьКакMultipartFormData = Ложь;
AWS4 = НовыйAWS4();
ТокенBearer = "";
СоздатьКаталогСохраненияФайлов = Ложь;
КонецПроцедуры
Функция ЕстьДанныеПоНазначению(Назначение) Экспорт

View File

@@ -7,17 +7,36 @@
КонецПроцедуры
Функция ДобавитьКонечныйРазделительПути(Знач ПутьКаталога) Экспорт
Если ПустаяСтрока(ПутьКаталога) Тогда
Возврат ПутьКаталога;
КонецЕсли;
ДобавляемыйСимвол = ПолучитьРазделительПути();
Если СтрЗаканчиваетсяНа(ПутьКаталога, ДобавляемыйСимвол) Тогда
ПоследнийСимвол = Прав(ПутьКаталога, 1);
Если ПоследнийСимвол = "/" Или ПоследнийСимвол = "\" Тогда
Возврат ПутьКаталога;
Иначе
Возврат ПутьКаталога + ДобавляемыйСимвол;
КонецЕсли;
Разделитель = ?(СтрНайти(ПутьКаталога, "\"), "\", "/");
Возврат ПутьКаталога + Разделитель;
КонецФункции
Функция КаталогФайла(ПутьКФайлу) Экспорт
ИндексРазделителя1 = СтрНайти(ПутьКФайлу, "\", НаправлениеПоиска.СКонца);
ИндексРазделителя2 = СтрНайти(ПутьКФайлу, "/", НаправлениеПоиска.СКонца);
ИндексРазделителя = Макс(ИндексРазделителя1, ИндексРазделителя2);
Если ИндексРазделителя Тогда
Возврат Сред(ПутьКФайлу, 1, ИндексРазделителя - 1);
КонецЕсли;
Возврат "";
КонецФункции
Функция ДополнитьИменемФайлаПутьURL(ПолноеИмяФайла, ПутьURL) Экспорт

View File

@@ -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"");";
ПроверитьКонвертациюБезОшибок(КонсольнаяКоманда, ПрограммныйКод);
КонецПроцедуры
&Тест
Процедура ТестДолжен_ПроверитьПрокси() Экспорт