1
0
mirror of https://github.com/alei1180/curlone.git synced 2025-11-25 23:01:55 +02:00

Merge pull request #177 from Stivo182/fix/176-empty-value

Исправление парсинга аргументов команды с пустым значением
This commit is contained in:
Dmitry Ivanov
2025-02-22 01:49:21 +03:00
committed by GitHub
5 changed files with 163 additions and 51 deletions

View File

@@ -49,11 +49,6 @@
КонецЕсли;
Если ПустаяСтрока(Аргументы[0]) Тогда
Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяАргумент(Аргумент.Имя);
Возврат Результат;
КонецЕсли;
Если НЕ КонтекстПоиска.СбросОпций И СтрНачинаетсяС(Аргументы[0], "-") И НЕ Аргументы[0] = "-" Тогда
Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяАргументВместоОпции(Аргумент.Имя, Аргументы[0]);
Возврат Результат;

View File

@@ -1534,8 +1534,18 @@
Если ОписаниеЗапроса.АдресаРесурсов.Количество() = 0 Тогда
ИсходящиеОшибки.Добавить(ОбщегоНазначения.НоваяКритичнаяОшибка("Не указан URL"));
Возврат;
КонецЕсли;
ПорядковыйНомер = 0;
Для Каждого ОписаниеРесурса Из ОписаниеЗапроса.АдресаРесурсов Цикл
ПорядковыйНомер = ПорядковыйНомер + 1;
Если Не ЗначениеЗаполнено(ОписаниеРесурса.URL) Тогда
ТекстОшибки = СтрШаблон("Не указан URL #%1", ПорядковыйНомер);
ИсходящиеОшибки.Добавить(ОбщегоНазначения.НоваяКритичнаяОшибка(ТекстОшибки));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьПоддержкуПротокола(ОписаниеЗапроса, ПоддерживаемыеПротоколы)

View File

@@ -82,10 +82,16 @@
Если Не Токен = Неопределено И Токен.ТипТокена() = "ОператорСвязыванияКоманд" Тогда
Возврат;
КонецЕсли;
ДобавитьАргумент();
ДобавитьНовуюКоманду();
КонецЕсли;
Если Не Токен = Неопределено И Не ОткрытаКавычка() И ЭтоРазделительАргументов(Токен) Тогда
НеобходимоПропуститьПробельныеСимволы = Не Токен = Неопределено
И Не ОткрытаКавычка()
И ЭтоРазделительАргументов(Токен);
Если НеобходимоПропуститьПробельныеСимволы Тогда
ДобавитьАргумент();
Токен = ПропуститьПробелыИПереносСтроки();
КонецЕсли;
@@ -96,11 +102,7 @@
ПромотатьЗначениеПараметра();
КонецЕсли;
Аргумент = ПолучитьНакопительнуюСтроку();
Если СтрДлина(Аргумент) > 0 Тогда
ДобавитьАргумент(Аргумент);
КонецЕсли;
ДобавитьАргумент();
КонецПроцедуры
@@ -127,6 +129,9 @@
Пока Токенайзер.ЕстьЕщеТокены() Цикл
Токен = ПолучитьСледующийТокен();
Если Токен = Неопределено Тогда
Возврат Токен;
КонецЕсли;
Если КавычкаБылаОткрыта <> ОткрытаКавычка()
Или КавычкаБылаОткрыта
@@ -166,10 +171,16 @@
Пока Токенайзер.ЕстьЕщеТокены() Цикл
Токен = ПолучитьСледующийТокен();
Если Токен = Неопределено Тогда
Возврат Токен;
КонецЕсли;
Если Не Токен.ТипТокена() = "ПробельныйСимвол" Тогда
Возврат Токен;
КонецЕсли;
ДобавитьАргумент();
КонецЦикла;
КонецФункции
@@ -217,29 +228,21 @@
Если Токен.ТипТокена() = "КавычкаБезПоддержкиИнтерполяции" И Не ОткрытаКавычкаСПоддержкойИнтерполяции Тогда
Если Не ЭкранироватьСимвол Тогда
ОткрытаКавычкаБезПоддержкиИнтерполяции = Не ОткрытаКавычкаБезПоддержкиИнтерполяции;
ОткрытаКавычкаДоПолученияТокена = ОткрытаКавычкаБезПоддержкиИнтерполяции;
Токен = ПолучитьСледующийТокен();
Если ОткрытаКавычкаДоПолученияТокена И Не ОткрытаКавычкаБезПоддержкиИнтерполяции Тогда
ДобавитьАргумент("");
Если ОткрытаКавычкаБезПоддержкиИнтерполяции Тогда
ДополнитьНакопительнуюСтроку("");
КонецЕсли;
Возврат Токен;
ОткрытаКавычкаБезПоддержкиИнтерполяции = Не ОткрытаКавычкаБезПоддержкиИнтерполяции;
Возврат ПолучитьСледующийТокен();
КонецЕсли;
КонецЕсли;
Если Токен.ТипТокена() = "КавычкаСПоддержкойИнтерполяции" И Не ОткрытаКавычкаБезПоддержкиИнтерполяции Тогда
Если Не ЭкранироватьСимвол Тогда
ОткрытаКавычкаСПоддержкойИнтерполяции = Не ОткрытаКавычкаСПоддержкойИнтерполяции;
ОткрытаКавычкаДоПолученияТокена = ОткрытаКавычкаСПоддержкойИнтерполяции;
Токен = ПолучитьСледующийТокен();
Если ОткрытаКавычкаДоПолученияТокена И Не ОткрытаКавычкаСПоддержкойИнтерполяции Тогда
ДобавитьАргумент("");
Если ОткрытаКавычкаСПоддержкойИнтерполяции Тогда
ДополнитьНакопительнуюСтроку("");
КонецЕсли;
Возврат Токен;
ОткрытаКавычкаСПоддержкойИнтерполяции = Не ОткрытаКавычкаСПоддержкойИнтерполяции;
Возврат ПолучитьСледующийТокен();
КонецЕсли;
КонецЕсли;
@@ -261,14 +264,30 @@
КонецПроцедуры
Процедура ДополнитьНакопительнуюСтроку(Значение)
Если НакопленнаяСтрока = Неопределено Тогда
НакопленнаяСтрока = "";
КонецЕсли;
НакопленнаяСтрока = НакопленнаяСтрока + Значение;
КонецПроцедуры
Процедура ДобавитьАргумент(Значение)
Процедура ДобавитьАргумент()
Значение = НакопленнаяСтрока;
Если Значение = Неопределено Тогда
Возврат;
КонецЕсли;
Если АргументыКоманд.Количество() = 0 Тогда
ДобавитьНовуюКоманду();
КонецЕсли;
АргументыКоманд[АргументыКоманд.ВГраница()].Добавить(Значение);
ОчиститьНакопительнуюСтроку();
КонецПроцедуры
Процедура ДобавитьНовуюКоманду()
@@ -285,16 +304,9 @@
КонецПроцедуры
Процедура ОчиститьНакопительнуюСтроку()
НакопленнаяСтрока = "";
НакопленнаяСтрока = Неопределено;
КонецПроцедуры
Функция ПолучитьНакопительнуюСтроку()
Результат = НакопленнаяСтрока;
ОчиститьНакопительнуюСтроку();
Возврат Результат;
КонецФункции
Функция ОткрытаКавычка()
Возврат ОткрытаКавычкаБезПоддержкиИнтерполяции Или ОткрытаКавычкаСПоддержкойИнтерполяции;
КонецФункции

View File

@@ -95,6 +95,22 @@
КонецПроцедуры
&Тест
Процедура ТестДолжен_ПроверитьОшибкуНеУказанОдинИзURL() Экспорт
КонсольнаяКоманда = "curl example1.com '' example2.com";
Ошибки = Неопределено;
Результат = КонвертерКомандыCURL.Конвертировать(КонсольнаяКоманда,, Ошибки);
Ожидаем.Что(Результат).Не_().Заполнено();
Ожидаем.Что(Ошибки).Заполнено();
Ожидаем.Что(Ошибки[0].Текст).Равно("Не указан URL #2");
Ожидаем.Что(Ошибки[0].Критичная).ЭтоИстина();
КонецПроцедуры
&Тест
Процедура ТестДолжен_ПроверитьОшибкуНеУдалосьПолучитьНомерПортаИзURL() Экспорт

View File

@@ -219,23 +219,102 @@
&Тест
Процедура ТестДолжен_ПроверитьПоддержкуПустогоЗначения() Экспорт
КоманднаяСтрока = "myapp -a '' -b ' '";
КоманднаяСтрока = "myapp1 -a '' -b ' '
|myapp2 url ''
|myapp3 url """"
|myapp4 url''
|myapp5 url""""
|myapp6 url '' -f
|myapp7 url """" -f
|myapp8 url''''
|myapp9 url""""""""
|myapp10 url '' '' ''
|myapp11 url """" """"";
Эталон = Новый Массив;
Эталон.Добавить("myapp");
Эталон.Добавить("-a");
Эталон.Добавить("");
Эталон.Добавить("-b");
Эталон.Добавить(" ");
Команда = Новый Массив;
Команда.Добавить("myapp1");
Команда.Добавить("-a");
Команда.Добавить("");
Команда.Добавить("-b");
Команда.Добавить(" ");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp2");
Команда.Добавить("url");
Команда.Добавить("");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp3");
Команда.Добавить("url");
Команда.Добавить("");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp4");
Команда.Добавить("url");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp5");
Команда.Добавить("url");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp6");
Команда.Добавить("url");
Команда.Добавить("");
Команда.Добавить("-f");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp7");
Команда.Добавить("url");
Команда.Добавить("");
Команда.Добавить("-f");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp8");
Команда.Добавить("url");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp9");
Команда.Добавить("url");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp10");
Команда.Добавить("url");
Команда.Добавить("");
Команда.Добавить("");
Команда.Добавить("");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp11");
Команда.Добавить("url");
Команда.Добавить("");
Команда.Добавить("");
Эталон.Добавить(Команда);
Парсер = Новый ПарсерКонсольнойКоманды();
Результат = Парсер.Распарсить(КоманднаяСтрока);
Ожидаем.Что(Результат).ИмеетДлину(1);
Ожидаем.Что(Результат[0]).ИмеетДлину(Эталон.Количество());
Ожидаем.Что(Результат).ИмеетДлину(Эталон.Количество());
Для Инд = 0 По Результат[0].ВГраница() Цикл
Ожидаем.Что(Результат[0][Инд]).Равно(Эталон[Инд]);
Для Инд1 = 0 По Результат.ВГраница() Цикл
Заголовок = СтрШаблон("Команда: %1", Инд1 + 1);
Ожидаем.Что(Результат[Инд1], Заголовок).ИмеетДлину(Эталон[Инд1].Количество());
Для Инд2 = 0 По Результат[Инд1].ВГраница() Цикл
Заголовок = СтрШаблон("Команда: %1, аргумент: %2", Инд1 + 1, Инд2 + 1);
Ожидаем.Что(Результат[Инд1][Инд2], Заголовок).Равно(Эталон[Инд1][Инд2]);
КонецЦикла;
КонецЦикла;
КонецПроцедуры